Часто при разработке печатных форм в формате Microsoft Word программисты 1С сталкиваются с ситуацией, когда на рабочем месте или на одном сервере код формирования документа отрабатывает без нареканий, а на другом сервере валится с критической ошибкой. В частности, сбой происходит при вызове метода Получить() у полученного макета типа Active Document. Проанализируем эту ситуацию, разберем основные причины такого поведения и по шагам настроим сервер для бесперебойной работы.
Типичный проблемный участок кода выглядит следующим образом:
МакетАкта = ПолучитьМакет("АктДвуязычный"); // Получаем объект из макета конфигурации
MSWord = МакетАкта.Получить(); // На этой строке происходит ошибка инициализации COM-объекта
Рассмотрим подробнее, почему так происходит и какие шаги необходимо предпринять для устранения этой неполадки.
Первое и самое частое, с чем мы можем столкнуться — это конфликт разрядности (архитектуры) установленных приложений. Служба сервера 1С:Предприятия или клиентское приложение может быть 64-битным (x64), тогда как пакет программ Microsoft Office установлен в 32-битном варианте (x86/x32).
64-битное приложение 1С не может напрямую инициализировать 32-битный COM-объект в своем адресном пространстве "на лету" без сложных прослоек. Из-за этого при вызове метода Получить() система просто не находит подходящую библиотеку.
Как решить проблему:
Если разрядность совпадает, но ошибка сохраняется или процесс Word зависает в диспетчере задач, проанализируем специфику работы серверных служб ОС Windows. Когда 1С работает в клиент-серверном варианте, фоновые задания и серверные вызовы выполняются от имени служебного пользователя (по умолчанию это USR1CV8). У этого пользователя нет интерактивного сеанса и полноценного графического профиля с рабочим столом.
При инициализации приложения MS Word через COM, оно может попытаться обратиться к системной папке рабочего стола текущего пользователя. Не найдя ее, процесс просто зависает (падает в бесконечное ожидание), а 1С выдает ошибку по таймауту.
Инструкция по решению:
C:\Windows\System32\config\systemprofile\.Desktop.C:\Windows\SysWOW64\config\systemprofile\ и создадим папку Desktop там тоже.USR1CV8).Продолжаем серверную настройку. Служба 1С по умолчанию обладает ограниченными правами в операционной системе. Чтобы фоновый процесс мог самостоятельно запускать сторонние COM-приложения (в нашем случае документ Microsoft Office Word), ему необходимо выдать соответствующие разрешения в подсистеме DCOM.
Разберем по шагам, как правильно настроить разрешения:
dcomcnfg (или comexp.msc /32, если требуется настроить 32-битный компонент на 64-битной системе).USR1CV8) в список.Во время неудачных попыток программного создания документа Word на сервере (особенно до выполнения настроек DCOM и папки Desktop) в памяти операционной системы остаются "мертвые" процессы. Поскольку у них нет видимых окон, обнаружить их можно только инструментальными средствами.
Множество таких зависших процессов забивают оперативную память и блокируют последующие попытки создания COM-объектов. Поэтому откроем Диспетчер задач, перейдем на вкладку "Подробности" (или "Процессы") и завершим все запущенные задачи с именем WINWORD.EXE, работающие от имени пользователя сервера 1С.
Важно помнить, что сама компания 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 на сервере" и сможете разрабатывать надежные, отказоустойчивые механизмы печати офисных документов.