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

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

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

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

Это наиболее современный и быстрый метод, не требующий установки Microsoft Excel на сервере или компьютере пользователя. Он доступен начиная с версии платформы 8.3.6 и позволяет программно собрать несколько табличных документов в одну структуру.

Рассмотрим по шагам, как реализовать этот алгоритм:

  1. Создаем массив или набор табличных документов, которые мы хотим объединить.
  2. Инициализируем объект ПакетОтображаемыхДокументов.
  3. Добавляем каждый ТабличныйДокумент в состав пакета, указывая имя будущего листа Excel.
  4. Сохраняем пакет в файл формата XLSX.

Разберем пример кода, который решает поставленную задачу (поможет также готовый шаблон для 1С8 по Excel):


// Выбираем путь для сохранения файла
диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
диалог.Фильтр = "Файл Excel 2007 (*.xlsx)|*.xlsx";

Если диалог.Выбрать() Тогда
    // Получаем наши табличные документы (макеты)
    ТабДок1 = ПечатьСчетаЗаказа("Заказ");
    ТабДок2 = ПолучитьВторойЛист("ЛистОбразецЗаполнения");
    ТабДок3 = ПолучитьВторойЛист("ЛистСправочник");

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

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

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

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

Важное замечание: При использовании этого метода многие сталкиваются с системной ошибкой: "Документ Excel 2007 не может содержать более 16384 колонок и 1048576 строк". Как выяснилось на практике, эта ошибка часто является ложной и возникает из-за особенностей кэширования данных. Чтобы ее избежать, необходимо при каждом вызове функции ПоместитьВоВременноеХранилище принудительно генерировать Новый УникальныйИдентификатор, как показано в примере выше.

Также проанализируем проблему с именами листов. В Excel действуют строгие ограничения: имя листа не должно превышать 31 символ и не должно содержать знаков :, \, /, ?, *, [, ]. Если ваше Элт.Наименование нарушит эти правила, файл не откроется или возникнет ошибка при записи.

Способ 2: Использование COM-соединения (Excel.Application)

Если вам требуется сохранить сложное форматирование, специфические макросы или если вы работаете на более старых версиях платформы, можно воспользоваться механизмом COM-объектов. Этот метод требует наличия установленного Microsoft Excel на компьютере.

Типичная ошибка начинающих разработчиков — попытка передать объект 1С ТабличныйДокумент напрямую в метод Excel. Рассмотрим правильную логику работы через OLE/COM:

  1. Сохраняем каждый табличный документ 1С во временные файлы формата XLSX на диске.
  2. Создаем объект Excel.Application.
  3. Открываем первый файл, который станет нашей основной книгой.
  4. Открываем остальные файлы и копируем из них листы в основную книгу.
  5. Сохраняем итоговую книгу и удаляем временные файлы.

Пример программной реализации:


Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    Эксель.Visible = Ложь;
    Эксель.DisplayAlerts = Ложь; // Отключаем уведомления системы
Исключение
    Сообщить("Excel не установлен!");
    Возврат;
КонецПопытки;

// Предположим, файлы уже сохранены временно через ТабДок.Записать()
Путь1 = "C:\Temp\Sheet1.xlsx";
Путь2 = "C:\Temp\Sheet2.xlsx";

Книга1 = Эксель.Workbooks.Open(Путь1);
Книга2 = Эксель.Workbooks.Open(Путь2);

// Копируем лист из второй книги в конец первой
Книга2.Sheets(1).Copy(Книга1.Sheets(Книга1.Sheets.Count));
Книга1.Sheets(Книга1.Sheets.Count).Name = "Дополнительный Лист";

Книга1.SaveAs("C:\Result\ИтоговыйОтчет.xlsx");

Книга1.Close();
Книга2.Close();
Эксель.Quit();

Проблема сохранения группировок и иерархии

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

Если автоматическая группировка всё равно не переносится, единственным выходом будет программная отрисовка уровней через COM-соединение, используя свойство OutlineLevel строк листа Excel после завершения экспорта.

Сравнение методов

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

  1. ПакетОтображаемыхДокументов: Идеален для фоновых заданий на сервере, работы в Linux-среде (через веб-клиент) и когда важна скорость. Не требует лицензий Microsoft Office на сервере.
  2. COM-объект: Стоит выбрать, если нужно объединять уже существующие файлы Excel, добавлять сложные формулы, сводные таблицы или если штатный экспорт 1С искажает форматирование (цвета, границы, шрифты).

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

← На главную