private void OnSaveClick(object sender, RoutedEventArgs e)
        {
            var stringName            = tbReportName.Text;
            var isShowChannelSelector = CheckBoxChannels.IsChecked.GetValueOrDefault();

            if (string.IsNullOrEmpty(stringName) || stringName == "<Новый отчет>")
            {
                var businessObjects = StiBusinessObjectHelper.GetUsedBusinessObjectsNames(DesignerControl.Report);
                if (businessObjects == null || businessObjects.Count == 0)
                {
                    Manager.UI.ShowMessage("Задайте осмысленное название отчета");
                    return;
                }

                foreach (var key in businessObjects.Keys)
                {
                    var businessObject = businessObjects[key];
                    //Тип бизнес объекта в отчете
                    stringName = tbReportName.Text = businessObject.ToString();
                    break; //Имеет смысл использовать только один бизнес объект в отчете
                }
            }

            var data = new MemoryStream();

            DesignerControl.Report.Save(data);

            var reportInfo = new TReportInfo
            {
                ReportUn              = _reportUn,
                StringName            = stringName,
                UserId                = Manager.User.User_ID,
                Data                  = data.ToArray().EncodeBuffer(),
                DateRangeMode         = DateRangeMode,
                TreeMode              = TreeMode,
                IsShowChannelSelector = isShowChannelSelector,
            };

            data.Dispose();

            LayoutGrid.RunBackgroundAsync <string>("SaveReport", reportUn =>
            {
                if (!string.IsNullOrEmpty(reportUn))
                {
                    _reportUn = reportUn;
                    Manager.UI.ShowMessage("Отчет успешно сохранен");
                }
            }, EnumServiceType.StimulReport, reportInfo);
        }
        /// <summary>
        /// Основная процедура формирования отчета
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void WCFRenderReport(object sender, Stimulsoft.Report.Events.StiWCFEventArgs e)
        {
            if (!Equals(sender, DesignerControl))
            {
                return;
            }
            var businessObjects = StiBusinessObjectHelper.GetUsedBusinessObjectsNames(DesignerControl.Report);

            _xml = e.Xml;

            if (businessObjects == null || businessObjects.Count == 0)
            {
                //На форме нет бизнес объектов
                if (DateRangeMode == enumDateRangeMode.WithoutDateMode && TreeMode == enumTreeMode.None)
                {
                    RenderReport(null);
                }
                else
                {
                    var isShowChannelSelector = CheckBoxChannels.IsChecked.GetValueOrDefault();
                    StiHelper.ShowMultiPSSelector(LayoutGrid, DateRangeMode, TreeMode, isShowChannelSelector);
                }

                return;
            }

            _businessObjectName = string.Empty;
            foreach (var key in businessObjects.Keys)
            {
                var businessObject = businessObjects[key];
                //Тип бизнес объекта в отчете
                _businessObjectName = businessObject.ToString();
                break; //Имеет смысл использовать только один бизнес объект в отчете
            }
            //Запрашиваем параметры
            StiHelper.ShowMultiPSSelector(LayoutGrid, _businessObjectName);
        }