Как исправить ошибку «Недопустимая строка с указанием класса» при запуске MS Word из 1С 8.2?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При автоматизации документооборота в среде «1С:Предприятие» разработчики часто сталкиваются с необходимостью формирования печатных форм договоров, соглашений и других документов в формате Microsoft Word. Традиционным инструментом для этого выступает технология COM-соединения. Однако при вызове конструктора Новый COMОбъект("Word.Application") в клиент-серверных базах на платформе 1С 8.2 (особенно при использовании обычных форм и переносе кода из систем на платформе 1С 8.3) нередко возникает критическая ошибка: «Недопустимая строка с указанием класса» (код ошибки CO_E_CLASSSTRING).

В этой статье мы подробно разберем, почему возникает данная неполадка, проанализируем внутренние механизмы взаимодействия 1С и операционной системы Windows, а также изучим пошаговые сценарии решения проблемы как на стороне клиента, так и на стороне сервера приложений.

Выясняем причину: почему операционная система не находит класс Word

Системная ошибка «Недопустимая строка с указанием класса» означает, что подсистема COM (Component Object Model) операционной системы Windows на том компьютере, где выполняется код 1С, не смогла сопоставить программный идентификатор (ProgID) Word.Application с соответствующим идентификатором класса (CLSID) в системном реестре.

В контексте работы «1С:Предприятия 8.2» в клиент-серверном режиме выделяют три основные причины возникновения этой ситуации:

  1. Неявное выполнение кода на стороне сервера приложений 1С. Это наиболее частая причина. Код создания COM-объекта вызывается из общего модуля, который выполняется на сервере приложений 1С, где пакет Microsoft Office банально не установлен.
  2. Различие в правах доступа и учетных записях служб. Если код выполняется на сервере, служба 1С (обычно запущенная от имени пользователя USR1CV82) не имеет прав на запуск и активацию COM-объектов Microsoft Office.
  3. Проблемы с регистрацией COM-сервера Word в реестре Windows. Ошибки могут возникать из-за повреждения веток реестра после установки нескольких версий MS Office или некорректного обновления программного пакета.

Разберем детально каждый способ диагностики и устранения данной проблемы.

Решение 1. Проверка и ограничение контекста выполнения (Клиент-Сервер)

В платформе 1С 8.2 при использовании обычного приложения (например, в конфигурации «Управление строительной организацией» или «Управление производственным предприятием») свойства общих модулей могут приводить к тому, что код, предназначенный для выполнения на клиенте, неявно уходит на сервер.

Если общий модуль имеет флаг «Сервер» и вызов происходит в рамках серверной транзакции или проведения документа, система попытается создать объект Word.Application на серверной машине. Чтобы проверить это предположение, выполним диагностику с помощью инструкций препроцессора.

Добавим в код общего модуля проверку контекста исполнения:


#Если Клиент Тогда
    Попытка
        WD = Новый COMОбъект("Word.Application");
        WD.Visible = Ложь;
    Исключение
        Сообщить("Не удалось запустить Word на клиенте: " + ОписаниеОшибки());
    КонецПопытки;
#Иначе
    // Этот блок сработает, если вызов происходит на стороне сервера приложений 1С
    ЗаписьЖурналаРегистрации("ПечатьДокументов", 
        УровеньЖурналаРегистрации.Ошибка, , , 
        "Попытка создания COM-объекта Word на сервере приложений! Вызов отклонен.");
    ВызватьИсключение "Ошибка конфигурации: Формирование файлов Word поддерживается только на стороне клиента!";
#КонецЕсли

Если при выполнении этого кода система выдает исключение «Формирование файлов Word поддерживается только на стороне клиента!», значит, нам необходимо пересмотреть логику вызова процедур:

  1. Проверить свойства общего модуля, из которого вызывается создание объекта. Если у модуля стоят флаги «Клиент» и «Сервер» одновременно, убедиться, что вызов метода происходит из клиентских процедур формы (например, при нажатии кнопки на форме).
  2. Перенести логику генерации макета и заполнения полей непосредственно в модуль формы (на клиентскую сторону) или в специализированный клиентский общий модуль.

Решение 2. Настройка прав DCOM на сервере (если запуск на сервере неизбежен)

Если бизнес-логика вашей системы требует генерации документов Word именно силами сервера приложений 1С (например, при работе регламентных заданий или веб-сервисов), нам потребуется настроить системные разрешения для запуска приложения Word от имени службы 1С.

Рассмотрим по шагам процесс настройки службы DCOM на сервере приложений под управлением ОС Windows Server:

  1. Откройте консоль управления службами компонентов. Для этого нажмите сочетание клавиш Win + R, введите команду dcomcnfg и нажмите Enter.
  2. Если сервер приложений работает в 64-разрядной операционной системе, а на сервере установлен 32-разрядный пакет Microsoft Office, стандартная консоль не покажет нужные компоненты. В этом случае запустите 32-разрядную версию консоли через командную строку: mmc comexp.msc /32
  3. В дереве консоли перейдите по пути: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  4. Найдите в списке компонент с именем Microsoft Word Application (или «Документ Microsoft Word») и откройте его свойства через контекстное меню.
  5. Перейдите на вкладку «Безопасность».
  6. В разделе «Разрешения на запуск и активацию» установите переключатель в положение «Настроить» и нажмите кнопку «Изменить». Добавьте в список пользователя, под которым запущена служба сервера 1С (например, USR1CV82 или SYSTEM), и предоставьте ему полные права (Локальный запуск, Удаленный запуск, Локальная активация, Удаленная активация).
  7. Повторите аналогичные действия в разделе «Разрешения на доступ», предоставив пользователю службы 1С права на локальный и удаленный доступ.
  8. Перейдите на вкладку «Удостоверение» (Identity). По умолчанию там может быть выбран «Запускающий пользователь». Для стабильной работы рекомендуется установить переключатель в положение «Интерактивный пользователь» (при условии, что на сервере всегда выполнена сессия администратора) или жестко указать учетную запись локального администратора сервера («Указанный пользователь»), под которой будет невидимо стартовать процесс winword.exe.

Решение 3. Создание системных папок Desktop (Рабочий стол)

Специфика работы офисных приложений Microsoft (Word, Excel) через COM заключается в том, что при инициализации процесса они требуют обязательного наличия физических папок профиля Desktop для пользователя, запускающего процесс. Если служба сервера 1С работает под стандартной системной учетной записью systemprofile, эти каталоги в системе отсутствуют по умолчанию.

Чтобы решить эту проблему, нам необходимо вручную создать папки рабочего стола в системных директориях Windows на сервере приложений:

  1. Для 32-разрядных операционных систем создайте каталог: C:\Windows\System32\config\systemprofile\Desktop
  2. Для 64-разрядных операционных систем создайте два каталога (это критически важно!):
    1. C:\Windows\System32\config\systemprofile\Desktop
    2. C:\Windows\SysWOW64\config\systemprofile\Desktop
  3. После создания каталогов кликните по каждому из них правой кнопкой мыши, перейдите в «Свойства» -> вкладка «Безопасность» и предоставьте пользователю службы 1С (USR1CV82 или группе Администраторы) полные права на чтение, запись и изменение этих папок.

Решение 4. Принудительная перерегистрация COM-классов MS Word в реестре

Если ошибка «Недопустимая строка с указанием класса» возникает непосредственно на клиентском компьютере пользователя, где установлен MS Word, это свидетельствует о нарушении целостности связей в реестре Windows.

Для восстановления корректной регистрации выполним принудительную перерегистрацию исполняемого файла Word. Выполним следующие действия по шагам:

  1. Закройте все запущенные процессы 1С и Microsoft Word на компьютере.
  2. Запустите командную строку Windows (cmd) обязательно от имени Администратора.
  3. Перейдите в каталог установки вашего пакета Microsoft Office (путь зависит от версии и разрядности системы): cd "C:\Program Files\Microsoft Office\Office15" Примечание: папка Office15 соответствует версии Word 2013, Office16 — Word 2016/2019. Если у вас установлена 32-битная версия на 64-битной ОС, путь будет вести в папку Program Files (x86).
  4. Выполните команду регистрации ключей COM-сервера: winword.exe /regserver
  5. Нажмите Enter и подождите несколько секунд, пока процесс завершит фоновую регистрацию классов в ветке реестра HKEY_CLASSES_ROOT. Визуальных окон при этом не появится.

Также рекомендуется проверить доступность конкретной версии ProgID в коде 1С. Попробуйте вместо универсального идентификатора обратиться к версии класса напрямую:


Попытка
    // Попытка явного обращения к версии Word 2013 (внутренняя версия 15)
    WD = Новый COMОбъект("Word.Application.15");
Исключение
    Попытка
        // Если не получилось, пробуем стандартный класс
        WD = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("Не удалось запустить ни одну из версий Word: " + ОписаниеОшибки());
    КонецПопытки;
КонецПопытки;

Альтернативный подход: формирование документов DOCX без использования COM

Технология COM является устаревающей (legacy) и признана корпорацией Microsoft нерекомендуемой для использования на стороне сервера в многопоточных приложениях из-за нестабильности, утечек памяти и проблем с производительностью. Если вы хотите полностью застраховать свою систему от подобных ошибок в будущем, рассмотрите вариант перехода на прямую генерацию файлов DOCX.

Файл формата .docx представляет собой обычный ZIP-архив, внутри которого находятся файлы разметки XML. Мы можем изменять содержимое документа встроенными средствами платформы 1С без вызова внешних программ:

  1. Создайте шаблон документа в Word, расставьте в нужных местах уникальные маркеры (например, [НомерДоговора], [ДатаДоговора]).
  2. В коде 1С скопируйте файл шаблона во временный каталог с помощью метода КопироватьФайл().
  3. Распакуйте временный файл с помощью объекта 1С ЧтениеZipФайла.
  4. Прочитайте содержимое текстового файла word/document.xml, где хранится основной текст документа.
  5. Выполните автозамену маркеров на реальные данные из базы данных 1С с помощью стандартной функции СтрЗаменить().
  6. Запишите измененный XML обратно и упакуйте архив с помощью объекта 1С ЗаписьZipФайла, изменив расширение готового файла на .docx.

Такой подход работает в десятки раз быстрее, абсолютно стабилен, выполняется в любом контексте (и на клиенте, и на сервере) и не требует наличия установленного Microsoft Office на компьютерах пользователей и серверах предприятия.

← На главную