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

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

При разработке отчетов и печатных форм в платформе 1С стандартным подходом является создание визуального макета в конфигураторе с последующим выводом именованных областей. Однако возникают задачи, когда структура вывода заранее неизвестна: число колонок динамически меняется, в разных строках требуется разное смещение ячеек, или макет должен генерироваться полностью «на лету» без привязки к метаданным. Рассмотрим, как решить эту задачу исключительно средствами встроенного языка 1С.

Вариант 1. Прямая адресация и оформление ячеек через метод Область()

Платформа 1С позволяет манипулировать ячейками табличного документа напрямую с помощью координат строк и колонок. Для этого инициализируется новый объект ТабличныйДокумент, после чего вызывается метод Область(R1, C1, R2, C2).

Разберем по шагам создание документа с нуля и оформление ячеек:

  1. Создаем новый экземпляр табличного документа: ТабДок = Новый ТабличныйДокумент;.
  2. Получаем нужную область по номерам строк и колонок.
  3. Задаем значение или текст ячейки, а также настраиваем шрифт, цвет фона и границы.

Посмотрим на пример программного оформления ячеек и установки рамок:


ТабДок = Новый ТабличныйДокумент;

// Создаем объекты оформления заранее для оптимизации
ШрифтЗаголовка = Новый Шрифт(ТабДок.Область(1, 1).Шрифт, , 11, Истина);
ЦветФонаШапки = Новый Цвет(230, 230, 250);
ТонкаяЛиния = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);

// Оформляем шапку
ОбластьШапки = ТабДок.Область(1, 1, 1, 3);
ОбластьШапки.Объединить();
ОбластьШапки.Текст = "Динамический отчет";
ОбластьШапки.Шрифт = ШрифтЗаголовка;
ОбластьШапки.ЦветФона = ЦветФонаШапки;
ОбластьШапки.ГоризонтальноеПоложение = ПоложениеТекстаВЯчейке.Центр;

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

Ячейка2 = ТабДок.Область(2, 2);
Ячейка2.СодержитЗначение = Истина;
Ячейка2.ТипЗначения = Новый ОписаниеТипов("Число");
Ячейка2.Значение = 1500;
Ячейка2.Обвести(ТонкаяЛиния, ТонкаяЛиния, ТонкаяЛиния, ТонкаяЛиния);

Вариант 2. Динамическая сборка строк и колонок через методы Вывести() и Присоединить()

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

Рассмотрим пример формирования динамической таблицы с переменным количеством колонок:


ТабДок = Новый ТабличныйДокумент;

// Вспомогательный табличный документ для сборки одной ячейки
Фрагмент = Новый ТабличныйДокумент;
ЯчейкаШаблона = Фрагмент.Область(1, 1);
ЯчейкаШаблона.Обвести(Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1));

Для НомерСтроки = 1 По 5 Цикл
    Для НомерКолонки = 1 По 4 Цикл
        ЯчейкаШаблона.Текст = "Стр " + НомерСтроки + ", Кол " + НомерКолонки;
        
        Если НомерКолонки = 1 Тогда
            // Первую колонку строки выводим вниз
            ТабДок.Вывести(Фрагмент);
        Иначе
            // Остальные колонки пристыковываем справа
            ТабДок.Присоединить(Фрагмент);
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Управление независимой сеткой колонок (смещение в строках)

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

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

  1. При ручном заполнении: используем метод ТабличныйДокумент.СоздатьФорматСтрок(НомерСтроки). После этого изменение свойств колонок в указанной строке не отразится на остальном документе.
  2. При выводе областей: в методах ТабДок.Вывести(Область, , , Истина) или ТабДок.Присоединить(Область, , , Истина) передаем значение Истина в четвертый параметр СоздаватьФорматСтрок.

// Пример создания независимой ширины колонок для конкретной строки
ТабДок.СоздатьФорматСтрок(3);
ОбластьСтроки = ТабДок.Область(3, 1, 3, 1);
ОбластьСтроки.ШиринаКолонки = 40; // Изменит ширину только в третьей строке

Рекомендации по оптимизации производительности

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

  1. Выносите объекты стилей из циклов: объявляйте объекты Новый Шрифт(), Новый Цвет() и Новый Линия() один раз перед обходом данных.
  2. Применяйте форматирование к диапазонам: вместо обхода ячеек по одной оформляйте целые блоки ячеек за один вызов метода Область().
  3. Используйте гибридный подход: создайте в конфигураторе минимальный макет, содержащий всего 2–3 ячейки-образца с готовыми шрифтами и рамками. В программном коде клонируйте эти области и выводите их через Присоединить() — это избавит от ручного описания десятков свойств оформления.
  4. Рассмотрите СКД: если сложная динамическая структура вызвана иерархией или группировками данных, сформируйте отчет через программную схему компоновки данных (СКД), которая автоматически рассчитает смещения, объединения и оформит итоги.
← На главную