Как использовать COM-объект на сервере 1С, если он работает только на клиенте?

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

При разработке интеграций с внешним оборудованием или сторонними сервисами программисты 1С часто сталкиваются с ситуацией, когда библиотека (DLL), успешно работающая в коде &НаКлиенте, наотрез отказывается инициализироваться в серверном контексте &НаСервере. Обычно это сопровождается ошибкой «-2147221164(0x80040154): Класс не зарегистрирован». Ситуация осложняется, когда логика интеграции должна быть скрыта в модуле объекта или выполняться в регламентных заданиях, где клиентского контекста попросту не существует.

Рассмотрим подробно, почему возникает эта проблема и как правильно настроить серверную среду для корректной работы с COM-объектами и .NET сборками.

Причины возникновения ошибки «Класс не зарегистрирован» на сервере

Проанализируем ситуацию: когда вы регистрируете библиотеку на своем рабочем компьютере, вы делаете это для текущего пользователя и текущей архитектуры (чаще всего 32-битной). Сервер 1С — это отдельная сущность, работающая под собственной учетной записью и имеющая свои особенности. Основных причин «невидимости» объекта три:

  1. Разная разрядность (Architecture Mismatch): Если ваш сервер 1С 64-разрядный (x64), он не может напрямую загрузить 32-разрядную (x86) библиотеку в свое адресное пространство.
  2. Отсутствие регистрации на физическом сервере: Регистрация компоненты на клиентском компьютере никак не влияет на реестр сервера. Компоненту нужно регистрировать именно там, где выполняется код.
  3. Контекст учетной записи: Служба 1С обычно запускается под пользователем USR1CV8. У этой учетной записи нет доступа к веткам реестра HKEY_CURRENT_USER обычного пользователя, и часто ограничены права на запуск DCOM.

Шаг 1. Правильная регистрация .NET сборки через RegAsm

Если ваша библиотека является .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Объект(...) все равно выдаст ошибку. В этом случае переходим к следующему шагу.

Шаг 2. Использование «Служб компонентов» (COM+) для решения проблем разрядности

Это самый надежный способ «подружить» 64-битный сервер 1С и 32-битную компоненту. Мы создадим специальный суррогатный процесс (dllhost.exe), который будет выступать посредником.

Разберем алгоритм настройки:

  1. Откройте на сервере Панель управления — Администрирование — Службы компонентов (или выполните dcomcnfg).
  2. Перейдите в ветку Компьютеры — Мой компьютер — Приложения COM+.
  3. Нажмите правой кнопкой мыши и выберите Создать — Приложение.
  4. В мастере создания выберите Создать новое приложение. Дайте ему понятное имя, например, "1C_Integration_Service".
  5. Установите способ активации: Серверное приложение (это создаст отдельный процесс).
  6. На вкладке «Удостоверение» (Identity) выберите Локальная служба или укажите данные конкретного пользователя с правами администратора (это поможет избежать проблем с правами доступа).
  7. После создания приложения, разверните его ветку, найдите папку Компоненты.
  8. Нажмите правой кнопкой — Создать — Компонент. Выберите Установка новых компонентов и укажите вашу DLL.

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

Шаг 3. Проверка прав доступа учетной записи сервера 1С

Выясним причину, по которой сервер может «не видеть» даже зарегистрированный объект. Серверу 1С нужны права на чтение файлов библиотеки и на запуск объектов DCOM.

Проанализируем права на папку: учетная запись, под которой работает служба 1C:Enterprise 8.3 Server Agent (например, .\USR1CV8), должна иметь права «Чтение и выполнение» на папку C:\pdEcrIntegration\.

Также проверьте настройки DCOM для вашего объекта в «Службах компонентов»:

Особенности работы с оборудованием (Bluetooth) на сервере

Рассмотрим специфику конкретно вашей задачи. Библиотека pdBluetoothService.dll работает с Bluetooth. Нужно понимать, что сервер 1С работает в так называемой «Сессии 0». Это неинтерактивная сессия, у которой нет доступа к графическому интерфейсу и часто ограничены возможности работы с локальным оборудованием (USB, Bluetooth).

Если кассовый аппарат подключен по Bluetooth к рабочему месту кассира, то попытка вызвать этот Bluetooth-стек на сервере физически не достучится до устройства, которое находится за сотни километров в другом офисе. В таких случаях архитектурно правильно оставлять работу с оборудованием &НаКлиенте.

Если же касса подключена непосредственно к серверному компьютеру, убедитесь, что служба Bluetooth в Windows Server включена (по умолчанию она может быть отключена или не установлена как роль).

Пример кода для проверки доступности объекта

Чтобы понять, где именно происходит сбой, используйте конструкцию Попытка...Исключение. Это позволит вывести подробное описание ошибки в лог.


&НаСервере
Процедура ПроверитьCOMОбъектНаСервере()
    ИмяОбъекта = "pdBluetoothService.IntegrationClass"; // Уточните программный идентификатор (ProgID)
    Попытка
        ОбъектИнтеграции = Новый COMОбъект(ИмяОбъекта);
        // Если дошли сюда — объект успешно создан
        ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Информация, , , "Объект успешно создан на сервере.");
    Исключение
        ОписаниеОшибки = ИнформацияОбОшибке().Описание;
        ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка создания объекта: " + ОписаниеОшибки);
        ВызватьИсключение "Не удалось инициализировать компоненту на сервере. Проверьте регистрацию в COM+.";
    КонецПопытки;
КонецПроцедуры

Подведем итог: для успешного использования COM-объекта на сервере необходимо обеспечить соответствие разрядности (через COM+), зарегистрировать библиотеку непосредственно в ОС сервера под правами администратора и убедиться, что у сервисного пользователя 1С достаточно прав на работу с компонентой.

← На главную