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