Разберем распространенную ситуацию: при выполнении серверного кода в тонком клиенте создание и открытие документа Microsoft Word через COM-объект проходит успешно, однако при запуске той же процедуры через веб-клиент метод Open возвращает Неопределено. Проанализируем ситуацию и выясним, почему так происходит и как заставить серверную автоматизацию «взлететь».
Прежде всего, проанализируем, в чем заключается принципиальная разница между тонким и веб-клиентом при обращении к серверным процедурам. В файловой базе данных при использовании тонкого клиента «серверный» код фактически выполняется в рамках того же процесса Windows, что и сам клиент. Это означает, что 1С имеет доступ ко всем правам текущего пользователя, его рабочему столу и временным папкам.
В случае с веб-клиентом ситуация меняется. Код на стороне сервера выполняется под управлением процесса веб-сервера (например, Apache или IIS). Это влечет за собой несколько критических моментов:
IUSR, NetworkService), у которых нет интерактивного рабочего стола и ограничены права на запуск COM-серверов.Одной из самых частых причин, по которой Documents.Open возвращает пустой объект, является отсутствие папки Desktop в профиле пользователя, под которым работает веб-сервер. Microsoft Word при инициализации ищет этот путь для создания временных файлов или хранения параметров сессии. Если папки нет — Word просто «зависает» или прерывает операцию открытия.
Рассмотрим, какие папки необходимо создать вручную на сервере:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopВажно: даже если вы не планируете ничего сохранять на рабочий стол, наличие этой физической директории критически важно для корректного старта WINWORD.EXE.
Если создание папок не помогло, проанализируем настройки службы компонентов (DCOM). По умолчанию системные пользователи не имеют прав на активацию COM-объектов MS Office. Выполним следующие шаги по настройке:
dcomcnfg через командную строку.IUSR, IIS_IUSRS или пользователь процесса Apache).Посмотрим на пример кода, предоставленный автором темы:
ШаблонФайлИмя = ПолучитьИмяВременногоФайла(".docx");
Шаблон.Записать(ШаблонФайлИмя);
ОбъектВорд = Новый COMОбъект("Word.Application");
ОбъектВорд.ScreenUpdating = Ложь;
ДокументВорд = ОбъектВорд.Documents.Open(ШаблонФайлИмя);
Выясним причину возможной блокировки. Платформа 1С после вызова метода ПолучитьИмяВременногоФайла() сохраняет контроль над этим файлом для последующего удаления. В режиме веб-клиента взаимодействие веб-сервера и системы управления временными файлами может приводить к тому, что Word не может получить доступ на запись (а Word всегда пытается создать временный файл-владелец с префиксом ~$ в той же папке).
Попробуйте вместо временного файла использовать постоянную директорию с полными правами доступа для всех:
ПутьКФайлу = "C:\TempDocuments\my_contract.docx";
Шаблон.Записать(ПутьКФайлу);
// Убедитесь, что у пользователя процесса веб-сервера есть права на папку C:\TempDocuments\
ДокументВорд = ОбъектВорд.Documents.Open(ПутьКФайлу);
Рассмотрим наиболее современный и стабильный способ решения задачи. Использование COM-объектов на стороне сервера — это ресурсозатратный и нестабильный процесс. В Библиотеке Стандартных Подсистем (БСП) реализованы механизмы работы с файлами .docx без участия установленного Microsoft Office.
Поскольку файл .docx технически является ZIP-архивом с набором XML-файлов, мы можем выполнить следующие действия программно на сервере:
ЧтениеZipФайла).word/document.xml..docx.Этот метод работает значительно быстрее, не требует установки Word на сервере и не зависит от прав доступа системных пользователей к COM-объектам. В БСП для этого можно использовать функции общего модуля УправлениеПечатью.
Проанализируем еще один технический нюанс: разрядность приложений. Если ваш 1С:Сервер или веб-сервер работает в 64-битном режиме, а MS Office установлен 32-битный, прямое создание Новый COMОбъект("Word.Application") может завершаться ошибкой. В этом случае операционная система пытается использовать механизм dllhost.exe для проброса вызовов. Если настройки DCOM (описанные в Решении 2) не выполнены корректно, этот механизм не сработает.
Итог: Если вам критически важно использовать именно COM, начните с настройки папок Desktop в профиле systemprofile. Однако для промышленной эксплуатации в веб-клиенте настоятельно рекомендуем переходить на формирование документов через модификацию XML-структуры файла, что избавит вас от зависимости от установленного офисного пакета на сервере.