Разберем одну из самых распространенных и трудоемких проблем при автоматизации документооборота в 1С — программное создание документов Microsoft Word на стороне сервера. Ситуация часто выглядит так: на локальном компьютере разработчика (в файловой базе) код отрабатывает идеально, но стоит перенести базу на клиент-серверный вариант (SQL), как первая же строка Новый COMОбъект("Word.Application") выдает ошибку «Отказано в доступе».
Выясним причину этого поведения. Когда код выполняется на клиенте, Word запускается от имени текущего пользователя Windows, у которого есть рабочий стол и полные права. На сервере же код исполняется от имени системной службы (обычно это USR1CV8), которая работает в неинтерактивной сессии и ограничена в правах доступа к компонентам DCOM и папкам профиля. Рассмотрим по шагам, как настроить сервер для корректной работы.
Проанализируем архитектурную совместимость. Если у вас установлен 64-битный сервер 1С, а Microsoft Office является 32-битным (что встречается в большинстве случаев), прямой вызов объекта может завершиться неудачей. Процесс 1С (64 бит) не может напрямую загрузить 32-битную библиотеку COM.
В этом случае нам потребуется настроить «обертку» через службу компонентов, чтобы запуск Word происходил через системный процесс dllhost.exe. Если же разрядности совпадают, мы переходим к настройке прав доступа, но помнить о различии путей в System32 и SysWOW64 необходимо в любом случае.
Основная часть настройки происходит в оснастке «Службы компонентов». Пройдем по шагам процесс делегирования прав:
Win + R, введите dcomcnfg и нажмите Enter.USR1CV8), предоставив ему все права.Выясним одну из самых загадочных причин ошибки. Microsoft Word при инициализации через COM требует наличия папки Desktop в профиле пользователя, который его запускает. Поскольку служба 1С работает под системным профилем, этих папок в Windows по умолчанию нет.
Рассмотрим, где их нужно создать вручную (обязательно для обеих архитектур на 64-битных ОС):
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopПосле создания папок убедитесь, что у пользователя USR1CV8 (или того, под кем работает сервер 1С) есть права «Полный контроль» на эти директории. Это действие решает проблему в 80% случаев, когда права DCOM уже настроены.
Посмотрим на пример кода, который часто используют разработчики. Главная ошибка при работе на сервере — попытка сделать приложение видимым или использовать методы активации окна. На сервере нет «экрана», поэтому вызов 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.
Если проблема сохраняется, проанализируем состояние лицензии Office. При первом запуске Word часто выводит окно «Добро пожаловать», «Примите лицензионное соглашение» или требования об обновлении. Служба 1С не может нажать кнопку «ОК» в этом окне, и процесс просто «виснет» в диспетчере задач.
Чтобы это исправить, выполните следующие действия:
dcomcnfg.Важное предостережение: Сама компания Microsoft официально не рекомендует использовать автоматизацию Office на стороне сервера (Server-side Automation). При высокой нагрузке процессы WINWORD.EXE могут не закрываться корректно и потреблять значительные ресурсы сервера. Если ваша система предполагает печать сотен договоров в час, рассмотрите переход на использование формата Open XML (прямая работа с .docx как с ZIP-архивом через средства 1С или внешние библиотеки), что гораздо стабильнее и быстрее.