Почему зависает процесс WINWORD.EXE при работе через COM-объект на сервере 1С и как это исправить?

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

При выполнении серверного кода 1С для работы с офисными документами разработчики нередко сталкиваются с ситуацией, когда инициализация или открытие файла через COM-объект Word.Application приводит к бесконечному зависанию процесса WINWORD.EXE. При этом аналогичный код для Excel.Application может успешно отрабатывать. Выясним причину такого поведения подсистемы COM и разберем по шагам все способы устранения проблемы.

Посмотрим на типовой пример кода, вызывающий зависание на стороне сервера:


&НаСервере
Процедура ОбновитьWordОтображение()
    Word = Новый COMОбъект("Word.Application");
    Word.Documents.Open("D:\документ.doc"); // Процесс WINWORD.EXE зависает на этой строке
КонецПроцедуры

Причины зависания Microsoft Word в серверном контексте

Серверная служба 1С (ragent.exe) функционирует в неинтерактивной сессии Windows (Session 0). В отличие от интерактивного сеанса пользователя, здесь отсутствуют стандартный графический интерфейс, доступ к рабочему столу и привычные системные окружения. Зависание WINWORD.EXE вызывают следующие факторы:

  1. Отсутствие системных каталогов Desktop. Microsoft Office требует физического присутствия папки рабочего стола в системном профиле даже при работе в скрытом фоновом режиме.
  2. Ожидание ответа от принтера по умолчанию. В отличие от Excel, Microsoft Word при открытии документа всегда обращается к подсистеме печати для расчета параметров верстки, полей и отображения шрифтов. Если принтер по умолчанию не настроен или недоступен по сети, процесс зависает в цикле ожидания ответа от диспетчера печати (Print Spooler).
  3. Модальные диалоговые окна и предупреждения. Защищенный просмотр (Protected View), предупреждения безопасности, запросы на восстановление поврежденного документа или конвертацию блокируют поток выполнения, ожидая нажатия кнопки пользователем в скрытом окне.
  4. Неинициализированный профиль пользователя. Если служба сервера 1С запускается под системной или технической учетной записью, которая ни разу не входила в Windows интерактивно, Word не может создать и заблокировать базовый файл шаблона Normal.dotm.

Способ 1. Создание каталогов рабочего стола (Desktop) для системных профилей

Проанализируем разрядность операционной системы и сервера 1С. Для корректной инициализации COM-компонентов Office на 64-битной версии Windows необходимо вручную создать папки Desktop по обоим путям:

  1. Для 64-битных процессов: C:\Windows\System32\config\systemprofile\Desktop
  2. Для 32-битных процессов: C:\Windows\SysWOW64\config\systemprofile\Desktop

Важно: убедимся, что учетная запись, от имени которой запущена служба сервера 1С, имеет полные права доступа (Full Control) на созданные папки.

Способ 2. Настройка принтера по умолчанию для учетной записи службы

Разберем обязательное требование Word к наличию принтера:

  1. Авторизуемся на сервере под учетной записью, от имени которой стартует служба 1С:Предприятия.
  2. Перейдем в панель управления устройствами и принтерами.
  3. Установим в качестве принтера по умолчанию виртуальный локальный принтер (например, Microsoft Print to PDF или Microsoft XPS Document Writer).
  4. Категорически избегаем установки сетевых принтеров по умолчанию, так как сетевые задержки или недоступность принт-сервера вызовут зависание WINWORD.EXE.

Способ 3. Программное подавление диалогов и корректные параметры открытия

Рассмотрим, как правильно инициализировать COM-объект в коде 1С, чтобы исключить вывод скрытых окон:


&НаСервере
Процедура СконвертироватьДокументWord(ПутьКФайлу, ПутьHTML)
    Word = Новый COMОбъект("Word.Application");
    
    // Отключаем отображение любых системных предупреждений и диалогов
    Word.DisplayAlerts = 0;
    Word.Visible = Ложь;
    
    // Открываем документ без подтверждения конвертации и только для чтения
    // Параметры метода Open: FileName, ConfirmConversions, ReadOnly, AddToRecentFiles
    Документ = Word.Documents.Open(ПутьКФайлу, Ложь, Истина, Ложь);
    
    // Сохраняем в формате HTML (формат wdFormatHTML = 8, wdFormatFilteredHTML = 10)
    Документ.SaveAs(ПутьHTML, 8);
    
    // Закрываем документ и приложение с освобождением памяти
    Документ.Close(Ложь);
    Word.Quit();
    
    Word = Неопределено;
КонецПроцедуры

Способ 4. Настройка компонента DCOM

Если сервер 1С работает под 64-разрядным процессом, а пакет Office установлен 32-разрядный, либо приложению не хватает прав, выполним настройку через оснастку служб компонентов:

  1. Нажмем сочетание клавиш Win + R и выполним команду dcomcnfg (для 32-битного Office на x64 ОС используем mmc comexp.msc /32).
  2. Перейдем по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  3. Найдем компонент Документ Microsoft Word (или Microsoft Word Application).
  4. Откроем свойства компонента, перейдем на вкладку Удостоверение (Identity) и выберем вариант Указанный пользователь (This user), указав данные администратора или служебного пользователя с подтвержденными правами.
  5. На вкладке Безопасность предоставим права на запуск, активацию и доступ для пользователя службы 1С.

Способ 5. Альтернативные методы без использования COM-объекта Word

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

  1. Использование консольных утилит и офисных пакетов (LibreOffice). Конвертацию файлов .doc и .docx в форматы .html или .pdf можно выполнять вызовом утилиты командной строки через метод платформы ЗапуститьПриложение или КомандаСистемы.
    
    Команда = "soffice --headless --convert-to html " + ПутьКФайлу + " --outdir " + КаталогВыгрузки;
    ЗапуститьПриложение(Команда, , Истина);
    
  2. Прямой разбор структуры DOCX. Документы формата DOCX являются ZIP-архивами с XML-файлами внутри. С помощью объектов платформы ЧтениеZipФайла и ЧтениеXML можно извлекать текст и таблицы напрямую, полностью исключив зависимость от установленных офисных пакетов на сервере.
← На главную