При переходе со старых конфигураций на обычных формах (например, «Бухгалтерия предприятия 2.0») на новые управляемые приложения (например, «Бухгалтерия предприятия 3.0») разработчики часто сталкиваются с аппаратными ограничениями интеграции внешнего оборудования и систем защиты. Типичный пример — работа с ключами защиты через COM-библиотеку SenselockKey.dll. Код, который годами безупречно работал на обычном приложении, в управляемом режиме начинает вызывать критические ошибки: «Метод не обнаружен» или «Тип не определен».
В этой статье мы подробно разберем, почему возникает данная проблема при смене архитектуры приложения, проанализируем внутренние механизмы платформы «1С:Предприятие 8.3» и рассмотрим наиболее надежные способы решения этой задачи в клиент-серверном и файловом вариантах работы.
Давайте выясним первопричину такого поведения платформы. В обычном приложении весь код по умолчанию выполнялся на клиенте — в рамках одного Windows-процесса 1cv8.exe. В управляемом приложении (особенно в клиент-серверном варианте) происходит жесткое разделение контекста исполнения на клиентский (процесс 1cv8c.exe) и серверный (процесс rphost.exe).
Выделим ключевые факторы, из-за которых библиотека SenselockKey.dll отказывается работать на сервере 1С:
SenselockKey.dll скомпилирована как 32-разрядное приложение (x86), то серверный процесс rphost.exe физически не сможет загрузить её в свое адресное пространство. Операционная система Windows не позволяет напрямую смешивать код разной разрядности в рамках одного процесса.USR1CV8). У этого пользователя нет доступа к веткам реестра текущего интерактивного пользователя (HKEY_CURRENT_USER), куда обычно регистрируются библиотеки. Сервер 1С просто «не видит» установленную в системе DLL-компоненту.Ложь при попытке подключения.Обратим внимание на синтаксис инициализации компоненты. Часто разработчики путают способы вызова COM-объектов и внешних компонент 1С, созданных по технологии Native API.
В обычном приложении подключение выглядело следующим образом:
ПрогИД = "Ком";
СтрокаКомпоненты = КаталогИБ() + "SenselockKey.dll";
Попытка
ПодключитьВнешнююКомпоненту(СтрокаКомпоненты, ПрогИД);
Исключение
Возврат Ложь;
КонецПопытки;
senselock = Новый ("AddIn.Ком.SenselockKey");
В управляемом приложении при попытке вызвать данный код на стороне сервера часто возникает ошибка инициализации. Если мы передаем в метод ПодключитьВнешнююКомпоненту путь к локальному файлу на сервере, платформа может заблокировать этот вызов из соображений безопасности. Кроме того, важно правильно указывать идентификатор объекта при создании. Если при подключении мы указали имя группы "Ком", то создавать объект нужно строго через обращение "AddIn.Ком.SenselockKey", а не напрямую "AddIn.SenselockKey".
Чтобы избежать проблем с поиском путей к файлам на сервере, отсутствием регистрации библиотеки в системном реестре Windows и разграничением прав доступа, применим современный и наиболее надежный стандарт разработки «1С» — **подключение внешней компоненты из макета конфигурации**.
Этот способ гарантирует, что библиотека будет автоматически доставлена на ту машину (серверную или клиентскую), где происходит вызов кода, и зарегистрирована во временном кэше платформы без прямого вмешательства в реестр Windows.
Рассмотрим пошагово реализацию этого механизма:
Откроем конфигуратор, добавим новый Общий макет (или макет внутри обработки/справочника). Выберем тип макета: Внешняя компонента (или Двоичные данные). Загрузим в него файл нашей библиотеки SenselockKey.dll и назовем макет, например, SenselockKey.
Напишем код, который будет извлекать двоичные данные библиотеки из макета на сервере, помещать их во временное хранилище и передавать на клиента для непосредственной работы с ключом безопасности.
&НаСервере
Функция ПолучитьАдресКомпонентыНаСервере() Экспорт
// Извлекаем макет с DLL-компонентой
МакетКомпоненты = ПолучитьОбщийМакет("SenselockKey");
// Помещаем двоичные данные во временное хранилище текущего сеанса
АдресХранилища = ПоместитьВоВременноеХранилище(МакетКомпоненты);
Возврат АдресХранилища;
КонецФункции
&НаКлиенте
Функция ПодключитьИИнициализироватьКлюч() Экспорт
// Получаем адрес двоичных данных компоненты с сервера
АдресКомпоненты = ПолучитьАдресКомпонентыНаСервере();
// Имя группы для подключения компоненты в сеансе
ИмяГруппы = "SenselockGroup";
// Пытаемся подключить компоненту из временного хранилища
Попытка
РезультатПодключения = ПодключитьВнешнююКомпоненту(АдресКомпоненты, ИмяГруппы, ТипВнешнейКомпоненты.COM);
Исключение
ЗаписатьЛогСобытия("Ошибка подключения компоненты: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Если Не РезультатПодключения Тогда
Возврат Ложь;
КонецЕсли;
// Инициализируем COM-объект через зарегистрированную группу
Попытка
Senselock = Новый ("AddIn." + ИмяГруппы + ".SenselockKey");
Исключение
ЗаписатьЛогСобытия("Ошибка создания COM-объекта: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
// Вызываем целевые методы библиотеки защиты
Попытка
// Установка режима работы ключа
Senselock.sense_setmode(2, "978660000000217F");
// Опрос количества доступных ключей в USB-портах
КоличествоКлючей = Senselock.sense_enum;
Если КоличествоКлючей > 0 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Исключение
ЗаписатьЛогСобытия("Ошибка при вызове методов компоненты: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Проанализируем этот код: функция ПодключитьВнешнююКомпоненту принимает адрес временного хранилища, куда мы предварительно загрузили файл DLL. Платформа самостоятельно извлекает файл из СУБД, сохраняет его в защищенный локальный кэш пользователя на диске и регистрирует СОМ-класс динамически для текущего сеанса 1С. Это исключает необходимость запуска утилиты regsvr32 под правами администратора.
Если вам критически важно запускать код опроса ключа строго на стороне сервера 1С (например, в регламентном задании), а сервер 1С имеет разрядность x64, то попытка напрямую подключить 32-битную DLL завершится ошибкой. В этом случае на помощь приходит системная служба COM+ операционной системы Windows.
Разберем алгоритм настройки суррогатного процесса:
Компьютеры -> Мой компьютер -> Приложения COM+.Создать -> Приложение.SenselockBridge) и установите переключатель в положение «Серверное приложение» (это заставит библиотеку запускаться в изолированном системном процессе dllhost.exe).Компоненты, нажмите Создать -> Компонент и выберите вашу зарегистрированную библиотеку SenselockKey.dll.После этой несложной настройки операционная система Windows начнет выступать мостом-посредником. Когда 64-битный сервер 1С выполнит инструкцию создания COM-объекта, Windows автоматически запустит 32-битный процесс dllhost.exe, загрузит в него библиотеку Senselock и организует безопасный межпроцессный обмен (RPC) между 64-битным процессом 1С и 32-битной компонентой.
При интеграции систем защиты класса Senselock помните о физическом расположении ключа:
Используя предложенные методики, мы гарантируем стабильную работу оборудования в любых современных конфигурациях 1С на управляемых формах.