Как объединить несколько табличных документов с сохранением колонок и страниц в 1С

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

При формировании сводных печатных форм, журналов или сложных отчетов (например, книги учета доходов и расходов — КУДиР) разработчики часто сталкиваются с задачей объединения нескольких отдельных табличных документов в единый файл. Если просто последовательно выводить таблицы методом Вывести(), платформа 1С автоматически подгоняет ширину колонок всех последующих разделов под сетку первого выведенного листа, что искажает итоговый внешний вид документа.

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

Почему стандартный вывод искажает ширину колонок

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

Способ 1. Объединение в один табличный документ с помощью метода СоздатьФорматСтрок()

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

Разберем алгоритм по шагам:

  1. Вычисляем начальную позицию для вставки новой секции как ТабДок.ВысотаТаблицы + 1.
  2. Получаем всю используемую область исходного документа и копируем ее в документ-приемник с помощью метода ВставитьОбласть().
  3. Выделяем добавленный диапазон строк в документе-приемнике и вызываем для него метод СоздатьФорматСтрок(). Это изолирует разметку колонок данной секции от остальной части таблицы.
  4. В цикле переносим точные значения свойства ШиринаКолонки из исходного листа в соответствующие колонки нового формата строк.
  5. При необходимости разделения разделов на отдельные страницы при печати вызываем ВывестиГоризонтальныйРазделительСтраниц().

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


Процедура ДобавитьЛистВТабличныйДокумент(ТДПриемник, ИсходныйЛист)
    // Определяем позицию первой строки новой секции
    НачалоНовогоФорматаСтрок = ТДПриемник.ВысотаТаблицы + 1;
    
    // Получаем область со всеми данными исходного документа
    ОбластьИсточник = ИсходныйЛист.Область(1, 1, ИсходныйЛист.ВысотаТаблицы, ИсходныйЛист.ШиринаТаблицы);
    ОбластьПриемник = ТДПриемник.Область(НачалоНовогоФорматаСтрок, 1);
    
    // Вставляем область ячеек
    ТДПриемник.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник);
    
    // Создаем независимый формат строк для добавленной секции
    ОбластьНовыхСтрок = ТДПриемник.Область(НачалоНовогоФорматаСтрок, , НачалоНовогоФорматаСтрок + ИсходныйЛист.ВысотаТаблицы - 1, );
    ОбластьНовыхСтрок.СоздатьФорматСтрок();
    
    // Переносим персональную ширину колонок для каждой колонки исходной таблицы
    Для НомерКолонки = 1 По ИсходныйЛист.ШиринаТаблицы Цикл
        ТДПриемник.Область(НачалоНовогоФорматаСтрок, НомерКолонки).ШиринаКолонки = ИсходныйЛист.Область(1, НомерКолонки).ШиринаКолонки;
    КонецЦикла;
    
    // Добавляем разрыв страницы для корректной печати
    ТДПриемник.ВывестиГоризонтальныйРазделительСтраниц();
КонецПроцедуры

Важное ограничение: метод СоздатьФорматСтрок() управляет исключительно шириной колонок. Такие параметры печати, как ориентация страницы (портретная или ландшафтная), размер полей и колонтитулы, задаются для всего объекта ТабличныйДокумент целиком. Если разные разделы отчета требуют разной ориентации страниц, следует использовать второй способ.

Способ 2. Экспорт нескольких документов в единый файл через ПакетОтображаемыхДокументов

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

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

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


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

Объект ПакетОтображаемыхДокументов поддерживает сохранение в различные форматы через свойство перечисления ТипФайлаПакетаОтображаемыхДокументов:

  1. XLSX и XLS — создается книга Excel, где каждый документ пакета расположен на отдельной вкладке.
  2. PDF — формируется единый PDF-файл, объединяющий все документы последовательно с сохранением индивидуальной ориентации страниц для каждого из них. Для прямой выгрузки на диск можно также применять метод пакета ЗаписатьФайлДляПечати().
  3. DOCX, ODS, HTML4, HTML5, TXT — альтернативные форматы многостраничного экспорта.

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

← На главную