При работе в клиент-серверном режиме 1С:Предприятие часто возникает задача формирования печатных форм в формате Microsoft Word. Традиционный путь через использование COM-соединения (Automation) на стороне сервера сегодня считается устаревшим и сопряжен с множеством технических трудностей. В современных конфигурациях, таких как ЗУП 3.1, реализованы гораздо более эффективные механизмы. Рассмотрим, почему стоит отказаться от классического COM и как правильно реализовать печать документов в современных реалиях.
Прежде чем переходить к решениям, разберем, почему попытка поднять процесс winword.exe на сервере приложений 1С — это «хождение по граблям». Проанализируем основные риски:
DCOMCNFG, предоставление прав пользователю, от имени которого запущен агент сервера 1С, и создание фиктивных системных папок Desktop.Самый современный и правильный способ для ЗУП 3.1 — использование механизмов Библиотеки стандартных подсистем (БСП). Начиная с определенных версий, БСП позволяет формировать документы в формате .docx (Office Open XML) программно, не запуская при этом сам Microsoft Word. Выясним преимущества этого метода:
Рассмотрим алгоритм реализации такой печатной формы:
1. Создадим макет типа Офисный документ в формате .docx. В самом макете будем использовать параметры в фигурных скобках, например: {v ФИОРаботника} или {v НомерДоговора}.
2. В модуле менеджера объекта (например, документа или справочника) проанализируем процедуру печати. Нам потребуется заполнить структуру данных и передать ее в подсистему печати.
Пример программного кода для подготовки данных:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ИмяМакета",
"ЗаголовокПечатнойФормы",
СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати));
КонецПроцедуры
Для работы с макетами Office используется метод УправлениеПечатью.СформироватьПечатныеФормыПоШаблону(). В этот метод передаются данные в виде структур или таблиц значений, где имена колонок совпадают с именами параметров в вашем шаблоне Word.
Если специфика бизнес-процесса требует использования именно COM-объекта (например, используются сложные макросы внутри шаблона), проанализируем ситуацию, как минимизировать риски. В этом случае логику следует разделить:
COMОбъект("Word.Application") и заполняем документ.Посмотрим на пример клиентского кода:
&НаКлиенте
Процедура СформироватьДокументНаКлиенте(ДанныеДляЗаполнения, ДвоичныеДанныеШаблона)
ПутьКФайлу = ПолучитьИмяВременногоФайла("docx");
ДвоичныеДанныеШаблона.Записать(ПутьКФайлу);
Попытка
WordApp = Новый COMОбъект("Word.Application");
Документ = WordApp.Documents.Open(ПутьКФайлу);
// Замена параметров
Для Каждого КлючИЗначение Из ДанныеДляЗаполнения Цикл
Поиск = Документ.Content.Find;
Поиск.Execute("[" + КлючИЗначение.Ключ + "]", , , , , , , , , КлючИЗначение.Значение, 2);
КонецЦикла;
WordApp.Visible = Истина;
Исключение
Сообщить("Ошибка при работе с Word: " + ОписаниеОшибки());
WordApp.Quit();
КонецПопытки;
КонецПроцедуры
Этот подход гарантирует, что Word запускается в интерактивном сеансе пользователя, где он может отображать ошибки и диалоговые окна, не блокируя работу сервера 1С.
Если вы все же решили использовать 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 самым надежным и производительным решением является использование штатной подсистемы Печать из БСП. Это избавляет от необходимости устанавливать офисный пакет на сервер и обеспечивает стабильную работу системы в любых режимах.