При разработке внешних печатных форм (ВПФ) или отчетов часто возникает необходимость динамически сформировать состав колонок или строк. Если количество реквизитов заранее неизвестно либо оно слишком велико, ручное рисование ячеек в конфигураторе становится неэффективным. Разберем по шагам, как программно переопределить свойства ячеек макета, назначить им параметры и корректно заполнить значениями.
Макет в платформе 1С представляет собой объект типа ТабличныйДокумент. Каждая ячейка в нем обладает набором свойств, управляющих отображением данных. Чтобы ячейка воспринималась системой как параметр, необходимо установить свойство Заполнение в значение системного перечисления ТипЗаполненияОбластиТабличногоДокумента.Параметр, а также задать строковое имя в свойстве Параметр.
Рассмотрим типовой пример назначения параметра конкретной ячейке в полученной области:
ОбластьДеталей = Макет.ПолучитьОбласть("Строка");
// Обращаемся к ячейке по относительным координатам внутри области (строка, колонка)
Ячейка = ОбластьДеталей.Область(1, 1);
Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
Ячейка.Параметр = "Номенклатура";
// Заполняем созданный параметр и выводим строку в итоговый табличный документ
ОбластьДеталей.Параметры.Номенклатура = ТекущаяСтрока.Номенклатура;
ТабДокумент.Вывести(ОбластьДеталей);
Если печатная форма выводит сотни или тысячи строк в цикле, постоянное изменение свойств ячеек внутри каждой полученной области существенно замедляет работу алгоритма. Проанализируем более производительный подход.
Макет, полученный из внешнего объекта или метаданных, находится в оперативной памяти на время исполнения процедуры. Мы можем один раз модифицировать исходный макет до начала цикла выборки данных, а затем стандартно вызывать ПолучитьОбласть():
// Модифицируем ячейку непосредственно в исходном макете
Макет.Область("Строка|R1C1").Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
Макет.Область("Строка|R1C1").Параметр = "Артикул";
// В цикле только получаем область и заполняем данные
Пока Выборка.Следующий() Цикл
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
ЗаполнитьЗначенияСвойств(ОбластьСтроки.Параметры, Выборка);
ТабДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
После назначения свойства Параметр новое имя автоматически регистрируется в коллекции Область.Параметры, благодаря чему работает групповое заполнение через метод ЗаполнитьЗначенияСвойств().
Когда требуется в одной ячейке объединить статичный текст и одно или несколько динамических значений, разберем использование шаблонов. Для этого ячейке присваивается тип ТипЗаполненияОбластиТабличногоДокумента.Шаблон, а в свойстве Текст указываются имена параметров в квадратных скобках:
Ячейка = Макет.Область("Шапка|R1C1");
Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Шаблон;
Ячейка.Текст = "Документ № [Номер] от [Дата]";
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
ОбластьШапки.Параметры.Номер = СсылкаНаДокумент.Номер;
ОбластьШапки.Параметры.Дата = Формат(СсылкаНаДокумент.Дата, "ДЛФ=D");
ТабДокумент.Вывести(ОбластьШапки);
Программное создание параметров макета — не единственный инструмент для построения сложных отчетов и форм. Рассмотрим ситуации, когда удобнее использовать альтернативные механизмы:
Текст: Если разметка полностью генерируется в коде, использование механизма параметров создает лишний уровень абстракции. Достаточно сразу записывать строковые данные в ТабличныйДокумент.Область(R, C).Текст.Вывести() и Присоединить(): Вместо динамической генерации параметров внутри одной широкой строки можно разбить макет на мелкие типовые колонки и комбинировать их в коде. Метод Вывести() сдвигает позицию печати вниз, а метод Присоединить() добавляет колонки вправо.При использовании динамических параметров обратите внимание на следующие нюансы: