При разработке отчетов на базе системы компоновки данных (СКД) часто возникает задача передать в схему параметры, рассчитанные или полученные динамически в кодовой части программы: данные из временного хранилища, массивы значений, списки ссылок или вычисленные периоды. Разберем по шагам, как правильно передавать параметры в СКД программным путем через модуль отчета.
Проанализируем классический подход, когда в модуле отчета полностью переопределяется стандартный вывод. Для этого используется предопределенное событие модуля отчета ПриКомпоновкеРезультата. В нем мы отключаем стандартную обработку и вручную выполняем компоновку макета и вывод в табличный документ.
Рассмотрим пример кода, в котором выполняется инициализация параметров и вывод результата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем текущие настройки компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Устанавливаем значение параметра (например, массив или полученное из временного хранилища значение)
ЗначениеПараметра = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Параметр1", ЗначениеПараметра);
// Формируем макет компоновки данных
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Разберем логику работы этого метода:
СтандартнаяОбработка = Ложь предотвращает автоматическое формирование отчета платформой.КомпоновщикНастроек.ПолучитьНастройки() возвращает рабочий экземпляр настроек с учетом пользовательских корректировок.УстановитьЗначениеПараметра коллекции ПараметрыДанных находит параметр по имени, задает ему значение и автоматически выставляет признак Использование = Истина.ПроцессорКомпоновки, а затем выводится через ПроцессорВывода в ДокументРезультат.Если нет необходимости вмешиваться в процесс вывода и генерации макета, можно не отключать стандартную обработку. Достаточно заполнить параметры в настройках компоновщика в самом начале события ПриКомпоновкеРезультата, после чего платформа сформирует отчет самостоятельно.
Посмотрим на пример упрощенного кода:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Стандартную обработку не отключаем
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Параметр1", МассивЗначений);
КонецПроцедуры
В типовых конфигурациях на платформе 1С:Предприятие 8.3 присутствуют готовые функции для безопасной установки параметров СКД, учитывающие структуру пользовательских настроек.
Рассмотрим пример вызова функции общего модуля:
БухгалтерскиеОтчетыКлиентСервер.УстановитьПараметр(Отчет.КомпоновщикНастроек.Настройки, "НачалоПериода", Отчет.НачалоПериода);
Проанализируем тонкости, которые необходимо учитывать при программной передаче значений:
КомпоновщикНастроек.Настройки, может быть перезаписано значением из КомпоновщикНастроек.ПользовательскиеНастройки при компоновке. В этом случае значение следует устанавливать также в коллекции пользовательских настроек или исключить параметр из состава пользовательских в схеме.ГДЕ Поле В (&Параметр1), в параметр можно передавать массив или список значений. СКД автоматически преобразует его для условия В.ПоместитьВоВременноеХранилище, чтобы адрес оставался валидным на момент вызова серверной процедуры компоновки.