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

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

Долгое время в платформе 1С:Предприятие существовала проблема: штатные средства позволяли сохранять ТабличныйДокумент только в один файл. Если требовалось объединить несколько разных отчетов или разделов в один файл Excel, но на разные вкладки (листы), программистам приходилось прибегать к использованию COM-объектов (Excel.Application), сторонних библиотек или сложных манипуляций с форматом XML. Однако, начиная с версии платформы 8.3.12, разработчики добавили штатный механизм, который значительно упрощает эту задачу. Разберем подробно, как это работает.

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

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

  1. ПакетОтображаемыхДокументов — основной объект-пакет.
  2. Состав — коллекция (элементы пакета), в которую мы добавляем наши документы.
  3. ЭлементПакетаОтображаемыхДокументов — конкретный элемент внутри коллекции, который ссылается на данные (табличный документ) и имеет свойство Наименование, отвечающее за заголовок листа в Excel.

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


// 1. Создаем объект пакета
Пакет = Новый ПакетОтображаемыхДокументов;

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

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

// 4. Записываем пакет в файл формата XLSX
Пакет.Записать("C:\Reports\ОбщийОтчет.xlsx", ТипФайлаПакетаОтображаемыхДокументов.XLSX);

Важные правила именования листов

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

Управление параметрами печати и вложенные пакеты

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

Если необходимо сохранить индивидуальные параметры каждого документа, мы можем поместить во вложенный пакет только один документ и установить параметры для этого пакета. Рассмотрим этот подход на примере:


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

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

// Добавляем вложенный пакет в основной
НовыйЭлемент = ПакетОбщий.Состав.Добавить();
НовыйЭлемент.Данные = ВложенныйПакет1;
НовыйЭлемент.Наименование = "Лист Книжный";

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

НовыйЭлемент2 = ПакетОбщий.Состав.Добавить();
НовыйЭлемент2.Данные = ВложенныйПакет2;
НовыйЭлемент2.Наименование = "Лист Альбомный";

ПакетОбщий.Записать(ПутьКФайлу, ТипФайлаПакетаОтображаемыхДокументов.XLSX);

Выбор формата: XLS или XLSX?

При записи пакета через метод Записать() мы используем перечисление ТипФайлаПакетаОтображаемыхДокументов. Рассмотрим отличия:

Нюансы работы на сервере и в веб-клиенте

Поскольку формирование табличных документов чаще всего происходит на стороне сервера, важно помнить о правилах работы с Временным хранилищем. Метод ПоместитьВоВременноеХранилище требует передачи уникального идентификатора формы или просто нового УникальныйИдентификатор, чтобы данные были доступны до момента вызова метода Записать.

Если вы разрабатываете решение для веб-клиента или планируете длительную операцию записи, рекомендуется использовать асинхронный метод НачатьЗапись(). Это позволит избежать "зависания" интерфейса у пользователя и обеспечит стабильную работу в браузерах, где синхронные вызовы блокируются платформой.

Резюмируем: Использование ПакетОтображаемыхДокументов — это наиболее эффективный, современный и "чистый" способ генерации сложных многолистовых отчетов в Excel. Он не требует наличия установленного Microsoft Office на сервере, работает быстро и поддерживает все основные форматы экспорта.

← На главную