Как программно создать параметры в области макета печатной формы 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних печатных форм (ВПФ) или отчетов часто возникает необходимость динамически сформировать состав колонок или строк. Если количество реквизитов заранее неизвестно либо оно слишком велико, ручное рисование ячеек в конфигураторе становится неэффективным. Разберем по шагам, как программно переопределить свойства ячеек макета, назначить им параметры и корректно заполнить значениями.

Базовый способ: переопределение свойств ячейки в полученной области

Макет в платформе 1С представляет собой объект типа ТабличныйДокумент. Каждая ячейка в нем обладает набором свойств, управляющих отображением данных. Чтобы ячейка воспринималась системой как параметр, необходимо установить свойство Заполнение в значение системного перечисления ТипЗаполненияОбластиТабличногоДокумента.Параметр, а также задать строковое имя в свойстве Параметр.

Рассмотрим типовой пример назначения параметра конкретной ячейке в полученной области:


ОбластьДеталей = Макет.ПолучитьОбласть("Строка");

// Обращаемся к ячейке по относительным координатам внутри области (строка, колонка)
Ячейка = ОбластьДеталей.Область(1, 1);
Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
Ячейка.Параметр = "Номенклатура";

// Заполняем созданный параметр и выводим строку в итоговый табличный документ
ОбластьДеталей.Параметры.Номенклатура = ТекущаяСтрока.Номенклатура;
ТабДокумент.Вывести(ОбластьДеталей);

Оптимизация работы: модификация исходного макета вместо каждой области

Если печатная форма выводит сотни или тысячи строк в цикле, постоянное изменение свойств ячеек внутри каждой полученной области существенно замедляет работу алгоритма. Проанализируем более производительный подход.

Макет, полученный из внешнего объекта или метаданных, находится в оперативной памяти на время исполнения процедуры. Мы можем один раз модифицировать исходный макет до начала цикла выборки данных, а затем стандартно вызывать ПолучитьОбласть():


// Модифицируем ячейку непосредственно в исходном макете
Макет.Область("Строка|R1C1").Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
Макет.Область("Строка|R1C1").Параметр = "Артикул";

// В цикле только получаем область и заполняем данные
Пока Выборка.Следующий() Цикл
    ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
    ЗаполнитьЗначенияСвойств(ОбластьСтроки.Параметры, Выборка);
    ТабДокумент.Вывести(ОбластьСтроки);
КонецЦикла;

После назначения свойства Параметр новое имя автоматически регистрируется в коллекции Область.Параметры, благодаря чему работает групповое заполнение через метод ЗаполнитьЗначенияСвойств().

Использование типа заполнения «Шаблон»

Когда требуется в одной ячейке объединить статичный текст и одно или несколько динамических значений, разберем использование шаблонов. Для этого ячейке присваивается тип ТипЗаполненияОбластиТабличногоДокумента.Шаблон, а в свойстве Текст указываются имена параметров в квадратных скобках:


Ячейка = Макет.Область("Шапка|R1C1");
Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Шаблон;
Ячейка.Текст = "Документ № [Номер] от [Дата]";

ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
ОбластьШапки.Параметры.Номер = СсылкаНаДокумент.Номер;
ОбластьШапки.Параметры.Дата = Формат(СсылкаНаДокумент.Дата, "ДЛФ=D");
ТабДокумент.Вывести(ОбластьШапки);

Альтернативные подходы к динамическому формированию

Программное создание параметров макета — не единственный инструмент для построения сложных отчетов и форм. Рассмотрим ситуации, когда удобнее использовать альтернативные механизмы:

  1. Прямая запись в свойство Текст: Если разметка полностью генерируется в коде, использование механизма параметров создает лишний уровень абстракции. Достаточно сразу записывать строковые данные в ТабличныйДокумент.Область(R, C).Текст.
  2. Секционный вывод через Вывести() и Присоединить(): Вместо динамической генерации параметров внутри одной широкой строки можно разбить макет на мелкие типовые колонки и комбинировать их в коде. Метод Вывести() сдвигает позицию печати вниз, а метод Присоединить() добавляет колонки вправо.
  3. Система компоновки данных (СКД): Для печатных форм со сложной структурой колонок, зависящей от настроек или прав пользователя, оптимально использовать программный вывод через СКД. Процессор компоновки данных берет на себя автоматическое позиционирование колонок, объединение ячеек и типизацию данных без ручной работы с координатами табличного документа.

Важные ограничения и особенности

При использовании динамических параметров обратите внимание на следующие нюансы:

  1. Отсутствие синтаксического контроля: Имена параметров, добавленные программно, не проверяются платформой на этапе сохранения конфигурации или внешней обработки. Опечатка в имени параметра приведет к тому, что ячейка останется пустой без вызова ошибки.
  2. Производительность: Статически нарисованный в конфигураторе макет формируется быстрее, так как платформа не тратит процессорное время на расчет структуры ячеек во время исполнения кода.
← На главную