При интеграции 1С:Предприятие 8.3 с торговым оборудованием или сторонними сервисами разработчики часто используют внешние компоненты в формате DLL. В ходе вызова функции ПодключитьВнешнююКомпоненту система может возвращать значение Ложь, даже если динамическая библиотека успешно зарегистрирована в Windows с помощью утилиты regsvr32. Проанализируем ключевые причины возникновения такой проблемы и разберем способы их устранения.
Рассмотрим случай, когда подключение выполняется через COM-технологию по имени программного идентификатора (ProgID). Если в коде 1С имя указано с ошибкой или опечаткой, платформа не сможет найти соответствующую запись в системном реестре.
Посмотрим на пример кода с опечаткой:
ProgID = "AddIn.smDrvFR1CLib20";
Результат = ПодключитьВнешнююКомпоненту(ProgID);
Если Не Результат Тогда
Сообщить("Не удалось подключить внешнюю компоненту!");
КонецЕсли;
Если драйвер оборудования регистрирует класс под другим именем (например, AddIn.SMDrvFR1C20), вызов метода вернет Ложь. Чтобы проверить корректность идентификатора, выполним следующие действия:
regedit).HKEY_CLASSES_ROOT.InprocServer32 содержит корректный путь к файлу DLL.Выясним причину, связанную с архитектурой исполняемых процессов. 64-разрядное приложение 1С:Предприятие не может напрямую загрузить 32-разрядную DLL в свой адресный процесс.
В 64-битных операционных системах Windows утилита regsvr32 из папки SysWOW64 заносит данные 32-битных библиотек в ветку реестра WOW6432Node. В результате 64-битный клиент 1С ищет COM-класс в основном кусте реестра и не находит его, возвращая Ложь.
Разберем варианты решения данной ситуации:
Program Files (x86)), если внешняя компонента поставляется только в 32-битной версии.dllhost.exe в Службах компонентов Windows (COM+).Успешная регистрация библиотеки через regsvr32 проверяет лишь наличие экспортируемой функции регистрации, но не гарантирует полную загрузку внешних зависимостей. Если на сервере или рабочем столе пользователя отсутствуют нужные версии пакетов Microsoft Visual C++ Redistributable, Windows не сможет загрузить DLL в память, и 1С вернет Ложь.
Для решения проблемы стоит проверить зависимости динамической библиотеки с помощью утилит анализа (например, Dependencies) и установить требуемые компоненты Visual C++ Runtime.
Проанализируем контекст выполнения кода в 1С:
ПодключитьВнешнююКомпоненту вызывается на сервере (&НаСервере), библиотека должна быть установлена непосредственно на серверном ПК. Разрядность библиотеки должна совпадать с разрядностью службы 1С:Предприятие, а сама служба должна иметь права на чтение файла DLL.change user /install.Чтобы исключить зависимость от системного реестра Windows и прав администратора, рекомендуется использовать внешние компоненты, разработанные по технологии Native API. В этом случае компонента помещается в макет конфигурации в виде ZIP-архива.
Рассмотрим пример подключения Native API компоненты из макета:
Результат = ПодключитьВнешнююКомпоненту("Макет.ДрайверОборудования", "Оборудование", ТипПодключенияВнешнейКомпоненты.Изолированно);
Если Результат Тогда
ОбъектКомпоненты = Новый("AddIn.Оборудование.SMDrvFR1C20");
КонецЕсли;
Параметр ТипПодключенияВнешнейКомпоненты.Изолированно запускает компоненту в отдельном служебном процессе, что предотвращает аварийное завершение работы 1С:Предприятие в случае ошибок внутри драйвера.