Почему возникает ошибка при получении макета MS Word на сервере 1С и как ее исправить?

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

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

Типичный проблемный участок кода выглядит следующим образом:


МакетАкта = ПолучитьМакет("АктДвуязычный"); // Получаем объект из макета конфигурации
MSWord = МакетАкта.Получить(); // На этой строке происходит ошибка инициализации COM-объекта

Рассмотрим подробнее, почему так происходит и какие шаги необходимо предпринять для устранения этой неполадки.

1. Проверяем совпадение разрядности 1С и MS Office

Первое и самое частое, с чем мы можем столкнуться — это конфликт разрядности (архитектуры) установленных приложений. Служба сервера 1С:Предприятия или клиентское приложение может быть 64-битным (x64), тогда как пакет программ Microsoft Office установлен в 32-битном варианте (x86/x32).

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

Как решить проблему:

  1. Выясним, какая версия MS Office установлена на сервере (x32 или x64).
  2. Если используется 1С разрядности x64, а Office x32, то самым быстрым решением будет запуск клиента 1С нужной разрядности (x32), либо переустановка пакета MS Office на 64-битную версию, чтобы архитектуры 1С и Word полностью совпадали.

2. Создаем системные папки Desktop для профиля службы

Если разрядность совпадает, но ошибка сохраняется или процесс Word зависает в диспетчере задач, проанализируем специфику работы серверных служб ОС Windows. Когда 1С работает в клиент-серверном варианте, фоновые задания и серверные вызовы выполняются от имени служебного пользователя (по умолчанию это USR1CV8). У этого пользователя нет интерактивного сеанса и полноценного графического профиля с рабочим столом.

При инициализации приложения MS Word через COM, оно может попытаться обратиться к системной папке рабочего стола текущего пользователя. Не найдя ее, процесс просто зависает (падает в бесконечное ожидание), а 1С выдает ошибку по таймауту.

Инструкция по решению:

  1. Откроем проводник Windows на сервере 1С.
  2. Для 64-битной системы перейдем по пути: C:\Windows\System32\config\systemprofile\.
  3. Создадим там новую пустую папку с именем Desktop.
  4. Дополнительно, если сервер работает на ОС x64 (а это практически всегда так), перейдем по пути C:\Windows\SysWOW64\config\systemprofile\ и создадим папку Desktop там тоже.
  5. Обязательно зайдем в свойства обеих созданных папок на вкладку Безопасность и предоставим полные права (Чтение и Запись) пользователю, под которым запущена служба сервера 1С (USR1CV8).

3. Настраиваем права DCOM для MS Word

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

Разберем по шагам, как правильно настроить разрешения:

  1. Откроем окно "Выполнить" (Win+R) и введем команду dcomcnfg (или comexp.msc /32, если требуется настроить 32-битный компонент на 64-битной системе).
  2. В открывшейся консоли "Службы компонентов" перейдем по ветке: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  3. Найдем в списке компонент с именем Документ Microsoft Office Word 97 - 2003 (или Microsoft Word Document).
  4. Откроем свойства этого компонента и перейдем на вкладку Безопасность.
  5. В блоках "Разрешения на запуск и активацию" и "Разрешения на доступ" выберем опцию Настроить и нажмем кнопку "Изменить".
  6. Добавим учетную запись нашей службы 1С (например, USR1CV8) в список.
  7. Отметим галочками права на Локальный запуск (Local Launch) и Локальную активацию (Local Activation), а также права на локальный доступ.
  8. Сохраним настройки и для надежности перезапустим службу сервера 1С и саму службу компонентов (или просто перезагрузим сервер).

4. Чистим зависшие фоновые процессы MS Word

Во время неудачных попыток программного создания документа Word на сервере (особенно до выполнения настроек DCOM и папки Desktop) в памяти операционной системы остаются "мертвые" процессы. Поскольку у них нет видимых окон, обнаружить их можно только инструментальными средствами.

Множество таких зависших процессов забивают оперативную память и блокируют последующие попытки создания COM-объектов. Поэтому откроем Диспетчер задач, перейдем на вкладку "Подробности" (или "Процессы") и завершим все запущенные задачи с именем WINWORD.EXE, работающие от имени пользователя сервера 1С.

5. Современные альтернативные подходы (Нативные методы)

Важно помнить, что сама компания Microsoft официально не рекомендует и не поддерживает автоматизацию пакета Office на сервере (Server-Side Automation). Эти приложения проектировались исключительно для работы с графическим интерфейсом и реальным пользователем. Любое всплывающее окно (предупреждение безопасности, ошибка активации, сбой восстановления) приведет к намертво зависшему фоновому процессу на сервере, так как нажать кнопку в невидимом окне некому.

Посмотрим, какие более надежные, кроссплатформенные и быстрые пути решения этой задачи существуют на сегодняшний день в экосистеме 1С:

Вариант А: Работа с макетом как с ZIP-архивом

Современный формат файлов .docx — это, по сути, обычный ZIP-архив, внутри которого находится структура XML-файлов с разметкой и текстом. На стороне сервера 1С мы можем использовать встроенные объекты ЧтениеZipФайла и ЗаписьZipФайла.

Логика работы следующая: мы сохраняем наш шаблон, распаковываем его во временный каталог, находим основной файл word/document.xml и читаем его как текст. Затем выполняем простую замену шаблонных тегов (например, [Контрагент]) на нужные данные из документа реализации с помощью функции СтрЗаменить(). После этого упаковываем файлы обратно в архив и отдаем готовый файл .docx пользователю. Этот метод работает невероятно быстро, не требует установленного офиса и никак не зависит от DCOM или разрядности.

Вариант Б: Использование стандартных механизмов БСП

В большинстве актуальных конфигураций, построенных на базе "Библиотеки стандартных подсистем" (БСП), уже встроены готовые и отлаженные механизмы для формирования печатных форм в форматах Office Open XML. Достаточно изучить общие модули, отвечающие за управление печатью, и перевести свои внешние обработки на использование типовых функций БСП. Это избавит вас от поддержки устаревших COM-объектов (Active Document) и сделает код универсальным.

Применяя эти знания на практике, вы навсегда закроете для себя вопрос "почему 1С не открывает Word на сервере" и сможете разрабатывать надежные, отказоустойчивые механизмы печати офисных документов.

← На главную