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