При формировании комплексных печатных форм и отчетов в 1С разработчики часто сталкиваются с задачей объединения нескольких разнородных таблиц в одном результирующем отчете. Например, первый макет содержит шапку и сводную таблицу из 14 колонок, а второй — детальную спецификацию из 24 колонок. При последовательном выводе таких областей в один ТабличныйДокумент оформление первой таблицы нередко ломается: колонки сжимаются или растягиваются под размеры второй таблицы.
Проанализируем причины такого поведения платформы и подробно разберем все способы корректного вывода разнородных макетов в единый документ.
По умолчанию в объекте ТабличныйДокумент действует сквозная координатная сетка. Это означает, что ширина колонок от 1 до N фиксируется первой выведенной строкой или таблицей и применяется ко всему документу целиком. Когда мы выводим сначала область из 14 колонок с широкими полями, а затем добавляем область из 24 колонок, табличный документ пытается уместить новые данные в уже существующую разметку либо деформирует предыдущие строки. В результате нарушаются визуальные пропорции исходных макетов.
Платформа 1С:Предприятие поддерживает изоляцию структуры колонок для отдельных диапазонов строк. Это позволяет задавать уникальное количество и ширину колонок для каждого смыслового блока внутри одного табличного документа.
Вариант А: Интерактивная настройка в макете
Вариант Б: Программное создание формата строк
Если макеты изначально хранятся в разных объектах метаданных или формируются динамически, применим метод СоздатьФорматСтрок() непосредственно в коде при сборке итогового документа:
// Создаем результирующий документ
ТабДок = Новый ТабличныйДокумент;
// Выводим первый макет (14 колонок)
Макет1 = ПолучитьМакет("Макет1");
ОбластьШапка = Макет1.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Фиксируем номер первой строки второго блока
НомерНачалаБлока2 = ТабДок.ВысотаТаблицы + 1;
// Выводим второй макет (24 колонки)
Макет2 = ПолучитьМакет("Макет2");
ОбластьДанные = Макет2.ПолучитьОбласть("Данные");
ТабДок.Вывести(ОбластьДанные);
НомерОкончанияБлока2 = ТабДок.ВысотаТаблицы;
// Создаем изолированный формат строк для диапазона второго макета
ОбластьВторогоБлока = ТабДок.Область(НомерНачалаБлока2, , НомерОкончанияБлока2, );
ОбластьВторогоБлока.СоздатьФорматСтрок();
// Переносим исходную ширину колонок из второго макета
Для НомерКолонки = 1 По Макет2.ШиринаТаблицы Цикл
ТабДок.Область(НомерНачалаБлока2, НомерКолонки).ШиринаКолонки = Макет2.Область(1, НомерКолонки).ШиринаКолонки;
КонецЦикла;
Если печатную форму предполагается активно экспортировать в форматы сторонних табличных редакторов (например, Microsoft Excel / XLSX), использование механизма «Формат строк» может привести к созданию сложной сетки с большим числом микроколонок. В таких случаях надежнее спроектировать единый макет на базовой модульной сетке.
Разберем по шагам, как построить модульную сетку:
Такой подход обеспечивает идеальную совместимость при выгрузке в сторонние файлы и предсказуемое отображение без смещения границ.
В ситуациях, когда макеты представляют собой самостоятельные документы (например, счет на оплату и акт сверки), выводить их в одну физическую таблицу не требуется. Достаточно сформировать два независимых табличных документа и объединить их в пакет с помощью объекта ПакетОтображаемыхДокументов или ПакетТабличныхДокументов.
// Формируем два раздельных табличных документа
ТабДок1 = Новый ТабличныйДокумент;
ТабДок1.Вывести(Макет1.ПолучитьОбласть("Область14Колонок"));
ТабДок2 = Новый ТабличныйДокумент;
ТабДок2.Вывести(Макет2.ПолучитьОбласть("Область24Колонки"));
// Объединяем в пакет для совместного просмотра и печати
Пакет = Новый ПакетОтображаемыхДокументов;
ЭлементПакета1 = Пакет.Состав.Добавить();
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабДок1, УникальныйИдентификатор);
ЭлементПакета2 = Пакет.Состав.Добавить();
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабДок2, УникальныйИдентификатор);
// Пакет готов к отображению в диалоге печати
Этот вариант гарантирует, что каждый отчет сохранит свои оригинальные параметры страницы, ориентацию листа и ширины колонок без взаимного влияния.