Как исправить ошибку подключения COM-компоненты Senselock в управляемых формах 1С 8.3

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

При переходе со старых конфигураций на обычных формах (например, «Бухгалтерия предприятия 2.0») на новые управляемые приложения (например, «Бухгалтерия предприятия 3.0») разработчики часто сталкиваются с аппаратными ограничениями интеграции внешнего оборудования и систем защиты. Типичный пример — работа с ключами защиты через COM-библиотеку SenselockKey.dll. Код, который годами безупречно работал на обычном приложении, в управляемом режиме начинает вызывать критические ошибки: «Метод не обнаружен» или «Тип не определен».

В этой статье мы подробно разберем, почему возникает данная проблема при смене архитектуры приложения, проанализируем внутренние механизмы платформы «1С:Предприятие 8.3» и рассмотрим наиболее надежные способы решения этой задачи в клиент-серверном и файловом вариантах работы.


Почему COM-компоненты ломаются при переходе на управляемые формы?

Давайте выясним первопричину такого поведения платформы. В обычном приложении весь код по умолчанию выполнялся на клиенте — в рамках одного Windows-процесса 1cv8.exe. В управляемом приложении (особенно в клиент-серверном варианте) происходит жесткое разделение контекста исполнения на клиентский (процесс 1cv8c.exe) и серверный (процесс rphost.exe).

Выделим ключевые факторы, из-за которых библиотека SenselockKey.dll отказывается работать на сервере 1С:

  1. Разрядность процессов (32-bit vs 64-bit). Если ваш сервер «1С:Предприятия» работает в 64-разрядном режиме, а библиотека SenselockKey.dll скомпилирована как 32-разрядное приложение (x86), то серверный процесс rphost.exe физически не сможет загрузить её в свое адресное пространство. Операционная система Windows не позволяет напрямую смешивать код разной разрядности в рамках одного процесса.
  2. Окружение и права пользователя службы 1С. Служба сервера 1С обычно запускается от имени системной учетной записи (например, USR1CV8). У этого пользователя нет доступа к веткам реестра текущего интерактивного пользователя (HKEY_CURRENT_USER), куда обычно регистрируются библиотеки. Сервер 1С просто «не видит» установленную в системе DLL-компоненту.
  3. Операционная система сервера. Если ваша СУБД (например, PostgreSQL) или сам сервер 1С развернуты на Unix-подобной ОС (Linux, CentOS, Ubuntu), работа с COM-объектами на стороне сервера становится полностью невозможной. Технология COM — это сугубо проприетарный механизм Windows.
  4. Безопасность платформы 1С. Начиная с версии платформы 8.3.15+, механизмы защиты от опасных действий могут блокировать выполнение внешнего недоверенного кода на стороне сервера, возвращая результат Ложь при попытке подключения.

Разбор синтаксиса: разница между ProgID в обычном и управляемом приложении

Обратим внимание на синтаксис инициализации компоненты. Часто разработчики путают способы вызова COM-объектов и внешних компонент 1С, созданных по технологии Native API.

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


ПрогИД = "Ком"; 
СтрокаКомпоненты = КаталогИБ() + "SenselockKey.dll"; 
Попытка 
    ПодключитьВнешнююКомпоненту(СтрокаКомпоненты, ПрогИД); 
Исключение 
    Возврат Ложь; 
КонецПопытки; 
senselock = Новый ("AddIn.Ком.SenselockKey");

В управляемом приложении при попытке вызвать данный код на стороне сервера часто возникает ошибка инициализации. Если мы передаем в метод ПодключитьВнешнююКомпоненту путь к локальному файлу на сервере, платформа может заблокировать этот вызов из соображений безопасности. Кроме того, важно правильно указывать идентификатор объекта при создании. Если при подключении мы указали имя группы "Ком", то создавать объект нужно строго через обращение "AddIn.Ком.SenselockKey", а не напрямую "AddIn.SenselockKey".


Основное решение: Использование макетов конфигурации и временного хранилища

Чтобы избежать проблем с поиском путей к файлам на сервере, отсутствием регистрации библиотеки в системном реестре Windows и разграничением прав доступа, применим современный и наиболее надежный стандарт разработки «1С» — **подключение внешней компоненты из макета конфигурации**.

Этот способ гарантирует, что библиотека будет автоматически доставлена на ту машину (серверную или клиентскую), где происходит вызов кода, и зарегистрирована во временном кэше платформы без прямого вмешательства в реестр Windows.

Рассмотрим пошагово реализацию этого механизма:

Шаг 1. Добавление компоненты в конфигурацию

Откроем конфигуратор, добавим новый Общий макет (или макет внутри обработки/справочника). Выберем тип макета: Внешняя компонента (или Двоичные данные). Загрузим в него файл нашей библиотеки SenselockKey.dll и назовем макет, например, SenselockKey.

Шаг 2. Разработка серверного и клиентского кода

Напишем код, который будет извлекать двоичные данные библиотеки из макета на сервере, помещать их во временное хранилище и передавать на клиента для непосредственной работы с ключом безопасности.


&НаСервере
Функция ПолучитьАдресКомпонентыНаСервере() Экспорт
    // Извлекаем макет с DLL-компонентой
    МакетКомпоненты = ПолучитьОбщийМакет("SenselockKey");
    
    // Помещаем двоичные данные во временное хранилище текущего сеанса
    АдресХранилища = ПоместитьВоВременноеХранилище(МакетКомпоненты);
    Возврат АдресХранилища;
КонецФункции

&НаКлиенте
Функция ПодключитьИИнициализироватьКлюч() Экспорт
    
    // Получаем адрес двоичных данных компоненты с сервера
    АдресКомпоненты = ПолучитьАдресКомпонентыНаСервере();
    
    // Имя группы для подключения компоненты в сеансе
    ИмяГруппы = "SenselockGroup";
    
    // Пытаемся подключить компоненту из временного хранилища
    Попытка
        РезультатПодключения = ПодключитьВнешнююКомпоненту(АдресКомпоненты, ИмяГруппы, ТипВнешнейКомпоненты.COM);
    Исключение
        ЗаписатьЛогСобытия("Ошибка подключения компоненты: " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
    
    Если Не РезультатПодключения Тогда
        Возврат Ложь;
    КонецЕсли;
    
    // Инициализируем COM-объект через зарегистрированную группу
    Попытка
        Senselock = Новый ("AddIn." + ИмяГруппы + ".SenselockKey");
    Исключение
        ЗаписатьЛогСобытия("Ошибка создания COM-объекта: " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
    
    // Вызываем целевые методы библиотеки защиты
    Попытка
        // Установка режима работы ключа
        Senselock.sense_setmode(2, "978660000000217F");
        
        // Опрос количества доступных ключей в USB-портах
        КоличествоКлючей = Senselock.sense_enum;
        
        Если КоличествоКлючей > 0 Тогда
            Возврат Истина;
        Иначе
            Возврат Ложь;
        КонецЕсли;
    Исключение
        ЗаписатьЛогСобытия("Ошибка при вызове методов компоненты: " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;

КонецФункции

Проанализируем этот код: функция ПодключитьВнешнююКомпоненту принимает адрес временного хранилища, куда мы предварительно загрузили файл DLL. Платформа самостоятельно извлекает файл из СУБД, сохраняет его в защищенный локальный кэш пользователя на диске и регистрирует СОМ-класс динамически для текущего сеанса 1С. Это исключает необходимость запуска утилиты regsvr32 под правами администратора.


Альтернативное решение: Использование службы компонентов Windows (COM+) при конфликте разрядности

Если вам критически важно запускать код опроса ключа строго на стороне сервера 1С (например, в регламентном задании), а сервер 1С имеет разрядность x64, то попытка напрямую подключить 32-битную DLL завершится ошибкой. В этом случае на помощь приходит системная служба COM+ операционной системы Windows.

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

  1. Откройте на сервере Windows панель управления и перейдите в Администрирование -> Службы компонентов.
  2. Перейдите в ветку Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правой кнопкой мыши и выберите Создать -> Приложение.
  4. В мастере создания выберите «Создать новое приложение», укажите имя (например, SenselockBridge) и установите переключатель в положение «Серверное приложение» (это заставит библиотеку запускаться в изолированном системном процессе dllhost.exe).
  5. На шаге выбора учетной записи укажите системного пользователя или администратора, от имени которого будет запускаться библиотека (убедитесь, что у него есть права на чтение файлов DLL).
  6. В созданном приложении перейдите в ветку Компоненты, нажмите Создать -> Компонент и выберите вашу зарегистрированную библиотеку SenselockKey.dll.

После этой несложной настройки операционная система Windows начнет выступать мостом-посредником. Когда 64-битный сервер 1С выполнит инструкцию создания COM-объекта, Windows автоматически запустит 32-битный процесс dllhost.exe, загрузит в него библиотеку Senselock и организует безопасный межпроцессный обмен (RPC) между 64-битным процессом 1С и 32-битной компонентой.


Важные рекомендации по работе с аппаратными ключами

При интеграции систем защиты класса Senselock помните о физическом расположении ключа:

Используя предложенные методики, мы гарантируем стабильную работу оборудования в любых современных конфигурациях 1С на управляемых формах.

← На главную