Как программно конвертировать файлы Word и Excel в PDF без установки MS Office в 1С

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

В процессе автоматизации документооборота в 1С программисты часто сталкиваются с задачей конвертации приходящих файлов Microsoft Office (форматов .doc, .docx, .xls, .xlsx) в универсальный формат PDF. Это необходимо для последующего визуального контроля, отправки по электронной почте, интеграции с личными кабинетами клиентов или для наложения квалифицированной электронной подписи (КЭП).

Традиционный подход с использованием COM-объектов (Word.Application и Excel.Application) требует обязательной установки лицензионного пакета MS Office на сервере или рабочей машине. Более того, сама компания Microsoft крайне не рекомендует использовать офисные приложения в неинтерактивных сессиях (на сервере), так как это часто приводит к зависанию процессов, утечкам оперативной памяти и проблемам с правами доступа DCOM.

В этой статье мы подробно разберем, как решить задачу конвертации офисных документов в PDF полностью программно, стабильно и без установки Microsoft Office на сервере 1С.

Решение 1. Нативный метод 1С для конвертации Excel (XLS/XLSX)

Если перед вами стоит задача конвертировать только табличные документы Excel (файлы с расширениями .xls, .xlsx или .ods), вам вообще не требуются сторонние программы, библиотеки или виртуальные принтеры. Начиная с версии платформы 8.3.6, встроенный объект 1С ТабличныйДокумент умеет напрямую читать и записывать файлы внешних форматов.

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

Проанализируем пример кода для реализации этой задачи:


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

Преимущества метода: работает чрезвычайно быстро, полностью автономно, не требует стороннего софта, совместим как с Windows, так и с Linux-серверами 1С. Единственное ограничение — данный метод не подходит для файлов Word (.docx).

Решение 2. Использование LibreOffice в фоновом режиме (Headless mode)

Для конвертации текстовых файлов Word (.doc, .docx) и сложных таблиц Excel наиболее надежным бесплатным решением является использование офисного пакета с открытым исходным кодом LibreOffice. Он отлично справляется с рендерингом документов Майкрософт и поддерживает полноценную работу через интерфейс командной строки.

Вы можете установить LibreOffice на сервер или использовать его Portable-версию, которую достаточно просто скопировать в каталог на жестком диске. Для конвертации мы будем запускать приложение LibreOffice в специальном «невидимом» режиме (headless).

Рассмотрим пример кода на языке 1С, который формирует параметры командной строки и запускает фоновое приложение для конвертации:


// Процедура конвертации любого офисного документа через LibreOffice
Функция КонвертироватьВPDF_ЧерезLibreOffice(ПутьКИсходномуФайлу, ПапкаНазначения, ПутьКSofficeExe) Экспорт
    
    // Проверяем существование исполняемого файла конвертера
    ФайлКонвертера = Новый Файл(ПутьКSofficeExe);
    Если Не ФайлКонвертера.Существует() Тогда
        ВызватьИсключение "Не найден исполняемый файл LibreOffice по пути: " + ПутьКSofficeExe;
    КонецЕсли;
    
    // Оборачиваем пути в кавычки на случай наличия пробелов
    ШаблонЗапуска = """%1"" --headless --convert-to pdf --outdir ""%2"" ""%3""";
    СтрокаЗапуска = СтрШаблон(ШаблонЗапуска, ПутьКSofficeExe, ПапкаНазначения, ПутьКИсходномуФайлу);
    
    // Запуск приложения в синхронном режиме (1С будет ждать окончания работы конвертера)
    КодВозврата = Неопределено;
    ЗапуститьПриложение(СтрокаЗапуска, , Истина, КодВозврата);
    
    Если КодВозврата <> 0 Тогда
        ЗаписьЖурналаРегистрации("Конвертация в PDF", 
            УровеньЖурналаРегистрации.Предупреждение, , , 
            "Процесс LibreOffice завершился с кодом ошибки: " + Строка(КодВозврата));
        Возврат Ложь;
    КонецЕсли;
    
    Возврат Истина;
    
КонецФункции

При использовании этого метода важно учитывать несколько нюансов:

  1. Параметр --outdir указывает только целевую директорию, куда будет помещен итоговый файл. Имя файла будет совпадать с исходным документом, но расширение изменится на .pdf.
  2. Для работы на сервере под учетной записью службы (например, USR1CV8) убедитесь, что у этой учетной записи есть права на чтение каталога установки LibreOffice и права на запись в целевую папку.
  3. В параметрах вызова функции ЗапуститьПриложение третьим параметром мы передаем значение Истина. Это критически важно, так как код 1С приостанавливает свое выполнение до тех пор, пока фоновый процесс LibreOffice полностью не завершит генерацию PDF-файла.

Решение 3. Использование специализированных .NET-библиотек (DLL)

Если вам требуется максимальная скорость работы и независимость от внешних тяжелых приложений типа LibreOffice, отличным выбором станет интеграция специализированных библиотек обработки документов на платформе .NET. К таким библиотекам относятся решения от SautinSoft (например, SautinSoft.Document) или отраслевой стандарт Aspose (Aspose.Words и Aspose.Cells).

Эти библиотеки полностью автономны, не требуют наличия установленного офиса и работают напрямую со структурой XML-файлов open-форматов. Для интеграции с 1С обычно пишется небольшая DLL-обертка на C# (COM-видимый объект) или используется технология .NET Bridge (например, компонента Elisy .NET Bridge).

Разберем логику работы такого решения на концептуальном уровне:

  1. В среде разработки C# создается класс-обертка, подключающий через NuGet нужную библиотеку (например, бесплатную версию Spire.Doc или коммерческую Aspose.Words).
  2. Создается метод, принимающий два строковых параметра: путь к исходному файлу и путь сохранения PDF.
  3. Компилируется DLL-библиотека, которая регистрируется в системе через утилиту regasm.exe.
  4. В коде 1С вызов происходит стандартным для COM-объектов образом:

// Пример подключения внешней зарегистрированной COM-библиотеки .NET
Попытка
    КонвертерБиблиотека = Новый COMОбъект("MyCompany.OfficeConverter");
    КонвертерБиблиотека.ConvertToPdf(ПутьКФайлуDocx, ПутьКФайлуPDF);
Исключение
    Сообщить("Ошибка вызова .NET компоненты: " + ОписаниеОшибки());
КонецПопытки;

Важное предупреждение: при использовании сторонних библиотек всегда обращайте внимание на особенности лицензирования. Бесплатные версии часто накладывают ограничения на количество страниц в документе или добавляют водяные знаки на результирующий PDF-файл.

Решение 4. Настройка виртуального PDF-принтера и «Горячих папок»

Если вы не хотите вносить изменения в конфигурацию 1С или писать сложный код вызова внешних утилит, можно автоматизировать конвертацию на уровне операционной системы с использованием роботизированной платформы OneRPA или утилит автоматизации потоков документов (например, FolderMill или серверных версий PDFCreator).

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

  1. На сервере устанавливается специализированное ПО, которое отслеживает появление файлов в определенных папках (так называемые Hot Folders или «Горячие папки»). Настраивается папка «Входящие» (например, C:\InBox\) и папка «Исходящие» (C:\OutBox\).
  2. В 1С при получении файла Word или Excel программа просто копирует полученный файл в папку C:\InBox\ с помощью стандартных методов работы с файловой системой.
  3. Утилита мониторинга моментально обнаруживает новый файл, запускает внутренний процесс конвертации и сохраняет готовый PDF-файл в папку C:\OutBox\, удаляя исходный файл из входящей папки.
  4. 1С в фоновом задании с интервалом в несколько секунд опрашивает папку C:\OutBox\. Как только там появляется готовый файл с нужным именем, 1С считывает его, прикрепляет к объекту базы данных и удаляет из транзитного каталога.

Такой подход позволяет разгрузить рабочий процесс 1С и переложить обработку ошибок конвертации, зависших документов и тяжелых файлов на специализированную службу операционной системы, а автоматизировать сбор и обработку файлов из почты и FTP можно внешними средствами.

Резюме и рекомендации

Выбор конкретного решения зависит от технического ландшафта вашей системы:

← На главную