При автоматизации взаимодействия с торговым и складским оборудованием, например с весовыми терминалами «Масса-К», нередко возникает ситуация, когда код прекрасно работает в интерактивном сеансе «1С:Предприятия», но падает с критической ошибкой при попытке запуска в фоновом или регламентном задании на сервере.
В типовом сценарии попытка инициализации драйвера весов выглядит следующим образом:
Драйвер = Новый COMОбъект("TerminalMassaK.driver");
В результате вызова в фоновом задании система генерирует исключение: Ошибка при вызове конструктора (COMОбъект) по причине: -2147221164(0x80040154): Класс не зарегистрирован. При этом регистрация DLL через утилиту regsvr32 выполнена успешно, а интерактивный запуск обработки на клиентском месте отрабатывает без нареканий.
Проанализируем природу этой ошибки и разберем по шагам практические способы ее устранения.
Главный фактор сбоя кроется в разрядности процессов и особенностях архитектуры COM в операционных системах Windows:
rphost.exe. Если серверная платформа установлена в 64-разрядном варианте, то и rphost.exe работает как 64-битный процесс. Большинство драйверов торгового оборудования поставляются в виде 32-разрядных внутрипроцессных библиотек (In-Process DLL). 64-битный процесс физически не может загрузить 32-битную DLL напрямую в свое адресное пространство.HKEY_CLASSES_ROOT\CLSID, не заглядывая в подраздел совместимости SysWOW64 / Wow6432Node, где зарегистрирована 32-битная компонента. Не обнаружив там нужный идентификатор класса, Windows возвращает код 0x80040154.USR1CV8) в нулевой сессии Windows, где отсутствуют ветка реестра HKEY_CURRENT_USER и профили графического интерфейса, к которым могут обращаться устаревшие драйверы.Наиболее надежный способ подружить 64-битный рабочий процесс 1С с 32-битным COM-драйвером — запустить DLL как внешнее изолированное приложение (Out-of-Process Server) через стандартный суррогатный хост dllhost.exe. Разберем эту процедуру по шагам:
dcomcnfg и нажмем Enter.MassaK_Driver_Surrogate, и обязательно выберем тип активации Серверное приложение (Server application). Это обеспечит запуск компоненты в отдельном системном процессе dllhost.exe.USR1CV8) либо локального администратора с постоянным паролем.USR1CV8.После этой настройки при попытке сервера 1С создать TerminalMassaK.driver операционная система автоматически вызовет суррогатный 32-битный процесс dllhost.exe, выполнит маршалинг данных и передаст управление коду 1С без ошибки разрядности.
Если нет возможности настроить COM-приложение через графический интерфейс, рассмотрим альтернативный способ регистрации суррогата напрямую через системный реестр Windows:
regedit от имени администратора.HKEY_CLASSES_ROOT\TerminalMassaK.driver\CLSID и скопируем указанный там строковый идентификатор GUID (например, {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}).HKEY_CLASSES_ROOT\AppID и создадим раздел с именем, совпадающим с полученным GUID.DllSurrogate и оставим его значение пустым.HKEY_CLASSES_ROOT\CLSID\{GUID_драйвера} и добавим строковый параметр AppID, установив в качестве значения тот же GUID.Данная конфигурация прямо предписывает подсистеме COM использовать системный суррогат dllhost.exe для обслуживания библиотеки при вызове из разноразрядных сред.
Многие драйверы весов и другого торгового оборудования проектируются с расчетом на запуск в контексте интерактивного пользователя. При их инициализации под учетной записью службы USR1CV8 может возникать скрытый сбой из-за отсутствия папок графического профиля для неинтерактивных сессий. Чтобы исключить эту проблему, выполним следующие шаги:
C:\Windows\System32\config\systemprofile\Desktop
C:\Windows\SysWOW64\config\systemprofile\Desktop
USR1CV8).Если использование COM-объектов на стороне сервера вызывает сложности с администрированием или обновлением системы, рассмотрим альтернативные архитектурные решения:
ПодключитьВнешнююКомпоненту():
Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаМассаК", "MassaK", ТипПодключенияВнешнейКомпоненты.Native);
Если Подключено Тогда
Драйвер = Новый ("AddIn.MassaK.Scale");
КонецЕсли;