При формировании сводных печатных форм, журналов или сложных отчетов (например, книги учета доходов и расходов — КУДиР) разработчики часто сталкиваются с задачей объединения нескольких отдельных табличных документов в единый файл. Если просто последовательно выводить таблицы методом Вывести(), платформа 1С автоматически подгоняет ширину колонок всех последующих разделов под сетку первого выведенного листа, что искажает итоговый внешний вид документа.
Разберем основные причины такого поведения платформы и детально рассмотрим два надежных способа решения задачи: объединение таблиц в один объект ТабличныйДокумент с независимым форматированием колонок и формирование единого многостраничного файла (XLSX, PDF) с помощью объекта ПакетОтображаемыхДокументов.
Объект ТабличныйДокумент представляет собой единую координатную сетку. Если в документ последовательно выводятся разные отчеты без явного переопределения структуры строк, все колонки по умолчанию наследуют размеры, заданные в начале таблицы. Попытка скопировать область методом ВставитьОбласть() в пустой документ также может приводить к неожиданным результатам или ошибкам, если координата начальной строки вычисляется некорректно: у пустого документа свойство ВысотаТаблицы возвращает 0, тогда как нумерация строк в 1С начинается с единицы.
Проанализируем ситуацию, когда необходимо собрать все листы именно в один результирующий ТабличныйДокумент (например, для интерактивного показа пользователю на форме). Для того чтобы каждая выведенная секция сохраняла собственную ширину колонок, платформа предоставляет специализированный метод СоздатьФорматСтрок() у объекта ОбластьЯчеекТабличногоДокумента.
Разберем алгоритм по шагам:
ТабДок.ВысотаТаблицы + 1.ВставитьОбласть().СоздатьФорматСтрок(). Это изолирует разметку колонок данной секции от остальной части таблицы.ШиринаКолонки из исходного листа в соответствующие колонки нового формата строк.ВывестиГоризонтальныйРазделительСтраниц().Посмотрим на практическую реализацию универсальной процедуры добавления листа:
Процедура ДобавитьЛистВТабличныйДокумент(ТДПриемник, ИсходныйЛист)
// Определяем позицию первой строки новой секции
НачалоНовогоФорматаСтрок = ТДПриемник.ВысотаТаблицы + 1;
// Получаем область со всеми данными исходного документа
ОбластьИсточник = ИсходныйЛист.Область(1, 1, ИсходныйЛист.ВысотаТаблицы, ИсходныйЛист.ШиринаТаблицы);
ОбластьПриемник = ТДПриемник.Область(НачалоНовогоФорматаСтрок, 1);
// Вставляем область ячеек
ТДПриемник.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник);
// Создаем независимый формат строк для добавленной секции
ОбластьНовыхСтрок = ТДПриемник.Область(НачалоНовогоФорматаСтрок, , НачалоНовогоФорматаСтрок + ИсходныйЛист.ВысотаТаблицы - 1, );
ОбластьНовыхСтрок.СоздатьФорматСтрок();
// Переносим персональную ширину колонок для каждой колонки исходной таблицы
Для НомерКолонки = 1 По ИсходныйЛист.ШиринаТаблицы Цикл
ТДПриемник.Область(НачалоНовогоФорматаСтрок, НомерКолонки).ШиринаКолонки = ИсходныйЛист.Область(1, НомерКолонки).ШиринаКолонки;
КонецЦикла;
// Добавляем разрыв страницы для корректной печати
ТДПриемник.ВывестиГоризонтальныйРазделительСтраниц();
КонецПроцедуры
Важное ограничение: метод СоздатьФорматСтрок() управляет исключительно шириной колонок. Такие параметры печати, как ориентация страницы (портретная или ландшафтная), размер полей и колонтитулы, задаются для всего объекта ТабличныйДокумент целиком. Если разные разделы отчета требуют разной ориентации страниц, следует использовать второй способ.
Если конечной целью является сохранение результата во внешний файл (например, создание одного PDF-документа или книги Excel с несколькими независимыми вкладками-листами), наиболее правильным решением является использование встроенного объекта ПакетОтображаемыхДокументов.
При экспорте в формат XLSX каждый табличный документ, помещенный в пакет, автоматически превращается в отдельный лист рабочей книги Excel. При этом каждый лист сохраняет как собственную разметку ячеек, так и индивидуальные параметры страницы (ориентацию, поля и масштаб).
Рассмотрим пример формирования книги Excel из списка ранее сформированных табличных документов:
Процедура СохранитьЛистыВЕдиныйФайл(СписокЛистов, ПутьКФайлу)
Пакет = Новый ПакетОтображаемыхДокументов;
Для Каждого ЭлементСписка Из СписокЛистов Цикл
ТабДокЛиста = ЭлементСписка.Значение;
// Добавляем элемент в состав пакета
ЭлементПакета = Пакет.Состав.Добавить();
// Помещаем табличный документ во временное хранилище
АдресВХранилище = ПоместитьВоВременноеХранилище(ТабДокЛиста, Новый УникальныйИдентификатор);
ЭлементПакета.Данные = АдресВХранилище;
// Задаем имя листа (для Excel длина имени не должна превышать 31 символ)
Если Не ПустаяСтрока(ЭлементСписка.Представление) Тогда
ЭлементПакета.Имя = Лев(ЭлементСписка.Представление, 31);
КонецЕсли;
КонецЦикла;
// Сохраняем пакет документов в итоговый файл Excel
Пакет.Записать(ПутьКФайлу, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
КонецПроцедуры
Объект ПакетОтображаемыхДокументов поддерживает сохранение в различные форматы через свойство перечисления ТипФайлаПакетаОтображаемыхДокументов:
ЗаписатьФайлДляПечати().Таким образом, для отображения данных на экране внутри одной формы 1С оптимально подходит комбинирование областей через СоздатьФорматСтрок(), а для выгрузки на диск в виде готовых многостраничных отчетов и книг Excel стандартным и наиболее производительным инструментом платформы является ПакетОтображаемыхДокументов.