Долгое время в платформе 1С:Предприятие существовала проблема: штатные средства позволяли сохранять ТабличныйДокумент только в один файл. Если требовалось объединить несколько разных отчетов или разделов в один файл Excel, но на разные вкладки (листы), программистам приходилось прибегать к использованию COM-объектов (Excel.Application), сторонних библиотек или сложных манипуляций с форматом XML. Однако, начиная с версии платформы 8.3.12, разработчики добавили штатный механизм, который значительно упрощает эту задачу. Разберем подробно, как это работает.
Для реализации сохранения на разных листах используется специализированный объект — ПакетОтображаемыхДокументов. По сути, это контейнер, который может содержать в себе коллекцию табличных документов и настройки для их совместного вывода (на печать или в файл). Проанализируем структуру этого объекта:
Наименование, отвечающее за заголовок листа в 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);
При записи пакета через метод Записать() мы используем перечисление ТипФайлаПакетаОтображаемыхДокументов. Рассмотрим отличия:
Поскольку формирование табличных документов чаще всего происходит на стороне сервера, важно помнить о правилах работы с Временным хранилищем. Метод ПоместитьВоВременноеХранилище требует передачи уникального идентификатора формы или просто нового УникальныйИдентификатор, чтобы данные были доступны до момента вызова метода Записать.
Если вы разрабатываете решение для веб-клиента или планируете длительную операцию записи, рекомендуется использовать асинхронный метод НачатьЗапись(). Это позволит избежать "зависания" интерфейса у пользователя и обеспечит стабильную работу в браузерах, где синхронные вызовы блокируются платформой.
Резюмируем: Использование ПакетОтображаемыхДокументов — это наиболее эффективный, современный и "чистый" способ генерации сложных многолистовых отчетов в Excel. Он не требует наличия установленного Microsoft Office на сервере, работает быстро и поддерживает все основные форматы экспорта.