При разработке механизмов выгрузки данных из 1С в формат Excel разработчики часто сталкиваются с ограничениями стандартного метода ТабличныйДокумент.Записать() (хотя иногда требуется и экспорт печатных форм в растровое и векторное изображения). Основная проблема заключается в том, что один ТабличныйДокумент при сохранении формирует только один лист в книге Excel, что критично, когда нужна выгрузка журнала регистрации в Excel с группировкой. Традиционно эта задача решалась через COMОбъект("Excel.Application"), однако в современных реалиях (использование Linux-серверов, работа в облаках, отсутствие установленного Microsoft Office на сервере) использование COM становится невозможным или крайне нежелательным. В этой статье мы подробно разберем, как создать полноценную многостраничную книгу Excel средствами платформы 1С и альтернативными методами.
Проанализируем наиболее эффективный и штатный способ, встроенный в платформу 1С (начиная с версии 8.3.6). Этот метод позволяет объединить несколько табличных документов в один файл, где каждый документ станет отдельной вкладкой (листом) в книге Excel.
Рассмотрим по шагам алгоритм работы с этим объектом:
ПакетОтображаемыхДокументов.ТабличныйДокумент и заполняем его данными.Состав пакета.Наименование элемента пакета.Посмотрим на пример программной реализации этого метода:
// Создаем пакет
Пакет = Новый ПакетОтображаемыхДокументов;
// Формируем первый лист (например, продажи)
ТабДок1 = Новый ТабличныйДокумент;
ТабДок1.Область("R1C1").Текст = "Данные по продажам";
// ... заполнение данными ...
ЭлементПакета1 = Пакет.Состав.Добавить(ТабДок1);
ЭлементПакета1.Наименование = "Продажи_2023"; // Это имя станет названием закладки
// Формируем второй лист (например, остатки)
ТабДок2 = Новый ТабличныйДокумент;
ТабДок2.Область("R1C1").Текст = "Текущие остатки";
// ... заполнение данными ...
ЭлементПакета2 = Пакет.Состав.Добавить(ТабДок2);
ЭлементПакета2.Наименование = "СкладскиеОстатки";
// Сохраняем результат
Пакет.Записать(ПутьКФайлу, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
Выясним причину, почему этот способ считается приоритетным. Он работает на стороне сервера (в том числе под Linux), не требует стороннего ПО и корректно передает форматирование, шрифты и объединение ячеек из 1С в Excel.
Разберем ситуацию, когда требуется более тонкая настройка или работа с очень большими объемами данных, при которых штатные механизмы могут потреблять много оперативной памяти. Формат .xlsx — это фактически ZIP-архив, содержащий XML-файлы с данными и описанием структуры.
Проанализируем технологию "Метод шаблона":
Макет с типом "Двоичные данные".ЧтениеZipФайла.xl/worksheets/ (sheet1.xml, sheet2.xml и т.д.). Эти файлы представляют собой XML-описание содержимого каждого листа.ЗаписьXML или простой замены строк в текстовом файле мы подставляем свои данные в нужные теги.ЗаписьZipФайла и меняем расширение на .xlsx.Этот метод требует глубоких знаний структуры OpenXML, но он является самым быстрым и гибким, так как позволяет изменять только данные, сохраняя сложное форматирование и макросы исходного шаблона.
Посмотрим на более простой вариант работы с текстовыми данными — формат .xml (Excel 2003). Несмотря на возраст, современные версии офисных пакетов (включая LibreOffice и Р7) отлично его открывают.
Выясним преимущества этого подхода:
<Worksheet ss:Name="ИмяЛиста">).ЗаписьТекста или ЗаписьXML простым перебором выборки из запроса.Однако помните о недостатке: при открытии такого файла в Excel пользователь может увидеть предупреждение о несовпадении расширения файла и его содержимого. После нажатия кнопки "Да" файл откроется корректно со всеми листами и стилями.
Если в вашей организации используются альтернативные офисные пакеты, такие как LibreOffice или Р7-Офис, мы можем использовать их консольные возможности для сборки финального документа. Многие из них поддерживают работу в "headless" режиме (без графической оболочки).
Рассмотрим примерный алгоритм:
ЗапуститьПриложение, вызывается исполняемый файл офисного пакета с ключами для конвертации или объединения этих файлов в один XLSX.Это специфический способ, который удобен, если на сервере уже настроена среда автоматизации и установлены соответствующие редакторы.
Подводя итог, отметим критические моменты при работе без COM-объектов:
Ограничения имен листов: При использовании ПакетОтображаемыхДокументов.Наименование строго следите за тем, чтобы имена листов не превышали 31 символ и не содержали запрещенных знаков (таких как :, \, /, ?, *, [, ]). Нарушение этого правила приведет к ошибке при открытии файла в Excel.
Память: Формирование огромных табличных документов (десятки тысяч строк на многих листах) может привести к нехватке оперативной памяти на сервере 1С. В таких случаях рекомендуем либо разбивать выгрузку на части, либо использовать "Способ 2" с прямой правкой XML-файлов, так как он позволяет обрабатывать данные потоково.
Версия платформы: Всегда проверяйте доступность методов. Объект ПакетОтображаемыхДокументов и возможность записи в XLSX появились в платформе 8.3. Если вы работаете на более старых версиях (например, 8.2 или ранние 8.3), вам будут доступны только методы работы с XML, использование внешних компонент или специализированный импорт данных из различных форматов.
Мы проанализировали основные пути решения задачи. Самым сбалансированным по сложности и результату является использование ПакетОтображаемыхДокументов, так как он позволяет оставаться в рамках стандартного программирования на языке 1С, обеспечивая при этом современный результат в формате XLSX.