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

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

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

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

Почему сбивается ширина колонок при выводе

По умолчанию в объекте ТабличныйДокумент действует сквозная координатная сетка. Это означает, что ширина колонок от 1 до N фиксируется первой выведенной строкой или таблицей и применяется ко всему документу целиком. Когда мы выводим сначала область из 14 колонок с широкими полями, а затем добавляем область из 24 колонок, табличный документ пытается уместить новые данные в уже существующую разметку либо деформирует предыдущие строки. В результате нарушаются визуальные пропорции исходных макетов.

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

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

Вариант А: Интерактивная настройка в макете

  1. Открываем макет в конфигураторе или режиме предприятия.
  2. Выделяем целиком строки второй таблицы, щелкнув по номерам строк на левой координатной панели.
  3. Наводим курсор на границу любой колонки в заголовке таблицы и изменяем ее ширину.
  4. В появившемся системном диалоговом окне подтверждаем действие: «Создать новый формат строк для выделенных строк?».
  5. После создания изолированного формата настраиваем необходимое количество колонок (24) и их точные размеры. Настройки первого блока (14 колонок) останутся неизменными.

Вариант Б: Программное создание формата строк

Если макеты изначально хранятся в разных объектах метаданных или формируются динамически, применим метод СоздатьФорматСтрок() непосредственно в коде при сборке итогового документа:


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

// Выводим первый макет (14 колонок)
Макет1 = ПолучитьМакет("Макет1");
ОбластьШапка = Макет1.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

// Фиксируем номер первой строки второго блока
НомерНачалаБлока2 = ТабДок.ВысотаТаблицы + 1;

// Выводим второй макет (24 колонки)
Макет2 = ПолучитьМакет("Макет2");
ОбластьДанные = Макет2.ПолучитьОбласть("Данные");
ТабДок.Вывести(ОбластьДанные);

НомерОкончанияБлока2 = ТабДок.ВысотаТаблицы;

// Создаем изолированный формат строк для диапазона второго макета
ОбластьВторогоБлока = ТабДок.Область(НомерНачалаБлока2, , НомерОкончанияБлока2, );
ОбластьВторогоБлока.СоздатьФорматСтрок();

// Переносим исходную ширину колонок из второго макета
Для НомерКолонки = 1 По Макет2.ШиринаТаблицы Цикл
    ТабДок.Область(НомерНачалаБлока2, НомерКолонки).ШиринаКолонки = Макет2.Область(1, НомерКолонки).ШиринаКолонки;
КонецЦикла;

Способ 2. Построение макета на единой модульной сетке

Если печатную форму предполагается активно экспортировать в форматы сторонних табличных редакторов (например, Microsoft Excel / XLSX), использование механизма «Формат строк» может привести к созданию сложной сетки с большим числом микроколонок. В таких случаях надежнее спроектировать единый макет на базовой модульной сетке.

Разберем по шагам, как построить модульную сетку:

  1. Определяем наименьшую единицу ширины колонки (например, узкие колонки шириной 1–2 мм).
  2. Размечаем в макете большое количество таких базовых колонок (например, 48 или 60).
  3. Формируем ячейки первого макета (где было 14 колонок) путем объединения базовых ячеек (например, объединяя по 3–4 базовые колонки в одну результирующую).
  4. Формируем ячейки второго макета (где 24 колонки), объединяя базовые ячейки с меньшим шагом (по 1–2 базовые колонки).

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

Способ 3. Пакетная печать без слияния в один документ

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


// Формируем два раздельных табличных документа
ТабДок1 = Новый ТабличныйДокумент;
ТабДок1.Вывести(Макет1.ПолучитьОбласть("Область14Колонок"));

ТабДок2 = Новый ТабличныйДокумент;
ТабДок2.Вывести(Макет2.ПолучитьОбласть("Область24Колонки"));

// Объединяем в пакет для совместного просмотра и печати
Пакет = Новый ПакетОтображаемыхДокументов;
ЭлементПакета1 = Пакет.Состав.Добавить();
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабДок1, УникальныйИдентификатор);

ЭлементПакета2 = Пакет.Состав.Добавить();
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабДок2, УникальныйИдентификатор);

// Пакет готов к отображению в диалоге печати

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

← На главную