При разработке интеграций с внешним оборудованием или сторонними сервисами программисты 1С часто сталкиваются с ситуацией, когда библиотека (DLL), успешно работающая в коде &НаКлиенте, наотрез отказывается инициализироваться в серверном контексте &НаСервере. Обычно это сопровождается ошибкой «-2147221164(0x80040154): Класс не зарегистрирован». Ситуация осложняется, когда логика интеграции должна быть скрыта в модуле объекта или выполняться в регламентных заданиях, где клиентского контекста попросту не существует.
Рассмотрим подробно, почему возникает эта проблема и как правильно настроить серверную среду для корректной работы с COM-объектами и .NET сборками.
Проанализируем ситуацию: когда вы регистрируете библиотеку на своем рабочем компьютере, вы делаете это для текущего пользователя и текущей архитектуры (чаще всего 32-битной). Сервер 1С — это отдельная сущность, работающая под собственной учетной записью и имеющая свои особенности. Основных причин «невидимости» объекта три:
USR1CV8. У этой учетной записи нет доступа к веткам реестра HKEY_CURRENT_USER обычного пользователя, и часто ограничены права на запуск DCOM.Если ваша библиотека является .NET сборкой (как в случае с pdBluetoothService.dll), обычный regsvr32 не поможет. Нужно использовать утилиту RegAsm.exe. Разберем по шагам, как это сделать на сервере:
Во-первых, определите разрядность сервера 1С. Если сервер 64-битный, используйте RegAsm из папки Framework64. Во-вторых, обязательно используйте ключ /codebase, чтобы в реестр прописался полный путь к файлу, иначе система будет искать библиотеку только в GAC (Global Assembly Cache).
Пример команды для PowerShell или командной строки (запускать от имени администратора на сервере):
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe "C:\pdEcrIntegration\pdBluetoothService.dll" /tlb /nologo /codebase
Важный нюанс: Если библиотека 32-битная, а вы пытаетесь вызвать её из 64-битного процесса 1С, регистрация пройдет успешно, но объект Новый COMОбъект(...) все равно выдаст ошибку. В этом случае переходим к следующему шагу.
Это самый надежный способ «подружить» 64-битный сервер 1С и 32-битную компоненту. Мы создадим специальный суррогатный процесс (dllhost.exe), который будет выступать посредником.
Разберем алгоритм настройки:
dcomcnfg).После этих манипуляций 1С сможет обращаться к объекту через стандартный вызов, а Windows сама позаботится о передаче данных между процессами разной разрядности.
Выясним причину, по которой сервер может «не видеть» даже зарегистрированный объект. Серверу 1С нужны права на чтение файлов библиотеки и на запуск объектов DCOM.
Проанализируем права на папку: учетная запись, под которой работает служба 1C:Enterprise 8.3 Server Agent (например, .\USR1CV8), должна иметь права «Чтение и выполнение» на папку C:\pdEcrIntegration\.
Также проверьте настройки DCOM для вашего объекта в «Службах компонентов»:
Рассмотрим специфику конкретно вашей задачи. Библиотека pdBluetoothService.dll работает с Bluetooth. Нужно понимать, что сервер 1С работает в так называемой «Сессии 0». Это неинтерактивная сессия, у которой нет доступа к графическому интерфейсу и часто ограничены возможности работы с локальным оборудованием (USB, Bluetooth).
Если кассовый аппарат подключен по Bluetooth к рабочему месту кассира, то попытка вызвать этот Bluetooth-стек на сервере физически не достучится до устройства, которое находится за сотни километров в другом офисе. В таких случаях архитектурно правильно оставлять работу с оборудованием &НаКлиенте.
Если же касса подключена непосредственно к серверному компьютеру, убедитесь, что служба Bluetooth в Windows Server включена (по умолчанию она может быть отключена или не установлена как роль).
Чтобы понять, где именно происходит сбой, используйте конструкцию Попытка...Исключение. Это позволит вывести подробное описание ошибки в лог.
&НаСервере
Процедура ПроверитьCOMОбъектНаСервере()
ИмяОбъекта = "pdBluetoothService.IntegrationClass"; // Уточните программный идентификатор (ProgID)
Попытка
ОбъектИнтеграции = Новый COMОбъект(ИмяОбъекта);
// Если дошли сюда — объект успешно создан
ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Информация, , , "Объект успешно создан на сервере.");
Исключение
ОписаниеОшибки = ИнформацияОбОшибке().Описание;
ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка создания объекта: " + ОписаниеОшибки);
ВызватьИсключение "Не удалось инициализировать компоненту на сервере. Проверьте регистрацию в COM+.";
КонецПопытки;
КонецПроцедуры
Подведем итог: для успешного использования COM-объекта на сервере необходимо обеспечить соответствие разрядности (через COM+), зарегистрировать библиотеку непосредственно в ОС сервера под правами администратора и убедиться, что у сервисного пользователя 1С достаточно прав на работу с компонентой.