Как вывести области с разной шириной колонок в один табличный документ 1С?

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

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

В этой статье мы подробно разберем, как обойти это ограничение, проведем анализ структуры метаданных и заставим платформу 1С формировать независимые форматы строк в рамках одного и того же документа. Мы изучим три основных способа: от стандартного программного метода до профессиональных приемов «пиксельной сетки».

Способ 1: Использование параметра «СоздаватьФорматСтрок»

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

Вывести(Область, СоздаватьФорматСтрок)

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

Проанализируем пример кода, где мы в цикле выводим этикетки разной ширины:


// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;

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

ТабДок.Показать();

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

Способ 2: Промежуточный табличный документ

Иногда прямой вывод с параметром Истина приводит к непредсказуемым результатам, особенно если макеты содержат сложные объединения ячеек. В таких случаях мы рекомендуем использовать методику промежуточного формирования. Разберем этот алгоритм по шагам:

  1. Создаем временный объект ТабличныйДокумент для каждой отдельной этикетки или строки.
  2. Выводим в этот временный документ нужные области, настраиваем ширины колонок и форматирование.
  3. Затем уже готовый сформированный временный документ выводим в основной результирующий документ.

Посмотрим на пример реализации:


// Основной документ
Результат = Новый ТабличныйДокумент;

Для Каждого Ряд Из ДанныеПечати Цикл
    // Временный документ для одного ряда этикеток
    ВременныйТабДок = Новый ТабличныйДокумент;
    
    Для Каждого Этикетка Из Ряд.Колонки Цикл
        Область = Макет.ПолучитьОбласть("Этикетка");
        // ... заполнение параметров ...
        
        // Сначала формируем ряд во временном документе
        ВременныйТабДок.Присоединить(Область);
    КонецЦикла;
    
    // Выводим весь сформированный ряд в основной документ с разрывом формата строк
    Результат.Вывести(ВременныйТабДок, Истина);
КонецЦикла;

Этот подход позволяет изолировать логику компоновки каждой строки. Однако, как отмечают разработчики на практике, у этого метода есть побочный эффект: иногда «слетает» оформление границ (рамок) ячеек.

Проблема «исчезающих границ» и ее решение

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

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

Так как графические объекты в 1С (рисунки) рисуются в отдельном слое поверх сетки колонок, они не зависят от ширины ячеек и всегда будут отображаться ровно, даже если под ними «рваная» сетка колонок.

Способ 3: Метод «Минимальной сетки» (Pixel Perfect)

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

Проанализируем суть метода:

  1. В макете создается большое количество колонок (это важно, если планируется работа с PDF файлами в 1С без внешних компонентов), например, 50-100 с очень маленькой фиксированной шириной (0.5 или 1 мм).
  2. Нужный визуальный размер ячейки под данные получается не путем изменения ширины колонки, а путем объединения (Merge) нужного количества этих мелких колонок.
  3. Поскольку ширина самих колонок в макете остается неизменной для всех строк документа, сетка никогда не «плывет».

Этот метод гарантирует, что при сохранении документа в формат Excel, файл не будет перегружен тысячами скрытых форматов строк, а структура документа останется монолитной. Это особенно важно для бухгалтерской отчетности или сложных ценников, где важно соблюсти габариты до миллиметра.

Выводы и рекомендации

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

Важный нюанс: Помните, что использование СоздаватьФорматСтрок = Истина увеличивает объем памяти, занимаемый табличным документом, так как 1С приходится хранить описание колонок для каждой строки отдельно. Для документов на тысячи страниц это может привести к замедлению работы, поэтому используйте этот функционал осознанно.

← На главную