Как реализовать автоматическую конвертацию файлов различных форматов в PDF при загрузке в 1С?

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

При разработке систем электронного документооборота часто возникает задача унификации хранения файлов. Использование формата PDF в качестве стандарта позволяет обеспечить неизменность документа и удобство его просмотра на любых устройствах. В данной статье мы подробно разберем, как организовать процесс «перезаписи» входящих файлов (Word, OpenOffice, изображения) в формат PDF непосредственно в момент их загрузки пользователем в 1С.

Метод 1: Использование COM-объекта Microsoft Word

Если на рабочих станциях пользователей или на сервере установлен 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-объект может выдать ошибку при попытке доступа к принтерам или временным файлам.

Метод 2: Конвертация через LibreOffice/OpenOffice в режиме Headless

Если использование 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С.

Метод 3: Использование специализированных Java-утилит

Рассмотрим ситуацию, описанную в обсуждении, когда используется внешняя библиотека DocumentConverter.jar. Этот способ требует установленной среды JRE (Java Runtime Environment). Выясним основные причины возможных проблем при таком подходе:

  1. Разрядность Java: Практика показывает, что даже на 64-битных операционных системах для стабильной работы некоторых библиотек лучше устанавливать 32-битную версию JRE (x86). Она обычно располагается в папке C:\Program Files (x86)\Java\.
  2. Переменные окружения: Путь к java.exe должен быть прописан в системной переменной PATH. Проверить это можно командой where java в командной строке.
  3. Формат путей: Утилиты на Java часто требуют передачи путей к файлам в формате URL (с префиксом file:///).

Пример формирования строки запуска для Java-конвертера в 1С:


Команда = "java -jar DocumentConverter.jar -s=file:///D:/in.txt -d=file:///D:/out.pdf -t=text";
ЗапуститьПриложение(Команда, "C:\ConverterPath\", Истина);

Метод 4: Конвертация изображений (JPG, PNG, TIFF)

Для преобразования картинок в PDF использование тяжелых офисных пакетов избыточно. Проанализируем работу с утилитой ImageMagick. Она позволяет «обернуть» изображение в PDF-контейнер практически мгновенно.

Команда в консоли выглядит следующим образом: magick convert image.jpg document.pdf. В коде 1С это реализуется аналогично вызову других внешних программ. Если же вам необходимо объединить несколько изображений в один многостраничный PDF, можно воспользоваться утилитой PDFtk.

Архитектурные рекомендации: Фоновое выполнение

Выясним причину, по которой пользователи могут жаловаться на «тормоза» системы. Конвертация — это ресурсоемкий процесс. Если выполнять его прямо в момент нажатия кнопки «Выбрать файл», интерфейс приложения «замрет» до тех пор, пока внешняя программа не завершит работу.

Чтобы избежать блокировки интерфейса, рассмотрим стратегию фонового выполнения:

  1. Пользователь загружает оригинальный файл в систему.
  2. 1С создает ФоновоеЗадание, которое в отдельном потоке на сервере запускает конвертер.
  3. Пока идет конвертация, пользователь продолжает работу с формой.
  4. По завершении задания система обновляет статус файла и заменяет оригинал на PDF (или добавляет PDF как связанный файл).

Также стоит рассмотреть вариант регламентного задания. Если моментальная конвертация не критична, можно собирать все загруженные за день файлы в специальный регистр и обрабатывать их «пачкой» в ночное время, когда нагрузка на сервер минимальна.

Особенности работы на Linux-серверах

Если ваш сервер 1С работает под управлением Linux, использование COM-объектов MS Word невозможно. В этом случае единственным надежным вариантом остается LibreOffice. При этом крайне важно установить в систему шрифты Microsoft (пакет mscorefonts или аналоги), иначе при конвертации документов Word в PDF шрифты будут заменены на стандартные системные, что приведет к «съезжанию» верстки и некорректному отображению документа.

Для корректной передачи файлов между клиентом и сервером в управляемых формах всегда используем временное хранилище:


// На клиенте
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла);
ЗапуститьКонвертациюНаСервере(АдресХранилища, ИмяФайла);

// На сервере
&НаСервере
Процедура ЗапуститьКонвертациюНаСервере(АдресХранилища, ИмяФайла)
    Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
    Данные.Записать(ИмяВременногоФайла);
    
    // Вызов конвертера...
КонецПроцедуры

Подведем итог: Для небольших объемов и Windows-инфраструктуры оптимально использование COM Word. Для универсальности и работы с множеством форматов (включая ODT и HTML) лучше выбрать LibreOffice в headless-режиме. Для графических форматов идеально подходят легкие консольные утилиты вроде ImageMagick. Главное — всегда выносить процесс конвертации в фоновые задачи, чтобы обеспечить комфортную работу пользователей.

← На главную