Как исправить ошибку «Отказано в доступе» при создании COM-объекта Word.Application на сервере 1С?

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

Разберем одну из самых распространенных и трудоемких проблем при автоматизации документооборота в 1С — программное создание документов Microsoft Word на стороне сервера. Ситуация часто выглядит так: на локальном компьютере разработчика (в файловой базе) код отрабатывает идеально, но стоит перенести базу на клиент-серверный вариант (SQL), как первая же строка Новый COMОбъект("Word.Application") выдает ошибку «Отказано в доступе».

Выясним причину этого поведения. Когда код выполняется на клиенте, Word запускается от имени текущего пользователя Windows, у которого есть рабочий стол и полные права. На сервере же код исполняется от имени системной службы (обычно это USR1CV8), которая работает в неинтерактивной сессии и ограничена в правах доступа к компонентам DCOM и папкам профиля. Рассмотрим по шагам, как настроить сервер для корректной работы.

Шаг 1. Проверка разрядности платформы и Microsoft Office

Проанализируем архитектурную совместимость. Если у вас установлен 64-битный сервер 1С, а Microsoft Office является 32-битным (что встречается в большинстве случаев), прямой вызов объекта может завершиться неудачей. Процесс 1С (64 бит) не может напрямую загрузить 32-битную библиотеку COM.

В этом случае нам потребуется настроить «обертку» через службу компонентов, чтобы запуск Word происходил через системный процесс dllhost.exe. Если же разрядности совпадают, мы переходим к настройке прав доступа, но помнить о различии путей в System32 и SysWOW64 необходимо в любом случае.

Шаг 2. Настройка компоненты в DCOM

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

  1. Нажмите Win + R, введите dcomcnfg и нажмите Enter.
  2. Перейдите по пути: Службы компонентов — Компьютеры — Мой компьютер — Настройка DCOM.
  3. Найдите в списке объект «Microsoft Word Document» (или «Документ Microsoft Word 97-2003»).
  4. Нажмите правой кнопкой мыши — Свойства.
  5. На вкладке «Безопасность» в разделах «Права на запуск и активацию» и «Права на доступ» выберите пункт «Настроить» и добавьте пользователя, от которого запущен сервер 1С (например, USR1CV8), предоставив ему все права.
  6. Важный нюанс: На вкладке «Удостоверение» (Identity) вместо «Запускающий пользователь» крайне рекомендуется выбрать «Указанный пользователь». Укажите данные учетной записи администратора сервера или специального пользователя, под которым Word хотя бы раз запускался интерактивно. Это позволит избежать блокировки процесса из-за скрытых диалоговых окон Office (например, окна активации или выбора формата файлов).

Шаг 3. Магия системных папок Desktop

Выясним одну из самых загадочных причин ошибки. Microsoft Word при инициализации через COM требует наличия папки Desktop в профиле пользователя, который его запускает. Поскольку служба 1С работает под системным профилем, этих папок в Windows по умолчанию нет.

Рассмотрим, где их нужно создать вручную (обязательно для обеих архитектур на 64-битных ОС):

  1. C:\Windows\System32\config\systemprofile\Desktop
  2. C:\Windows\SysWOW64\config\systemprofile\Desktop

После создания папок убедитесь, что у пользователя USR1CV8 (или того, под кем работает сервер 1С) есть права «Полный контроль» на эти директории. Это действие решает проблему в 80% случаев, когда права DCOM уже настроены.

Шаг 4. Анализ программного кода для сервера

Посмотрим на пример кода, который часто используют разработчики. Главная ошибка при работе на сервере — попытка сделать приложение видимым или использовать методы активации окна. На сервере нет «экрана», поэтому вызов Activate() или Visible = Истина приведет к ошибке «Не удается активизировать приложение».

Рассмотрим правильный подход к написанию кода для серверного контекста:


// 1. Получаем макет из хранилища или общих макетов
Шаблон = ПолучитьМакет("ДоговорПодряда");
// 2. Создаем временный файл во временной директории СЕРВЕРА
ИмяФайла = ПолучитьИмяВременногоФайла(".docx");
Шаблон.Записать(ИмяФайла);

Попытка
    // 3. Создаем объект
    ОбъектВорд = Новый COMОбъект("Word.Application");
Исключение
    Сообщить("Не удалось создать COM-объект Word. Проверьте настройки DCOM на сервере.");
    Возврат;
КонецПопытки;

// 4. Работаем в фоновом режиме
ОбъектВорд.Visible = Ложь; // На сервере всегда Ложь!
ОбъектВорд.DisplayAlerts = 0; // Отключаем все системные сообщения Word

Документы = ОбъектВорд.Documents;
Документ = Документы.Open(ИмяФайла);

// Выполняем действия по замене текста (пример)
// ПоискИЗаменаВВорде(Документ, "{НомерДоговора}", Номер);

// 5. Сохраняем результат
Документ.Save();
Документ.Close();
ОбъектВорд.Quit();

// 6. Передаем файл на клиент (если нужно открыть пользователю)
// Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));

Проанализируем ситуацию с ошибкой Метод объекта не обнаружен (Activate). Как мы видим из примера выше, на сервере этот метод просто не имеет смысла. Если ваша задача — заполнить шаблон и показать его пользователю, то правильный алгоритм выглядит так: Сформировать файл на сервере -> Поместить во временное хранилище -> Получить на клиенте -> Открыть локальным Word.

Шаг 5. Интерактивный запуск и лицензии

Если проблема сохраняется, проанализируем состояние лицензии Office. При первом запуске Word часто выводит окно «Добро пожаловать», «Примите лицензионное соглашение» или требования об обновлении. Служба 1С не может нажать кнопку «ОК» в этом окне, и процесс просто «виснет» в диспетчере задач.

Чтобы это исправить, выполните следующие действия:

Важное предостережение: Сама компания Microsoft официально не рекомендует использовать автоматизацию Office на стороне сервера (Server-side Automation). При высокой нагрузке процессы WINWORD.EXE могут не закрываться корректно и потреблять значительные ресурсы сервера. Если ваша система предполагает печать сотен договоров в час, рассмотрите переход на использование формата Open XML (прямая работа с .docx как с ZIP-архивом через средства 1С или внешние библиотеки), что гораздо стабильнее и быстрее.

← На главную