Как формировать печатные формы MS Word в 1С:ЗУП 3.1 при работе в клиент-серверном режиме?

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

При работе в клиент-серверном режиме 1С:Предприятие часто возникает задача формирования печатных форм в формате Microsoft Word. Традиционный путь через использование COM-соединения (Automation) на стороне сервера сегодня считается устаревшим и сопряжен с множеством технических трудностей. В современных конфигурациях, таких как ЗУП 3.1, реализованы гораздо более эффективные механизмы. Рассмотрим, почему стоит отказаться от классического COM и как правильно реализовать печать документов в современных реалиях.

Проблемы использования COM-соединения на сервере

Прежде чем переходить к решениям, разберем, почему попытка поднять процесс winword.exe на сервере приложений 1С — это «хождение по граблям». Проанализируем основные риски:

  1. Неинтерактивный сеанс: Microsoft Word изначально проектировался как настольное приложение для работы пользователя. В серверном сеансе (Session 0) у приложения нет рабочего стола. Это приводит к тому, что любое модальное окно или запрос на восстановление файла «подвешивает» процесс навсегда, так как нажать кнопку некому.
  2. Утечки ресурсов: Экземпляры Word часто не закрываются корректно при возникновении исключений в коде 1С, что приводит к накоплению процессов в памяти сервера и его последующей деградации.
  3. Сложность настройки прав: Для работы COM требуется тонкая настройка DCOMCNFG, предоставление прав пользователю, от имени которого запущен агент сервера 1С, и создание фиктивных системных папок Desktop.

Решение №1: Использование подсистемы «Печать» БСП (Рекомендуется)

Самый современный и правильный способ для ЗУП 3.1 — использование механизмов Библиотеки стандартных подсистем (БСП). Начиная с определенных версий, БСП позволяет формировать документы в формате .docx (Office Open XML) программно, не запуская при этом сам Microsoft Word. Выясним преимущества этого метода:

Рассмотрим алгоритм реализации такой печатной формы:

1. Создадим макет типа Офисный документ в формате .docx. В самом макете будем использовать параметры в фигурных скобках, например: {v ФИОРаботника} или {v НомерДоговора}.

2. В модуле менеджера объекта (например, документа или справочника) проанализируем процедуру печати. Нам потребуется заполнить структуру данных и передать ее в подсистему печати.

Пример программного кода для подготовки данных:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм,
        "ИмяМакета",
        "ЗаголовокПечатнойФормы",
        СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати));

КонецПроцедуры

Для работы с макетами Office используется метод УправлениеПечатью.СформироватьПечатныеФормыПоШаблону(). В этот метод передаются данные в виде структур или таблиц значений, где имена колонок совпадают с именами параметров в вашем шаблоне Word.

Решение №2: Гибридный метод (Подготовка данных на сервере, печать на клиенте)

Если специфика бизнес-процесса требует использования именно COM-объекта (например, используются сложные макросы внутри шаблона), проанализируем ситуацию, как минимизировать риски. В этом случае логику следует разделить:

  1. На сервере: Собираем все необходимые данные в структуру или таблицу значений. Получаем двоичные данные шаблона из макета 1С.
  2. Передача на клиент: Передаем структуру данных и двоичные данные файла на сторону клиентского приложения.
  3. На клиенте: Сохраняем временный файл, инициализируем COMОбъект("Word.Application") и заполняем документ.

Посмотрим на пример клиентского кода:


&НаКлиенте
Процедура СформироватьДокументНаКлиенте(ДанныеДляЗаполнения, ДвоичныеДанныеШаблона)
    ПутьКФайлу = ПолучитьИмяВременногоФайла("docx");
    ДвоичныеДанныеШаблона.Записать(ПутьКФайлу);
    
    Попытка
        WordApp = Новый COMОбъект("Word.Application");
        Документ = WordApp.Documents.Open(ПутьКФайлу);
        
        // Замена параметров
        Для Каждого КлючИЗначение Из ДанныеДляЗаполнения Цикл
            Поиск = Документ.Content.Find;
            Поиск.Execute("[" + КлючИЗначение.Ключ + "]", , , , , , , , , КлючИЗначение.Значение, 2);
        КонецЦикла;
        
        WordApp.Visible = Истина;
    Исключение
        Сообщить("Ошибка при работе с Word: " + ОписаниеОшибки());
        WordApp.Quit();
    КонецПопытки;
КонецПроцедуры

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

Особенности настройки сервера для COM (крайний случай)

Если вы все же решили использовать COM-объект на сервере (например, для регламентных заданий без участия пользователя), необходимо выполнить специфические настройки операционной системы. Разберем их по шагам:

1. Создайте папку Desktop в профиле системной учетной записи. Без этой папки Word часто выдает ошибку инициализации в неинтерактивном режиме.

Для 64-битных систем: C:\Windows\SysWOW64\config\systemprofile\Desktop

Для 32-битных систем: C:\Windows\System32\config\systemprofile\Desktop

2. В утилите dcomcnfg (Службы компонентов) найдите Microsoft Word Document и на закладке «Удостоверение» установите запуск от имени конкретного пользователя (администратора), а не от «Запускающего пользователя» или «Системной учетной записи».

Подведем итог: Для конфигурации ЗУП 3.1 самым надежным и производительным решением является использование штатной подсистемы Печать из БСП. Это избавляет от необходимости устанавливать офисный пакет на сервер и обеспечивает стабильную работу системы в любых режимах.

← На главную