В процессе разработки отчетов на базе Системы компоновки данных (СКД) часто возникает необходимость программно устанавливать или изменять значения параметров (в этом поможет СКДБилдер: упрощаем программное создание СКД). Это может потребоваться для автоматической подстановки дат, установки фильтров по умолчанию или реализации сложной логики, которую невозможно описать стандартными средствами схемы. В этой статье мы подробно разберем, как эффективно управлять параметрами СКД в среде управляемых форм.
Для начала проанализируем, где именно хранятся параметры в 1С. Основным объектом для работы с настройками отчета является КомпоновщикНастроек (иногда требуется использовать Две разных схемы в отчете СКД). У него есть два ключевых свойства, которые мы будем использовать:
Важный нюанс: если параметр вынесен в пользовательские настройки, то изменение его значения через основное свойство Настройки может не дать видимого результата на форме, так как приоритет имеют пользовательские значения. Мы рассмотрим, как обходить эту ситуацию.
Наиболее правильным местом для программного вмешательства в процесс формирования отчета является процедура ПриКомпоновкеРезультата в модуле объекта отчета (как в публикации Простой пример отчета СКД с выводом другого внешнего отчета в один табличный документ на УФ). Рассмотрим пример, когда нам нужно программно заполнить параметр на основании другого параметра или внешних данных.
Выясним причину выбора этого метода: код здесь выполняется непосредственно перед тем, как система начнет собирать данные. Мы можем перехватить процесс и подставить нужные значения.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// 1. Создаем идентификатор параметра, как он назван в схеме СКД
ПараметрСКД = Новый ПараметрКомпоновкиДанных("МассивГрупп");
// 2. Получаем данные для установки (например, из функции)
ЗначениеПараметра = ПолучитьМассивГруппДляФильтра();
// 3. Устанавливаем значение через метод компоновщика
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрСКД, ЗначениеПараметра);
КонецПроцедуры
Метод УстановитьЗначениеПараметра хорош тем, что он автоматически устанавливает флаг Использование в значение Истина, избавляя нас от лишних строк кода.
Иногда требуется установить параметры в момент открытия отчета или при изменении пользователем каких-либо реквизитов на форме. В этом случае мы работаем в модуле управляемой формы (используя Шаблон дополнительной обработки с сохранением параметров).
Рассмотрим подробнее сценарий в обработчике ПриСозданииНаСервере. Допустим, нам нужно установить «Дату начала» на 60 дней меньше текущей даты, а «Дату окончания» — равной текущему моменту.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем текущую дату
ТекущийМомент = ТекущаяДата();
// Находим параметры в компоновщике настроек
ПараметрНачало = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаНачала"));
ПараметрКонец = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаОкончания"));
Если ПараметрНачало <> Неопределено Тогда
ПараметрНачало.Значение = ТекущийМомент - (60 * 60 * 24 * 60); // минус 60 дней
ПараметрНачало.Использование = Истина;
КонецЕсли;
Если ПараметрКонец <> Неопределено Тогда
ПараметрКонец.Значение = ТекущийМомент;
ПараметрКонец.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию: что делать, если параметр выведен на форму и пользователь должен видеть изменения? В управляемых формах для этого нужно найти элемент в ПользовательскиеНастройки. Мы можем использовать вспомогательную функцию для поиска элемента по его идентификатору из основных настроек.
&НаСервере
Процедура УстановитьПараметрВПользовательскихНастройках(ИмяПараметра, Значение)
ПараметрСКД = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
// Находим параметр в общих настройках, чтобы получить его идентификатор
ЭлементНастройки = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрСКД);
Если ЭлементНастройки <> Неопределено Тогда
// Ищем соответствующий элемент в пользовательских настройках
Идентификатор = ЭлементНастройки.ИдентификаторПользовательскойНастройки;
ЭлементПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Идентификатор);
Если ЭлементПользовательскойНастройки <> Неопределено Тогда
ЭлементПользовательскойНастройки.Значение = Значение;
ЭлементПользовательскойНастройки.Использование = Истина;
Иначе
// Если в пользовательских нет, устанавливаем в обычных
ЭлементНастройки.Значение = Значение;
ЭлементНастройки.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Посмотрим на ситуацию с другой стороны. Иногда код вообще не нужен. В системе компоновки данных предусмотрено поле Выражение для параметров. Рассмотрим по шагам, как настроить автоматический расчет параметров без программирования:
ДатаНачала).ДобавитьКДате(ТекущаяДата(), "День", -60).&Дата1) в выражении &Дата2 работает не всегда стабильно. Лучше использовать функции типа ТекущаяДата() или вызовы Общих модулей.Практический совет: если вам нужна сложная логика в выражениях, вы можете создать функцию в общем модуле с флагом Глобальный или Вызов сервера и вызывать её прямо из СКД: МойОбщийМодуль.РассчитатьДатуОтчета(ПараметрыСеанса.ТекущийПользователь).
Бывают задачи, когда определенные параметры должны быть установлены жестко, и пользователь не должен иметь возможности их изменить через интерфейс. Для этого проанализируем объект ФиксированныеНастройки.
Параметры, установленные в КомпоновщикНастроек.ФиксированныеНастройки, не отображаются в стандартных формах настроек и всегда применяются при выполнении запроса СКД. Это наиболее надежный способ ограничить выборку данных «под капотом» отчета.
Мы рассмотрели различные подходы к программному управлению параметрами. Подведем итог:
ПриКомпоновкеРезультата в модуле объекта.ПользовательскиеНастройки.УстановитьЗначениеПараметра() является наиболее удобным и сокращает количество строк кода.Совместное использование этих техник позволит вам создавать гибкие и удобные отчеты любой сложности — для отладки и тестирования схем компоновки пригодится инструменты разработчика для отладки СКД.