Как автоматизировать конвертацию Word и Excel в PDF на сервере Linux без использования COM?

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

Переход серверов 1С на операционные системы семейства Linux ставит перед разработчиками сложную задачу: как обрабатывать документы Microsoft Office, если привычные COM-объекты (такие как Word.Application или Excel.Application) здесь недоступны? В корпоративном документообороте часто требуется автоматическая конвертация входящих файлов в формат PDF для их последующей передачи через HTTP-сервисы или отображения в веб-клиенте. Рассмотрим подробнее, как решить эту задачу максимально эффективно, используя современные инструменты и штатные возможности платформы 1С.

Метод 1. Использование LibreOffice в headless-режиме (командная строка)

Это самый надежный и проверенный временем способ. На сервер Linux устанавливается офисный пакет LibreOffice (или его аналог OpenOffice), который умеет работать с документами через интерфейс командной строки без запуска графической оболочки (так называемый headless-режим).

Разберем по шагам процесс реализации:

  1. Установите LibreOffice на сервер. Для систем на базе Debian/Ubuntu это делается командой sudo apt-get install libreoffice.
  2. Убедитесь, что установлены шрифты Microsoft. Это критически важно, так как без них верстка документов .docx «поплывет». Установите пакет ttf-mscorefonts-installer.
  3. В коде 1С вызовите конвертацию через метод ЗапуститьПриложение().

Проанализируем пример кода для вызова конвертации:


// Путь к исполняемому файлу LibreOffice (обычно /usr/bin/soffice)
ПутьКПриложению = "/usr/bin/soffice";

// Формируем параметры запуска
// --headless: запуск без GUI
// --convert-to pdf: целевой формат
// --outdir: папка, куда сохранить результат
ПараметрыЗапуска = "--headless --convert-to pdf --outdir " + ПутьКПапкеРезультата + " " + ПутьКИсходномуФайлу;

// Запускаем процесс и ждем завершения (КодВозврата = 0 означает успех)
КодВозврата = 0;
ЗапуститьПриложение(ПутьКПриложению + " " + ПараметрыЗапуска, , Истина, КодВозврата);

Если КодВозврата <> 0 Тогда
    ЗаписатьЛогСобытия("Ошибка конвертации файла: " + ПутьКИсходномуФайлу);
КонецЕсли;

Важный нюанс: сервер 1С (пользователь usr1cv8) должен иметь права на чтение исходного файла и запись в целевую директорию. Также рекомендуется использовать временные папки через КаталогВременныхФайлов() для избежания конфликтов при одновременной работе нескольких сессий.

Метод 2. Штатные средства 1С для файлов Excel

Если ваша задача ограничивается только файлами .xls или .xlsx, выясним причину, по которой не всегда стоит использовать стороннее ПО. Платформа 1С начиная с версии 8.3 обладает встроенным механизмом чтения и записи табличных документов.

Посмотрим на пример реализации:


// Создаем объект ТабличныйДокумент
ТабДок = Новый ТабличныйДокумент;

// Читаем файл Excel напрямую (1С поддерживает форматы xls, xlsx)
Попытка
    ТабДок.Прочитать(ПутьКФайлуExcel, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    
    // Настраиваем параметры печати, чтобы PDF выглядел корректно
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; // или Портрет
    
    // Сохраняем в PDF
    ТабДок.Записать(ПутьКPDF, ТипФайлаТабличногоДокумента.PDF);
Исключение
    Сообщить("Не удалось сконвертировать Excel: " + ОписаниеОшибки());
КонецПопытки;

Этот метод работает быстрее, так как не требует запуска внешних процессов. Однако он имеет ограничение: 1С может некорректно отображать сложные диаграммы или специфическое форматирование ячеек, созданное в MS Excel. Для файлов Word (.doc, .docx) встроенного метода прямого преобразования в PDF в 1С на текущий момент нет.

Метод 3. Использование микросервиса Gotenberg (Docker-решение)

В современной микросервисной архитектуре рассмотрим подробнее использование Docker. Проект Gotenberg предоставляет готовое API для конвертации практически любых форматов (Office, HTML, Markdown) в PDF.

Почему это удобно:

  1. Ваш сервер 1С остается «чистым» — не нужно устанавливать LibreOffice, Java и сотни зависимостей.
  2. Взаимодействие происходит по стандартному протоколу HTTP.
  3. Высокая стабильность и масштабируемость.

Схема работы из 1С:

  1. Разворачиваете контейнер Gotenberg (docker run -p 3000:3000 gotenberg/gotenberg:7).
  2. В 1С формируете HTTPЗапрос типа POST.
  3. Передаете файл в теле запроса (в формате multipart/form-data).
  4. Получаете в ответе HTTPОтвет, тело которого является готовым бинарным файлом PDF.

Этот способ является наиболее современным («best practice») для высоконагруженных систем, так как позволяет вынести тяжелые операции конвертации на отдельный узел или сервер.

Метод 4. Python-скрипты как промежуточное звено

Если LibreOffice в командной строке работает недостаточно гибко (например, нужно скрыть определенные листы в Excel или добавить водяной знак), проанализируем ситуацию с использованием языка Python. В Linux-среде Python предустановлен почти везде.

Библиотека uno позволяет управлять LibreOffice через его внутренний API (Universal Network Objects). Вы можете написать короткий скрипт на Python, который будет принимать путь к файлу и возвращать PDF, а из 1С вызывать этот скрипт через ЗапуститьПриложение().

Преимущества этого подхода:

Технические рекомендации и устранение проблем

При реализации любого из вышеперечисленных методов обратите внимание на следующие моменты:

  1. Шрифты: Самая частая проблема — в PDF вместо текста видны «кракозябры» или текст съезжает. Убедитесь, что в системе установлены те же шрифты, которые использовались в исходном Word-файле.
  2. Права доступа: Пользователь, под которым запущен сервер 1С, должен иметь права на исполнение внешних утилит. В некоторых дистрибутивах (например, в CentOS с включенным SELinux) могут потребоваться дополнительные настройки политик безопасности.
  3. Параллелизм: LibreOffice по умолчанию не всегда стабильно обрабатывает несколько одновременных запросов в одной сессии пользователя. Если у вас много конвертаций, используйте параметр -env:UserInstallation, чтобы создавать для каждого процесса свою временную пользовательскую среду.
  4. Очистка временных файлов: Не забывайте удалять временные файлы после успешной отправки или сохранения PDF, иначе дисковое пространство на сервере быстро закончится.

Подведем итог: для простых задач с Excel идеально подходит штатный ТабличныйДокумент. Для полноценной работы с Word на Linux стандартом является связка 1С + LibreOffice Headless. Если же вы стремитесь к максимальной отказоустойчивости и чистоте архитектуры — используйте Docker-контейнеры с API-конвертерами.

← На главную