При автоматизации документооборота в среде «1С:Предприятие» разработчики часто сталкиваются с необходимостью формирования печатных форм договоров, соглашений и других документов в формате Microsoft Word. Традиционным инструментом для этого выступает технология COM-соединения. Однако при вызове конструктора Новый COMОбъект("Word.Application") в клиент-серверных базах на платформе 1С 8.2 (особенно при использовании обычных форм и переносе кода из систем на платформе 1С 8.3) нередко возникает критическая ошибка: «Недопустимая строка с указанием класса» (код ошибки CO_E_CLASSSTRING).
В этой статье мы подробно разберем, почему возникает данная неполадка, проанализируем внутренние механизмы взаимодействия 1С и операционной системы Windows, а также изучим пошаговые сценарии решения проблемы как на стороне клиента, так и на стороне сервера приложений.
Системная ошибка «Недопустимая строка с указанием класса» означает, что подсистема COM (Component Object Model) операционной системы Windows на том компьютере, где выполняется код 1С, не смогла сопоставить программный идентификатор (ProgID) Word.Application с соответствующим идентификатором класса (CLSID) в системном реестре.
В контексте работы «1С:Предприятия 8.2» в клиент-серверном режиме выделяют три основные причины возникновения этой ситуации:
USR1CV82) не имеет прав на запуск и активацию COM-объектов Microsoft Office.Разберем детально каждый способ диагностики и устранения данной проблемы.
В платформе 1С 8.2 при использовании обычного приложения (например, в конфигурации «Управление строительной организацией» или «Управление производственным предприятием») свойства общих модулей могут приводить к тому, что код, предназначенный для выполнения на клиенте, неявно уходит на сервер.
Если общий модуль имеет флаг «Сервер» и вызов происходит в рамках серверной транзакции или проведения документа, система попытается создать объект Word.Application на серверной машине. Чтобы проверить это предположение, выполним диагностику с помощью инструкций препроцессора.
Добавим в код общего модуля проверку контекста исполнения:
#Если Клиент Тогда
Попытка
WD = Новый COMОбъект("Word.Application");
WD.Visible = Ложь;
Исключение
Сообщить("Не удалось запустить Word на клиенте: " + ОписаниеОшибки());
КонецПопытки;
#Иначе
// Этот блок сработает, если вызов происходит на стороне сервера приложений 1С
ЗаписьЖурналаРегистрации("ПечатьДокументов",
УровеньЖурналаРегистрации.Ошибка, , ,
"Попытка создания COM-объекта Word на сервере приложений! Вызов отклонен.");
ВызватьИсключение "Ошибка конфигурации: Формирование файлов Word поддерживается только на стороне клиента!";
#КонецЕсли
Если при выполнении этого кода система выдает исключение «Формирование файлов Word поддерживается только на стороне клиента!», значит, нам необходимо пересмотреть логику вызова процедур:
Если бизнес-логика вашей системы требует генерации документов Word именно силами сервера приложений 1С (например, при работе регламентных заданий или веб-сервисов), нам потребуется настроить системные разрешения для запуска приложения Word от имени службы 1С.
Рассмотрим по шагам процесс настройки службы DCOM на сервере приложений под управлением ОС Windows Server:
dcomcnfg и нажмите Enter.mmc comexp.msc /32
USR1CV82 или SYSTEM), и предоставьте ему полные права (Локальный запуск, Удаленный запуск, Локальная активация, Удаленная активация).winword.exe.Специфика работы офисных приложений Microsoft (Word, Excel) через COM заключается в том, что при инициализации процесса они требуют обязательного наличия физических папок профиля Desktop для пользователя, запускающего процесс. Если служба сервера 1С работает под стандартной системной учетной записью systemprofile, эти каталоги в системе отсутствуют по умолчанию.
Чтобы решить эту проблему, нам необходимо вручную создать папки рабочего стола в системных директориях Windows на сервере приложений:
C:\Windows\System32\config\systemprofile\Desktop
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopUSR1CV82 или группе Администраторы) полные права на чтение, запись и изменение этих папок.Если ошибка «Недопустимая строка с указанием класса» возникает непосредственно на клиентском компьютере пользователя, где установлен MS Word, это свидетельствует о нарушении целостности связей в реестре Windows.
Для восстановления корректной регистрации выполним принудительную перерегистрацию исполняемого файла Word. Выполним следующие действия по шагам:
cd "C:\Program Files\Microsoft Office\Office15"
Примечание: папка Office15 соответствует версии Word 2013, Office16 — Word 2016/2019. Если у вас установлена 32-битная версия на 64-битной ОС, путь будет вести в папку Program Files (x86).
winword.exe /regserver
HKEY_CLASSES_ROOT. Визуальных окон при этом не появится.Также рекомендуется проверить доступность конкретной версии ProgID в коде 1С. Попробуйте вместо универсального идентификатора обратиться к версии класса напрямую:
Попытка
// Попытка явного обращения к версии Word 2013 (внутренняя версия 15)
WD = Новый COMОбъект("Word.Application.15");
Исключение
Попытка
// Если не получилось, пробуем стандартный класс
WD = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Не удалось запустить ни одну из версий Word: " + ОписаниеОшибки());
КонецПопытки;
КонецПопытки;
Технология COM является устаревающей (legacy) и признана корпорацией Microsoft нерекомендуемой для использования на стороне сервера в многопоточных приложениях из-за нестабильности, утечек памяти и проблем с производительностью. Если вы хотите полностью застраховать свою систему от подобных ошибок в будущем, рассмотрите вариант перехода на прямую генерацию файлов DOCX.
Файл формата .docx представляет собой обычный ZIP-архив, внутри которого находятся файлы разметки XML. Мы можем изменять содержимое документа встроенными средствами платформы 1С без вызова внешних программ:
[НомерДоговора], [ДатаДоговора]).КопироватьФайл().ЧтениеZipФайла.word/document.xml, где хранится основной текст документа.СтрЗаменить().ЗаписьZipФайла, изменив расширение готового файла на .docx.Такой подход работает в десятки раз быстрее, абсолютно стабилен, выполняется в любом контексте (и на клиенте, и на сервере) и не требует наличия установленного Microsoft Office на компьютерах пользователей и серверах предприятия.