При разработке систем электронного документооборота часто возникает задача унификации хранения файлов. Использование формата PDF в качестве стандарта позволяет обеспечить неизменность документа и удобство его просмотра на любых устройствах. В данной статье мы подробно разберем, как организовать процесс «перезаписи» входящих файлов (Word, OpenOffice, изображения) в формат PDF непосредственно в момент их загрузки пользователем в 1С.
Если на рабочих станциях пользователей или на сервере установлен Microsoft Office, самым логичным решением для конвертации файлов форматов .doc и .docx будет использование механизма COM-соединения. Проанализируем типичную ошибку новичков: использование метода SaveAs без указания типа формата. В этом случае файл сохраняется с расширением .pdf, но внутри остается структурой Word, что приводит к ошибке при открытии.
Для корректной работы необходимо использовать метод ExportAsFixedFormat. Рассмотрим правильный алгоритм реализации:
// Создаем объект приложения Word
Word = Новый COMОбъект("Word.Application");
Word.Visible = Ложь;
Word.DisplayAlerts = 0; // Отключаем уведомления
// Открываем исходный документ
ПутьКИсходномуФайлу = "C:\Files\MyDoc.docx";
Документ = Word.Documents.Open(ПутьКИсходномуФайлу);
// Определяем путь для сохранения PDF
ПутьКPDF = "C:\Files\MyDoc.pdf";
// Выполняем экспорт в PDF (Параметр 17 соответствует формату PDF)
Документ.ExportAsFixedFormat(ПутьКPDF, 17);
// Закрываем документ и приложение
Документ.Close(0); // 0 - без сохранения изменений в оригинале
Word.Quit();
Word = Неопределено;
Важный нюанс: Если конвертация происходит на стороне сервера, необходимо убедиться, что у пользователя, под которым запущена служба 1С (например, USR1CV8), созданы папки Desktop в профиле (для 64-битных систем это C:\Windows\SysWOW64\config\systemprofile\Desktop), иначе COM-объект может выдать ошибку при попытке доступа к принтерам или временным файлам.
Если использование MS Office невозможно или планируется работа на Linux-сервере, отличным бесплатным решением станет LibreOffice. Он поддерживает огромное количество форматов (odt, rtf, txt, xlsx, html). Разберем, как запустить конвертацию через командную строку, не открывая графический интерфейс программы.
Для этого используется так называемый «безголовый» режим (headless mode). Проанализируем структуру команды:
// Пример вызова через ЗапуститьПриложение
ПутьКПрограмме = "C:\Program Files\LibreOffice\program\soffice.exe";
ПараметрыЗапуска = "--headless --convert-to pdf --outdir ""C:\Temp"" ""C:\Files\Source.odt""";
ЗапуститьПриложение(ПутьКПрограмме + " " + ПараметрыЗапуска, , Истина);
В данном примере --convert-to pdf указывает целевой формат, а --outdir — папку, куда будет помещен результат. Использование параметра Истина в методе ЗапуститьПриложение заставляет систему дождаться окончания процесса конвертации перед тем, как продолжить выполнение кода 1С.
Рассмотрим ситуацию, описанную в обсуждении, когда используется внешняя библиотека DocumentConverter.jar. Этот способ требует установленной среды JRE (Java Runtime Environment). Выясним основные причины возможных проблем при таком подходе:
C:\Program Files (x86)\Java\.java.exe должен быть прописан в системной переменной PATH. Проверить это можно командой where java в командной строке.file:///).Пример формирования строки запуска для Java-конвертера в 1С:
Команда = "java -jar DocumentConverter.jar -s=file:///D:/in.txt -d=file:///D:/out.pdf -t=text";
ЗапуститьПриложение(Команда, "C:\ConverterPath\", Истина);
Для преобразования картинок в PDF использование тяжелых офисных пакетов избыточно. Проанализируем работу с утилитой ImageMagick. Она позволяет «обернуть» изображение в PDF-контейнер практически мгновенно.
Команда в консоли выглядит следующим образом: magick convert image.jpg document.pdf. В коде 1С это реализуется аналогично вызову других внешних программ. Если же вам необходимо объединить несколько изображений в один многостраничный PDF, можно воспользоваться утилитой PDFtk.
Выясним причину, по которой пользователи могут жаловаться на «тормоза» системы. Конвертация — это ресурсоемкий процесс. Если выполнять его прямо в момент нажатия кнопки «Выбрать файл», интерфейс приложения «замрет» до тех пор, пока внешняя программа не завершит работу.
Чтобы избежать блокировки интерфейса, рассмотрим стратегию фонового выполнения:
ФоновоеЗадание, которое в отдельном потоке на сервере запускает конвертер.Также стоит рассмотреть вариант регламентного задания. Если моментальная конвертация не критична, можно собирать все загруженные за день файлы в специальный регистр и обрабатывать их «пачкой» в ночное время, когда нагрузка на сервер минимальна.
Если ваш сервер 1С работает под управлением Linux, использование COM-объектов MS Word невозможно. В этом случае единственным надежным вариантом остается LibreOffice. При этом крайне важно установить в систему шрифты Microsoft (пакет mscorefonts или аналоги), иначе при конвертации документов Word в PDF шрифты будут заменены на стандартные системные, что приведет к «съезжанию» верстки и некорректному отображению документа.
Для корректной передачи файлов между клиентом и сервером в управляемых формах всегда используем временное хранилище:
// На клиенте
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла);
ЗапуститьКонвертациюНаСервере(АдресХранилища, ИмяФайла);
// На сервере
&НаСервере
Процедура ЗапуститьКонвертациюНаСервере(АдресХранилища, ИмяФайла)
Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
Данные.Записать(ИмяВременногоФайла);
// Вызов конвертера...
КонецПроцедуры
Подведем итог: Для небольших объемов и Windows-инфраструктуры оптимально использование COM Word. Для универсальности и работы с множеством форматов (включая ODT и HTML) лучше выбрать LibreOffice в headless-режиме. Для графических форматов идеально подходят легкие консольные утилиты вроде ImageMagick. Главное — всегда выносить процесс конвертации в фоновые задачи, чтобы обеспечить комфортную работу пользователей.