Схема компоновки данных (СКД) позволяет создавать гибкие внешние и внутренние отчеты. Однако при работе с обычными формами (например, в конфигурациях «Управление торговлей 10.3» или «Управление производственным предприятием 1.3») разработчики часто сталкиваются с вопросом: как правильно настроить несколько вариантов отчета от разработчика и предоставить пользователю удобный интерфейс для их переключения.
Рассмотрим подробнее суть вариантов настроек в СКД, способы их отображения на форме обычного приложения, а также методы адаптации логики запросов и вычисляемых полей под каждый вариант.
Разберем базовые принципы работы вариантов СКД:
А + Б, а для второго — А + Б + В, создавать отдельный запрос не обязательно. В СКД предусмотрено несколько способов решения такой задачи: использование пользовательских полей, условных выражений в вычисляемых полях или управление параметрами схемы.В отличие от управляемого приложения, где меню выбора вариантов часто генерируется базовыми библиотеками (например, БСП) или платформой автоматически, в обычных формах отработкой меню подменю командной панели приходится управлять самостоятельно или подключать штатные действия формы.
Рассмотрим практический пример создания кнопок переключения вариантов настроек на командной панели формы отчета. Данный код размещается в модуле формы отчета:
Процедура УстановитьВариантыНастроек()
КП = ЭлементыФормы.ДействияФормы;
НоваяКнопка = КП.Кнопки.Вставить(1, "_ВариантыОтчетов", ТипКнопкиКоманднойПанели.Подменю, "Варианты отчетов");
НовоеДействие = Новый Действие("_СменаВариантаНастройки");
ч = 1;
Для Каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
КП.Кнопки._ВариантыОтчетов.Кнопки.Добавить("Вариант" + Строка(ч), ТипКнопкиКоманднойПанели.Действие, Настройка.Представление, НовоеДействие);
ч = ч + 1;
КонецЦикла;
КонецПроцедуры
Процедура _СменаВариантаНастройки(Элемент)
Для Каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
Если Элемент.Текст = Настройка.Представление Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(Настройка.Настройки);
// Если на форме есть элементы периодов, обновляем их значения
НачПериодаПриИзменении(ЭтаФорма.ЭлементыФормы.НачПериода);
КонПериодаПриИзменении(ЭтаФорма.ЭлементыФормы.КонПериода);
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем алгоритм работы данного кода:
УстановитьВариантыНастроек(), которая обращается к коллекции СхемаКомпоновкиДанных.ВариантыНастроек.ДействияФормы добавляется подменю «Варианты отчетов», заполняемое кнопками с названиями вариантов._СменаВариантаНастройки, где передаваемый параметр Элемент содержит нажатую кнопку. Программа находит соответствие по представлению и загружает выбранные настройки в КомпоновщикНастроек.ЗагрузитьНастройки().Альтернативный вариант: На форму обычного приложения также можно добавить стандартную кнопку командной панели с типом действия «Выбрать вариант...» или задействовать платформенный механизм ХранилищеВариантовНастроек.
Часто возникает необходимость сделать варианты отчета существенно разной структуры или с отличающимися формулами вычислений. Выясним основные подходы к реализации такой бизнес-логики:
Если разница заключается лишь в формуле показателя, на закладке «Настройки» конкретного варианта отчета можно добавить Пользовательское поле. В первом варианте прописать выражение А + Б, а во втором варианте — А + Б + В. В результате схема останется единой, а формулы будут меняться вместе с выбранным вариантом.
В вычисляемых полях на закладке «Вычисляемые поля» можно использовать логические конструкции языка выражений СКД:
ВЫБОР
КОГДА &ВариантРасчета = 1 ТОГДА ПолеА + ПолеБ
ИНАЧЕ ПолеА + ПолеБ + ПолеВ
КОНЕЦ
Значение параметра &ВариантРасчета при этом задается индивидуально на закладке «Параметры» внутри настроек каждого варианта.
Если для разных вариантов требуются разрозненные данные (разные таблицы и регистры), их можно добавить в одну СКД как разные наборы данных или сложную систему связей. Платформа 1С обладает механизмом автоматической оптимизации: если в выбранном варианте отчета не участвуют поля определенного набора данных, запрос к этому набору или соединению таблиц физически не выполняется к СУБД.
Если условия формирования отчета принципиально различаются, вы можете модифицировать схему программно перед формированием. В модуле объекта отчета в процедуре ПриКомпоновкеРезультата перехватывается выполнение отчета:
Процедура ПриКомпоновкеРезультата(ТабличныйДокумент, СтандартнаяОбработка)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Проверяем выбранный вариант или параметр
Если ИмяТекущегоВарианта = "ОсобыйВариант" Тогда
// Подменяем текст запроса в наборе данных схемы
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = "ВЫБРАТЬ ...";
КонецЕсли;
КонецПроцедуры
Таким образом, комбинация штатных возможностей СКД (пользовательские поля, параметры, условные выражения) и программного кода переключения настроек позволяет реализовывать решения любой сложности для обычных форм 1С.