Как исправить ошибки при работе с COM-объектом Word.Application в 1С на сервере

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

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

Анализ ситуации: Почему возникают ошибки

Типичная ситуация: используется 32-битный толстый клиент 1С на 64-битной операционной системе Windows Server 2012 R2. При попытке инициализации объекта COMОбъект("Word.Application") в контексте &НаКлиенте, но в рамках сессии, запущенной через механизм дополнительных обработок, система выдает ошибки доступа или невозможность активации приложения. Это происходит из-за того, что процесс WINWORD.exe пытается запуститься от имени служебного пользователя 1С (например, USR1CV8), у которого отсутствуют необходимые права в подсистеме DCOM и не инициализирован профиль пользователя в Windows.

Решение проблемы 1: Ошибка «Интерфейс не поддерживается (0x80004002)»

Эта ошибка чаще всего связана с отсутствием прав у пользователя, под которым работает служба 1С, на запуск и активацию COM-сервера Microsoft Word. Разберем шаги по настройке DCOM:

  1. Откроем оснастку «Службы компонентов» (команда dcomcnfg).
  2. Перейдем в раздел Компьютеры — Мой компьютер — Настройка DCOM.
  3. Найдем в списке компонент Microsoft Word Document (или {00020906-0000-0000-C000-000000000046}).
  4. В свойствах на вкладке Безопасность в разделах «Разрешения на запуск и активацию» и «Разрешения на доступ» установим переключатель в «Настроить» и добавим пользователя USR1CV8 (или того, под кем работает сервер 1С), предоставив ему полные права.
  5. На вкладке Удостоверение важно проверить, какой пользователь выбран. Если стоит «Запускающий пользователь», Word будет наследоваться от сессии 1С. Для стабильности в серверных сценариях иногда рекомендуют указать конкретного пользователя с правами администратора.

Решение проблемы 2: Ошибка «Не удается активизировать приложение»

Если объект создается, но на методе Activate() или Visible = Истина происходит сбой, это означает, что Word не может инициализировать графическое окно в неинтерактивной сессии или блокируется модальным окном. Проанализируем основные причины:

Создание системных папок Desktop. Microsoft Word требует наличия папки Desktop в профиле системного пользователя для корректной работы через COM, даже если вы не собираетесь ничего выводить на рабочий стол. Необходимо создать пустые папки по следующим путям:

Инициализация профиля пользователя. Служебный пользователь USR1CV8 по умолчанию не имеет полноценного интерактивного профиля. Чтобы устранить скрытые модальные окна (например, запрос инициалов при первом запуске или сообщение о восстановлении после сбоя), выполним следующие действия:

  1. Дадим пользователю USR1CV8 временные права на локальный вход в систему.
  2. Зайдем под этим пользователем на сервер через RDP.
  3. Запустим Microsoft Word вручную. Применим все лицензионные соглашения, введем инициалы и закроем программу.
  4. После этого права на вход можно отозвать, профиль будет создан.

Решение проблемы 3: Ошибка файла автозамены (MSO1049.acl)

Выясним причину еще одной скрытой ошибки: «Не удается сохранить файл автозамены... Нет прав на изменение». Word при запуске пытается перезаписать файлы словарей в %AppData%\Microsoft\Office. Если у пользователя 1С нет прав на запись в эти каталоги, COM-объект будет «висеть» в ожидании ответа пользователя.

Проанализируем решение: Убедимся, что у пользователя, под которым запускается Word, есть полные права на папку его профиля в C:\Users\ИмяПользователя\AppData. Если папки AppData нет, вернитесь к пункту интерактивного входа под этой учетной записью.

Программная реализация в 1С

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


&НаКлиенте
Процедура СформироватьДокументWord(ИмяМакета)
    
    // Получаем двоичные данные макета с сервера
    ДанныеМакета = ПолучитьДанныеМакетаНаСервере(ИмяМакета);
    
    Если ДанныеМакета = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ИмяФайла = ПолучитьИмяВременногоФайла("docx");
    ДанныеМакета.Записать(ИмяФайла);
    
    Попытка
        MSWord = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("Ошибка при запуске MS Word: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Попытка
        // Отключаем системные предупреждения самого Word
        MSWord.Displayalerts = 0; 
        
        Документ = MSWord.Documents.Open(ИмяФайла);
        MSWord.Visible = Истина;
        
        // Полезный прием: программное переключение состояния окна
        // помогает активировать приложение, если оно зависло в фоне
        MSWord.WindowState = 2; // wdWindowStateMinimize
        MSWord.WindowState = 1; // wdWindowStateMaximize
        
        MSWord.Activate();
        
        // Далее выполняем поиск и замену параметров в документе
        // ...
        
    Исключение
        MSWord.Quit();
        Сообщить("Произошла ошибка при обработке документа: " + ОписаниеОшибки());
    КонецПопытки;

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

&НаСервере
Функция ПолучитьДанныеМакетаНаСервере(ИмяМакета)
    ОбъектОбработка = РеквизитФормыВЗначение("Объект");
    Макет = ОбъектОбработка.ПолучитьМакет(ИмяМакета);
    
    // Если макет хранится как двоичные данные в макете типа "Двоичные данные"
    Возврат Макет;
КонецФункции

Рекомендации по стабильности

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

  1. Использование OpenXML (для файлов .docx) — это позволяет формировать файлы без установки Word на сервер вообще.
  2. Использование встроенных в 1С механизмов работы с офисными документами (объект ФорматированныйДокумент или макеты типа MS Word, которые 1С может открывать встроенными средствами).
  3. Если COM-объект неизбежен, всегда оборачивайте вызовы в блоки Попытка...Исключение и обязательно закрывайте процессы (MSWord.Quit()) в случае ошибки, чтобы не плодить «зомби-процессы» WINWORD.exe в памяти сервера.

Соблюдение этих правил и корректная настройка прав пользователя USR1CV8 позволят вам избежать большинства проблем с автоматизацией Microsoft Office в среде 1С.

← На главную