Как выполнить экспорт в Excel с несколькими листами без использования COM-объектов?

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

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

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

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

Рассмотрим по шагам алгоритм работы с этим объектом:

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

Посмотрим на пример программной реализации этого метода:


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

// Формируем первый лист (например, продажи)
ТабДок1 = Новый ТабличныйДокумент;
ТабДок1.Область("R1C1").Текст = "Данные по продажам";
// ... заполнение данными ...

ЭлементПакета1 = Пакет.Состав.Добавить(ТабДок1);
ЭлементПакета1.Наименование = "Продажи_2023"; // Это имя станет названием закладки

// Формируем второй лист (например, остатки)
ТабДок2 = Новый ТабличныйДокумент;
ТабДок2.Область("R1C1").Текст = "Текущие остатки";
// ... заполнение данными ...

ЭлементПакета2 = Пакет.Состав.Добавить(ТабДок2);
ЭлементПакета2.Наименование = "СкладскиеОстатки";

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

Выясним причину, почему этот способ считается приоритетным. Он работает на стороне сервера (в том числе под Linux), не требует стороннего ПО и корректно передает форматирование, шрифты и объединение ячеек из 1С в Excel.

Способ 2: Прямая работа со структурой XLSX (ZIP + XML)

Разберем ситуацию, когда требуется более тонкая настройка или работа с очень большими объемами данных, при которых штатные механизмы могут потреблять много оперативной памяти. Формат .xlsx — это фактически ZIP-архив, содержащий XML-файлы с данными и описанием структуры.

Проанализируем технологию "Метод шаблона":

  1. Заранее подготовим файл Excel в редакторе (Excel, LibreOffice или Р7-Офис). Настроим в нем все необходимые листы, шапки, стили и формулы.
  2. Загрузим этот файл в 1С как Макет с типом "Двоичные данные".
  3. При необходимости выгрузки программно извлекаем макет во временную папку и распаковываем его с помощью объекта ЧтениеZipФайла.
  4. Внутри распакованной структуры нас интересуют файлы в папке xl/worksheets/ (sheet1.xml, sheet2.xml и т.д.). Эти файлы представляют собой XML-описание содержимого каждого листа.
  5. С помощью ЗаписьXML или простой замены строк в текстовом файле мы подставляем свои данные в нужные теги.
  6. Запаковываем папку обратно в ZIP с помощью ЗаписьZipФайла и меняем расширение на .xlsx.

Этот метод требует глубоких знаний структуры OpenXML, но он является самым быстрым и гибким, так как позволяет изменять только данные, сохраняя сложное форматирование и макросы исходного шаблона.

Способ 3: Формат XML Spreadsheet 2003

Посмотрим на более простой вариант работы с текстовыми данными — формат .xml (Excel 2003). Несмотря на возраст, современные версии офисных пакетов (включая LibreOffice и Р7) отлично его открывают.

Выясним преимущества этого подхода:

  1. Это один текстовый файл (не архив).
  2. Он поддерживает описание нескольких листов (тег <Worksheet ss:Name="ИмяЛиста">).
  3. Его легко формировать через ЗаписьТекста или ЗаписьXML простым перебором выборки из запроса.

Однако помните о недостатке: при открытии такого файла в Excel пользователь может увидеть предупреждение о несовпадении расширения файла и его содержимого. После нажатия кнопки "Да" файл откроется корректно со всеми листами и стилями.

Способ 4: Конвертация через консольные утилиты

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

Рассмотрим примерный алгоритм:

  1. 1С сохраняет данные в несколько временных HTML-файлов или CSV.
  2. Используя команду ЗапуститьПриложение, вызывается исполняемый файл офисного пакета с ключами для конвертации или объединения этих файлов в один XLSX.

Это специфический способ, который удобен, если на сервере уже настроена среда автоматизации и установлены соответствующие редакторы.

Рекомендации и важные моменты

Подводя итог, отметим критические моменты при работе без COM-объектов:

Ограничения имен листов: При использовании ПакетОтображаемыхДокументов.Наименование строго следите за тем, чтобы имена листов не превышали 31 символ и не содержали запрещенных знаков (таких как :, \, /, ?, *, [, ]). Нарушение этого правила приведет к ошибке при открытии файла в Excel.

Память: Формирование огромных табличных документов (десятки тысяч строк на многих листах) может привести к нехватке оперативной памяти на сервере 1С. В таких случаях рекомендуем либо разбивать выгрузку на части, либо использовать "Способ 2" с прямой правкой XML-файлов, так как он позволяет обрабатывать данные потоково.

Версия платформы: Всегда проверяйте доступность методов. Объект ПакетОтображаемыхДокументов и возможность записи в XLSX появились в платформе 8.3. Если вы работаете на более старых версиях (например, 8.2 или ранние 8.3), вам будут доступны только методы работы с XML, использование внешних компонент или специализированный импорт данных из различных форматов.

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

← На главную