Переход серверной части 1С на операционную систему Linux становится все более массовым явлением. Однако этот процесс часто сопровождается техническими сложностями, связанными с отказом от привычных Windows-технологий. Одной из самых распространенных проблем является неработоспособность COM-объектов, в частности Excel.Application.
В среде Windows разработчики привыкли использовать OLE-автоматизацию для создания сложных отчетов Excel, объединения книг, настройки диаграмм и точного форматирования. На Linux "Excel крякнул", как выразился автор темы, и требуется искать альтернативы не только для формирования файлов. В этой статье мы подробно разберем, какие существуют варианты работы с файлами XLSX на сервере Linux, как объединять листы из разных книг и как правильно редактировать структуру XML-файлов средствами 1С.
Проанализируем доступные методы генерации и обработки Excel-файлов, которые не требуют установки MS Office на сервер.
Рассмотрим каждый из этих методов подробнее.
Это первое, на что стоит обратить внимание. Платформа 1С умеет сохранять табличные документы в формат XLSX без использования внешних библиотек. Это кроссплатформенный механизм, который работает и на Linux.
Если ваша задача — просто выгрузить данные в Excel, то нет смысла усложнять архитектуру. Создадим табличный документ и сохраним его:
ТабДок = Новый ТабличныйДокумент;
// Заполняем ТабДок данными...
// ...
ИмяФайла = "/tmp/report.xlsx";
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Преимущества:
Недостатки:
Если вам нужно просто объединить два отчета, можно попытаться вывести их в один табличный документ друг за другом или использовать разделители страниц, но полноценного разделения по вкладкам (листам) внутри одной книги XLSX штатными средствами добиться сложно без использования пакета отображения документов (который имеет свои ограничения). Для этой задачи можно использовать готовый инструмент для выгрузки данных из 1С в Excel с несколькими листами.
Если требования заказчика включают сложные графики, объединение разных листов из разных файлов в одну книгу, сохранение формул и специфическое форматирование, лучшим решением на Linux будет использование возможностей языка Python для взаимодействия с 1С.
Библиотека openpyxl является стандартом де-факто для работы с Excel без установленного Excel. Разберем алгоритм действий:
Пример кода на 1С для запуска скрипта:
Команда = "python3 /scripts/merge_excel.py " + ПутьКФайлу1 + " " + ПутьКФайлу2 + " " + ПутьКРезультату;
ЗапуститьПриложение(Команда, , Истина); // Истина - ждать завершения
Пример логики на стороне Python (псевдокод):
import openpyxl
# Открываем исходные книги
wb1 = openpyxl.load_workbook(sys.argv[1])
wb2 = openpyxl.load_workbook(sys.argv[2])
wb_result = openpyxl.Workbook()
# Копируем данные (упрощенно)
ws_res1 = wb_result.create_sheet("Отчет 1")
# ... цикл по ячейкам из wb1 ...
ws_res2 = wb_result.create_sheet("Отчет 2")
# ... цикл по ячейкам из wb2 ...
wb_result.save(sys.argv[3])
Этот подход позволяет реализовать любые "хотелки" бизнеса: группировки, закрепление областей, фильтры, сложные диаграммы, которые будут выглядеть как нативные объекты Excel.
Формат XLSX — это переименованный ZIP-архив, содержащий набор XML-файлов. Мы можем распаковать этот архив и менять содержимое XML-файлов напрямую из 1С. Это часто требуется, когда нужно точечно изменить атрибут, который платформа не поддерживает, или собрать файл из частей.
Однако, как справедливо заметили участники обсуждения, просто "склеить" XML файлы от разных книг не получится. В структуре XLSX есть файл sharedStrings.xml (общие строки), где текст хранится по индексам. При объединении книг нужно пересчитывать эти индексы, а также индексы стилей.
Тем не менее, редактирование атрибутов XML — задача решаемая. Разберем, как правильно менять XML в 1С, не переписывая файл построчно.
Чтобы изменить атрибут тега или добавить узел без полной ручной перезаписи файла, следует использовать объекты ЧтениеDOM, ПостроительDOM и ЗаписьDOM. Это позволяет загрузить XML в память как дерево объектов, внести изменения и сохранить обратно.
Посмотрим на пример изменения атрибута в XML файле:
// 1. Читаем XML файл
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКXMLФайлу);
// 2. Строим DOM-модель
Построитель = Новый ПостроительDOM;
ДокументDOM = Построитель.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
// 3. Ищем нужные элементы и меняем их
// Например, найдем корневой элемент и сменим атрибут
ЭлементКорневой = ДокументDOM.ЭлементДокумента;
Если ЭлементКорневой.ИмяУзла = "workbook" Тогда
ЭлементКорневой.УстановитьАтрибут("newAttribute", "Значение");
КонецЕсли;
// Или найдем элемент по имени тега (пример для листа)
СписокЛистов = ДокументDOM.ПолучитьЭлементыПоИмени("sheet");
Для Каждого ЛистXML Из СписокЛистов Цикл
// Меняем имя листа
ТекущееИмя = ЛистXML.ПолучитьАтрибут("name");
ЛистXML.УстановитьАтрибут("name", ТекущееИмя + "_New");
КонецЦикла;
// 4. Записываем измененный DOM обратно в файл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКXMLФайлу);
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ЗаписьXML.Закрыть();
Такой подход ("по фэн-шую") избавляет от необходимости парсить текст вручную и бояться нарушить структуру тегов. Однако стоит помнить, что DOM загружает весь файл в оперативную память, поэтому для очень больших XML-файлов (сотни мегабайт) это может быть ресурсоемко.
Если на сервере Linux установлен пакет LibreOffice, его можно использовать как конвертер. Это своего рода аналог COM-объекта, но работающий через консоль.
Команда запуска выглядит примерно так:
libreoffice --headless --convert-to xlsx source_file.xml --outdir /tmp/
Также можно использовать LibreOffice для выполнения макросов, написанных на Basic или Python, которые будут объединять книги. Это работает медленнее, чем openpyxl, и потребляет больше ресурсов сервера, но может быть полезно, если требуется идеальная совместимость с рендерингом офисных форматов.
Подводя итог обсуждению и анализу проблемы, сформируем рекомендации по выбору инструмента:
ТабличныйДокумент.Записать(..., ТипФайлаТабличногоДокумента.XLSX). Это работает быстро и надежно.openpyxl. Это наиболее гибкое и профессиональное решение для Linux-серверов.Таким образом, отсутствие Excel.Application на Linux не является тупиком, а лишь поводом перейти на более современные и производительные методы генерации отчетов.