Как программно заполнить документ Word на сервере 1С и сохранить его в формате PDF

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

Одной из классических и в то же время трудоемких задач в 1С является автоматизация документооборота с использованием внешних приложений, таких как Microsoft Word. Часто возникает ситуация: код прекрасно работает на клиентской части (у пользователя на компьютере), но при попытке перенести его на сервер или запустить через регламентное задание он «зависает» или выдает ошибки. В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько надежных способов решения этой задачи.

Причина проблемы: Почему Word «капризничает» на сервере

Прежде чем переходить к коду, выясним причину сбоев. Microsoft Word — это интерактивное приложение, созданное для работы в сессии пользователя. Когда 1С пытается запустить его на сервере (особенно в фоновом задании), возникают следующие препятствия:

  1. Отсутствие графического контекста: Серверная служба 1С работает в так называемой «Сессии 0», где нет рабочего стола.
  2. Права доступа: У пользователя, под которым запущена служба сервера 1С (например, USR1CV8), часто нет прав на инициализацию COM-объектов MS Office.
  3. Отсутствие системных папок: Word требует наличия папки Desktop в профиле системного пользователя для временных файлов, которой по умолчанию не существует в системных директориях.

Способ 1. Использование «Технического клиента»

Проанализируем самый простой с точки зрения программирования подход, предложенный участниками форума. Если код &НаКлиенте работает безупречно, мы можем создать выделенный сеанс пользователя, который будет заниматься только формированием документов.

Разберем алгоритм настройки:

  1. Создаем в базе специального пользователя (например, «РоботПечати»).
  2. Настраиваем автоматический запуск 1С под этим пользователем на сервере или отдельном ПК через планировщик заданий Windows, предварительно обеспечив копирование файлов между клиентом и сервером.
  3. В модуле управляемого приложения в обработчике ПриНачалеРаботыСистемы прописываем вызов вашей процедуры формирования документов.

Этот метод хорош тем, что Word запускается в полноценной интерактивной сессии, и вы избегаете всех «серверных» ошибок доступа к COM-объектам.

Способ 2. Настройка сервера для работы COM-объекта (Word.Application)

Если нам принципиально запускать код именно &НаСервере, необходимо подготовить среду Windows. Рассмотрим пошагово, что нужно сделать.

Шаг 1. Создание папок Desktop.

Для корректной инициализации Word на 64-битных серверах необходимо вручную создать следующие директории:

После создания папок необходимо дать пользователю, от имени которого работает сервер 1С, полные права на них.

Шаг 2. Настройка DCOM.

Проанализируем ситуацию, когда прав все равно недостаточно. Нам потребуется утилита dcomcnfg:

  1. Запустите «Службы компонентов» (dcomcnfg).
  2. Перейдите в «Компьютеры» — «Мой компьютер» — «Настройка DCOM».
  3. Найдите Microsoft Word Document.
  4. В свойствах на вкладке «Удостоверение» выберите «Указанный пользователь» и введите данные администратора сервера. Это заставит Word всегда запускаться в контексте с полными правами.

Способ 3. Программная реализация заполнения и сохранения в PDF

Посмотрим на пример кода, который выполняет замену меток в тексте и экспорт в PDF. Важно правильно использовать параметры метода SaveAs. Для сохранения в PDF используется значение 17 (wdFormatPDF).


// Пример серверной процедуры заполнения шаблона
Процедура СформироватьСертификатНаСервере(ДанныеСотрудника, ПутьКШаблону, ПутьКРезультату)
    
    Попытка
        Word = Новый COMОбъект("Word.Application");
        Word.Visible = Ложь; // На сервере всегда Ложь
        Word.DisplayAlerts = 0; // Отключаем уведомления
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка.Word", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    Попытка
        Документ = Word.Documents.Open(ПутьКШаблону);
        
        // Поиск и замена меток (например, {ФИО})
        Замена = Word.Selection.Find;
        Замена.Execute("{ФИО}",,,,,,,,, ДанныеСотрудника.ФИО, 2); 
        
        // Сохраняем как PDF (параметр 17)
        Документ.SaveAs(ПутьКРезультату, 17);
        
        Документ.Close(0); // Закрываем без сохранения изменений в шаблоне
    Исключение
        Сообщить("Ошибка обработки документа: " + ОписаниеОшибки());
    КонецПопытки;

    Word.Quit(); // Обязательно завершаем процесс
КонецПроцедуры

Важный момент: Всегда используйте блоки Попытка...Исключение и гарантированно закрывайте процесс Word.Quit(). Если этого не делать, при любой ошибке на сервере будет оставаться «зависший» процесс WINWORD.EXE, что со временем приведет к нехватке памяти.

Способ 4. Отказ от Word в пользу Табличного документа 1С (Рекомендуемый)

Выясним причину, по которой многие опытные разработчики стараются избегать использования COM на сервере. Это нестабильность. Самым надежным способом является использование встроенных средств 1С.

Рассмотрим алгоритм:

  1. Создайте в 1С обычный макет типа «Табличный документ».
  2. Оформите его визуально точно так же, как ваш Word-шаблон.
  3. Заполните параметры макета данными из базы.
  4. Используйте встроенный метод сохранения в PDF.

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетСертификата");
Область = Макет.ПолучитьОбласть("Тело");
Область.Параметры.ФИО = "Иванов Иван Иванович";
ТабДок.Вывести(Область);

// Прямое сохранение в PDF средствами 1С
ТабДок.Записать("C:\Sertificates\Sert.pdf", ТипФайлаТабличногоДокумента.PDF);

Преимущества этого метода:

Способ 5. Использование LibreOffice (Headless mode)

Если макет в 1С создать невозможно (например, очень сложная верстка docx), можно использовать LibreOffice. Он отлично работает через командную строку без графического интерфейса.

Проанализируем команду вызова:


КомандаЗапуска = """C:\Program Files\LibreOffice\program\soffice.exe"" --headless --convert-to pdf ""C:\Docs\file.docx"" --outdir ""C:\Docs\""";
ЗапуститьПриложение(КомандаЗапуска, , Истина);

Параметр --headless сообщает программе, что её нужно запустить как сервис без окна. Это гораздо стабильнее для серверных фоновых заданий, чем использование COM-объекта.

Подводя итог, можно сказать следующее: если задача разовая и простая — используйте настройку Desktop папок и DCOM. Если же вы строите надежную корпоративную систему — переводите шаблоны в Табличные документы 1С. Это избавит вас от зависимости от стороннего ПО и проблем с обновлениями Windows.

← На главную