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

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

Часто при разработке в 1С возникает задача: сформировать несколько печатных форм (например, из разных отчетов) и выгрузить их в один сводный файл Excel так, чтобы каждый документ располагался на отдельном листе. Рассмотрим подробнее, как реализовать этот функционал правильно и без использования сторонних программ.

Использование объекта ПакетОтображаемыхДокументов

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

Суть алгоритма сводится к тому, что мы создаем объект пакета, по очереди добавляем в него готовые табличные документы, задаем имена для ярлыков листов и одной командой записываем всё в файл формата XLSX. Посмотрим на пример рабочего кода:


ОднаКнига = Новый ПакетОтображаемыхДокументов;

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

// Создаем второй лист и добавляем второй документ
Элемент2 = ОднаКнига.Состав.Добавить();
Элемент2.Данные = ПоместитьВоВременноеХранилище(ТабДок2);
Элемент2.Наименование = "График работы";

// Сохраняем пакет в один файл Excel
ОднаКнига.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);

Обратим внимание на важный нюанс: сам ТабличныйДокумент передается в пакет не напрямую, а в виде адреса, поэтому мы оборачиваем его в функцию ПоместитьВоВременноеХранилище. Свойство Наименование при выгрузке в Excel будет автоматически преобразовано в название листа.

Частая ошибка: пустые параметры вместо данных

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

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

Устаревший способ: использование COM-объекта

Для лучшего понимания платформы проанализируем, как эту задачу приходилось решать раньше, когда встроенного пакета документов еще не существовало. Разработчики использовали технологию COM, инициализируя объект Excel.Application.

Алгоритм действий был достаточно сложным:

  1. Каждый табличный документ 1С сохранялся во временную папку сервера как отдельный файл Excel.
  2. Через COM-соединение в невидимом режиме запускалось полноценное приложение Excel.
  3. Создавалась новая "Общая книга".
  4. Временные файлы поочередно открывались, и их листы макросами копировались в общую книгу.
  5. Программа закрывалась, а временные файлы удалялись.

У данного подхода есть критические недостатки. Главный из них — жесткая привязка к операционной системе Windows и необходимость обязательной установки лицензионного Microsoft Office на сервере (под Linux этот код просто не работает). Кроме того, обмен данными через COM-интерфейс происходит медленно. Если в процессе выполнения такого кода возникнет программная ошибка, скрытые процессы Excel так и останутся работать в фоновом режиме, со временем полностью исчерпав оперативную память сервера.

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

← На главную