При автоматизации бизнес-процессов, например, в 1С:Документооборот, часто возникает необходимость преобразования документов формата doc или docx в pdf — для этого подойдёт генератор документов Word с конвертацией в PDF. Стандартный подход с использованием COM-объектов (через Excel.Application или Word.Application) на серверной стороне считается нежелательным из-за проблем со стабильностью, утечками памяти и невозможностью работы в некоторых серверных ОС (например, Linux). Рассмотрим, как реализовать этот процесс надежно и эффективно.
Использование COM-объектов на сервере приводит к тому, что в памяти запускается полноценный экземпляр приложения MS Office. Это создает огромную нагрузку на сервер, требует наличия лицензии на офис на каждой машине, где работает сервер 1С, и часто зависает, если документ содержит диалоговые окна или ошибки форматирования. Мы с вами разберем альтернативные пути, которые позволяют выполнять задачу «тихо» и безопасно.
Если на вашем сервере установлен Microsoft Word, но вы не хотите использовать прямую автоматизацию через COM, можно воспользоваться специализированной утилитой DocTo. Она работает как обертка над функционалом Word, но позволяет запускать конвертацию пакетно через командную строку.
Чтобы автоматизировать этот процесс в 1С, вам нужно использовать объект WScript.Shell для вызова консольной команды. Рассмотрим, как это выглядит на практике:
// Пример формирования команды для вызова DocTo через 1С
Команда = "docto -f ""C:\InputDocs"" -O ""C:\OutputPDF"" -T wdFormatPDF -OX .pdf";
ЗапуститьПриложение(Команда);
Это решение позволяет выполнять пакетную обработку всех файлов в каталоге, что идеально подходит для бизнес-процессов, где в ходе одного этапа нужно обработать множество документов.
Одним из самых мощных и бесплатных инструментов является LibreOffice. В отличие от Word, он имеет «headless-режим», то есть запуск без графического интерфейса, что специально создано для серверных задач.
Мы можем настроить 1С так, чтобы она передавала файл во временную папку, а затем запускала конвертацию командой:
// Команда для конвертации через LibreOffice
ПутьКLibreOffice = "C:\Program Files\LibreOffice\program\soffice.exe";
Команда = ПутьКLibreOffice + " --headless --convert-to pdf --outdir ""C:\TempPDF"" ""C:\SourceDoc.docx""";
ЗапуститьПриложение(Команда);
Преимущества этого подхода:
Если вы хотите использовать системные возможности, можно настроить «расшаренный» принтер, который сохраняет документы в PDF. Например, при использовании таких решений как CutePDF или doPDF, можно отправлять документы на печать программно.
Рассмотрим структуру вызова печати через командную строку:
// Отправка файла на печать через системный принтер
Команда = "print /d:\\%COMPUTERNAME%\CutePDF C:\Files\test.txt";
ЗапуститьПриложение(Команда);
Однако стоит отметить, что этот метод менее гибкий в плане управления именем выходного файла. Его лучше использовать для простых задач, где именование PDF не является критически важным бизнес-требованием.
Чтобы внедрить эти решения в ваш бизнес-процесс, придерживайтесь следующего алгоритма:
docx.ЗапуститьПриложение, ожидайте завершения работы утилиты и проверяйте наличие файла в целевой папке. Если файл появился, прикрепляйте его к объекту 1С через ПрисоединенныеФайлы.Используя эти методы, вы сможете построить надежную систему автоматической конвертации, которая не будет зависеть от нестабильных COM-объектов и позволит вам масштабировать инфраструктуру 1С без лишних проблем. А для решения смежной задачи предварительной нормализации исходных файлов в 1С:ДО пригодится механизм для автоматической конвертации устаревших документов doc в формат docx.