Как исправить ошибку «Класс не зарегистрирован» при вызове COM-объекта в регламентном задании 1С?

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

При автоматизации взаимодействия с торговым и складским оборудованием, например с весовыми терминалами «Масса-К», нередко возникает ситуация, когда код прекрасно работает в интерактивном сеансе «1С:Предприятия», но падает с критической ошибкой при попытке запуска в фоновом или регламентном задании на сервере.

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

Драйвер = Новый COMОбъект("TerminalMassaK.driver");

В результате вызова в фоновом задании система генерирует исключение: Ошибка при вызове конструктора (COMОбъект) по причине: -2147221164(0x80040154): Класс не зарегистрирован. При этом регистрация DLL через утилиту regsvr32 выполнена успешно, а интерактивный запуск обработки на клиентском месте отрабатывает без нареканий.

Проанализируем природу этой ошибки и разберем по шагам практические способы ее устранения.

Выясним причину возникновения ошибки 0x80040154

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

  1. Несовместимость разрядности: Регламентные задания в клиент-серверной 1С всегда выполняются на стороне сервера внутри рабочего процесса rphost.exe. Если серверная платформа установлена в 64-разрядном варианте, то и rphost.exe работает как 64-битный процесс. Большинство драйверов торгового оборудования поставляются в виде 32-разрядных внутрипроцессных библиотек (In-Process DLL). 64-битный процесс физически не может загрузить 32-битную DLL напрямую в свое адресное пространство.
  2. Разделение реестра Windows: При обращении к реестру 64-битный процесс считывает ветку HKEY_CLASSES_ROOT\CLSID, не заглядывая в подраздел совместимости SysWOW64 / Wow6432Node, где зарегистрирована 32-битная компонента. Не обнаружив там нужный идентификатор класса, Windows возвращает код 0x80040154.
  3. Разница с интерактивным режимом: В режиме предприятия пользователь обычно запускает 32-битный толстый или тонкий клиент 1С, либо код создания COM-объекта выполняется в контексте «НаКлиенте». 32-битный клиент видит зарегистрированную 32-битную DLL без каких-либо препятствий.
  4. Ограничения неинтерактивной сессии (Session 0): Служба сервера 1С выполняется под системной учетной записью (обычно USR1CV8) в нулевой сессии Windows, где отсутствуют ветка реестра HKEY_CURRENT_USER и профили графического интерфейса, к которым могут обращаться устаревшие драйверы.

Решение 1. Настройка суррогатного процесса в службах компонентов (COM+)

Наиболее надежный способ подружить 64-битный рабочий процесс 1С с 32-битным COM-драйвером — запустить DLL как внешнее изолированное приложение (Out-of-Process Server) через стандартный суррогатный хост dllhost.exe. Разберем эту процедуру по шагам:

  1. Откроем консоль управления Службы компонентов. Для этого на сервере нажмем комбинацию клавиш Win + R, введем команду dcomcnfg и нажмем Enter.
  2. Перейдем по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмем правой кнопкой мыши на ветку Приложения COM+, выберем Создать -> Приложение. В открывшемся мастере нажмем «Далее» и выберем пункт Установить новое приложение.
  4. Зададим понятное имя приложению, например, MassaK_Driver_Surrogate, и обязательно выберем тип активации Серверное приложение (Server application). Это обеспечит запуск компоненты в отдельном системном процессе dllhost.exe.
  5. На этапе выбора учетной записи укажем конкретного пользователя: системную учетную запись службы сервера 1С (обычно USR1CV8) либо локального администратора с постоянным паролем.
  6. В свойствах созданного приложения COM+ перейдем на вкладку Безопасность (Security). Снимем флаг Принудительная проверка доступа для приложений либо настроим уровень ограничений, добавив в список разрешений пользователей группу «Все» или пользователя USR1CV8.
  7. Раскроем созданное приложение в консоли, перейдем к разделу Компоненты, нажмем правой кнопкой мыши и выберем Создать -> Компонент.
  8. В мастере выберем Установка новых компонентов и укажем путь к зарегистрированной 32-битной DLL драйвера весов (обычно находится в каталоге установки программы «Масса-К»).

После этой настройки при попытке сервера 1С создать TerminalMassaK.driver операционная система автоматически вызовет суррогатный 32-битный процесс dllhost.exe, выполнит маршалинг данных и передаст управление коду 1С без ошибки разрядности.

Решение 2. Активация DllSurrogate через системный реестр

Если нет возможности настроить COM-приложение через графический интерфейс, рассмотрим альтернативный способ регистрации суррогата напрямую через системный реестр Windows:

  1. Запустим редактор реестра regedit от имени администратора.
  2. Найдем ProgID драйвера в ветке HKEY_CLASSES_ROOT\TerminalMassaK.driver\CLSID и скопируем указанный там строковый идентификатор GUID (например, {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}).
  3. Перейдем в ветку HKEY_CLASSES_ROOT\AppID и создадим раздел с именем, совпадающим с полученным GUID.
  4. Внутри созданного раздела создадим строковый параметр (REG_SZ) с именем DllSurrogate и оставим его значение пустым.
  5. Вернемся в раздел HKEY_CLASSES_ROOT\CLSID\{GUID_драйвера} и добавим строковый параметр AppID, установив в качестве значения тот же GUID.

Данная конфигурация прямо предписывает подсистеме COM использовать системный суррогат dllhost.exe для обслуживания библиотеки при вызове из разноразрядных сред.

Решение 3. Подготовка окружения службы 1С (каталоги рабочего стола)

Многие драйверы весов и другого торгового оборудования проектируются с расчетом на запуск в контексте интерактивного пользователя. При их инициализации под учетной записью службы USR1CV8 может возникать скрытый сбой из-за отсутствия папок графического профиля для неинтерактивных сессий. Чтобы исключить эту проблему, выполним следующие шаги:

  1. Проверим наличие и создадим вручную следующие системные каталоги:

    C:\Windows\System32\config\systemprofile\Desktop

    C:\Windows\SysWOW64\config\systemprofile\Desktop

  2. В свойствах безопасности обеих папок предоставим полные права учетной записи, от имени которой запущена служба сервера 1С (по умолчанию USR1CV8).

Альтернативные способы интеграции с весами

Если использование COM-объектов на стороне сервера вызывает сложности с администрированием или обновлением системы, рассмотрим альтернативные архитектурные решения:

  1. Переход на Native API компоненты: Производитель весового оборудования «Масса-К» предоставляет современные внешние компоненты, разработанные по стандарту «1С:Совместимо» (технология Native API). В их комплект входят как 32-битные, так и 64-битные бинарные файлы. Их подключение осуществляется без COM-регистрации с помощью стандартного метода ПодключитьВнешнююКомпоненту():
    
    Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаМассаК", "MassaK", ТипПодключенияВнешнейКомпоненты.Native);
    Если Подключено Тогда
        Драйвер = Новый ("AddIn.MassaK.Scale");
    КонецЕсли;
    
  2. Прямой сетевой опрос по TCP/IP: Большинство сетевых весовых терминалов (например, серий ТВ или 4D) оснащены интерфейсами Ethernet или Wi-Fi и поддерживают открытый протокол обмена данными через порт 1001. Платформа 1С позволяет выполнять опрос терминалов и считывание журнала взвешиваний напрямую через сетевые сокеты или HTTP-запросы без установки сторонних драйверов и DLL на сервер.
  3. Вынос опроса в отдельный 32-битный клиент: Если оборудование подключено через локальный COM-порт к рабочему месту оператора, правильнее выполнять опрос весов непосредственно в сеансе пользователя на клиенте, после чего передавать полученные данные массивом на сервер для записи в регистры сведений.
← На главную