/// <summary>
        /// Получить отчет по значениям тегов
        /// </summary>
        public string GetTagsReport(DSRouterTagsReportSettings reportSettings)
        {
            string result = null;

            try
            {
                string reportName = "Отчет " + DateTime.Now.ToShortDateString();

                if (SaveTagsReport(DEFAULT_PATH_TO_DIRECTORY_TO_SHARE_FILES, reportName, reportSettings) == null)
                    return null;

                result = DEFAULT_URL_TO_DIRECTORY_TO_SHARE_FILES + reportName + reportSettings.ReportExtension;
            }
            catch (Exception ex)
            {
                Log.WriteErrorMessage("DSRouterService.GetTagsReport() : Исключение : " + ex.Message);
            }

            return result;
        }
        /// <summary>
        /// Получить отчет по значениям тегов
        /// </summary>
        public byte[] GetTagsReportAsByteArray(DSRouterTagsReportSettings reportSettings)
        {
            byte[] result = null;

            try
            {
                string reportName = "Отчет " + DateTime.Now.ToShortDateString();

                var pathToReport = SaveTagsReport(Path.GetTempPath(), reportName, reportSettings);
                if (pathToReport == null)
                    return null;

                using (var stream = File.Open(pathToReport, FileMode.Open))
                {
                    result = new byte[stream.Length];

                    stream.Read(result, 0, result.Length);
                    stream.Close();
                }
            }
            catch (Exception ex)
            {
                Log.WriteErrorMessage("DSRouterService.GetTagsReportAsByteArray() : Исключение : " + ex.Message);
            }

            return result;
        }
        /// <summary>
        /// Собирает данные и сохраняет отчет в указанное место
        /// </summary>
        private string SaveTagsReport(string pathToSave, string reportName, DSRouterTagsReportSettings reportSettings)
        {
            string result = null;

            // Получаем тренды
            var trends = GetTrends(reportSettings.Tags, reportSettings.StartDateTime, reportSettings.EndDateTime);
            if (trends == null || trends.Count == 0)
                return null;

            // Если надо, то приводим тренды к единому шагу
            Dictionary<DateTime, Tuple<object, object, object, object>> trendsWithFixStep = null;
            if (reportSettings.Interval != 0)
            {
                trendsWithFixStep = GetTrendsWithFixStep(trends, reportSettings.Interval, reportSettings.StartDateTime, reportSettings.EndDateTime);
            }

            // Заполняем DataSet
            var dataSource = FillDataSet(null, trends, trendsWithFixStep);

            #region Формирование отчета

            string reportTemplateName = String.IsNullOrWhiteSpace(reportSettings.ReportTamplateName) ? "TagsReport" : reportSettings.ReportTamplateName;

            var report = new Report(reportTemplateName);
            report.SetDataSource(dataSource);

            report.SaveReportFile(pathToSave, reportName, reportSettings.ReportExtension.ToString());

            result = Path.Combine(pathToSave, reportName + "." + reportSettings.ReportExtension.ToString());

            #endregion

            return result;
        }