В процессе автоматизации документооборота в 1С программисты часто сталкиваются с задачей конвертации приходящих файлов Microsoft Office (форматов .doc, .docx, .xls, .xlsx) в универсальный формат PDF. Это необходимо для последующего визуального контроля, отправки по электронной почте, интеграции с личными кабинетами клиентов или для наложения квалифицированной электронной подписи (КЭП).
Традиционный подход с использованием COM-объектов (Word.Application и Excel.Application) требует обязательной установки лицензионного пакета MS Office на сервере или рабочей машине. Более того, сама компания Microsoft крайне не рекомендует использовать офисные приложения в неинтерактивных сессиях (на сервере), так как это часто приводит к зависанию процессов, утечкам оперативной памяти и проблемам с правами доступа DCOM.
В этой статье мы подробно разберем, как решить задачу конвертации офисных документов в PDF полностью программно, стабильно и без установки Microsoft Office на сервере 1С.
Если перед вами стоит задача конвертировать только табличные документы 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).
Для конвертации текстовых файлов 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 завершился с кодом ошибки: " + Строка(КодВозврата));
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
При использовании этого метода важно учитывать несколько нюансов:
--outdir указывает только целевую директорию, куда будет помещен итоговый файл. Имя файла будет совпадать с исходным документом, но расширение изменится на .pdf.USR1CV8) убедитесь, что у этой учетной записи есть права на чтение каталога установки LibreOffice и права на запись в целевую папку.ЗапуститьПриложение третьим параметром мы передаем значение Истина. Это критически важно, так как код 1С приостанавливает свое выполнение до тех пор, пока фоновый процесс LibreOffice полностью не завершит генерацию PDF-файла.Если вам требуется максимальная скорость работы и независимость от внешних тяжелых приложений типа LibreOffice, отличным выбором станет интеграция специализированных библиотек обработки документов на платформе .NET. К таким библиотекам относятся решения от SautinSoft (например, SautinSoft.Document) или отраслевой стандарт Aspose (Aspose.Words и Aspose.Cells).
Эти библиотеки полностью автономны, не требуют наличия установленного офиса и работают напрямую со структурой XML-файлов open-форматов. Для интеграции с 1С обычно пишется небольшая DLL-обертка на C# (COM-видимый объект) или используется технология .NET Bridge (например, компонента Elisy .NET Bridge).
Разберем логику работы такого решения на концептуальном уровне:
Spire.Doc или коммерческую Aspose.Words).regasm.exe.
// Пример подключения внешней зарегистрированной COM-библиотеки .NET
Попытка
КонвертерБиблиотека = Новый COMОбъект("MyCompany.OfficeConverter");
КонвертерБиблиотека.ConvertToPdf(ПутьКФайлуDocx, ПутьКФайлуPDF);
Исключение
Сообщить("Ошибка вызова .NET компоненты: " + ОписаниеОшибки());
КонецПопытки;
Важное предупреждение: при использовании сторонних библиотек всегда обращайте внимание на особенности лицензирования. Бесплатные версии часто накладывают ограничения на количество страниц в документе или добавляют водяные знаки на результирующий PDF-файл.
Если вы не хотите вносить изменения в конфигурацию 1С или писать сложный код вызова внешних утилит, можно автоматизировать конвертацию на уровне операционной системы с использованием роботизированной платформы OneRPA или утилит автоматизации потоков документов (например, FolderMill или серверных версий PDFCreator).
Принцип работы по этой схеме выглядит следующим образом:
C:\InBox\) и папка «Исходящие» (C:\OutBox\).C:\InBox\ с помощью стандартных методов работы с файловой системой.C:\OutBox\, удаляя исходный файл из входящей папки.C:\OutBox\. Как только там появляется готовый файл с нужным именем, 1С считывает его, прикрепляет к объекту базы данных и удаляет из транзитного каталога.Такой подход позволяет разгрузить рабочий процесс 1С и переложить обработку ошибок конвертации, зависших документов и тяжелых файлов на специализированную службу операционной системы, а автоматизировать сбор и обработку файлов из почты и FTP можно внешними средствами.
Выбор конкретного решения зависит от технического ландшафта вашей системы: