При работе с внешними библиотеками на стороне сервера 1С разработчики часто сталкиваются с ситуацией, когда функция ПодключитьВнешнююКомпоненту возвращает значение ЛОЖЬ. При этом библиотека может быть успешно зарегистрирована через regsvr32.exe в операционной системе, но рабочий процесс 1С всё равно отказывается с ней работать.
Рассмотрим типовую ситуацию, когда вызов кода выполняется на сервере:
&НаСервере
Процедура XотчетНаСервере(ДанныеУстройства)
ИмяФайла = "AddIn.МояБиблиотека";
Подключено = ПодключитьВнешнююКомпоненту(ИмяФайла);
КонецПроцедура
Проанализируем основные причины возникновения этой проблемы и разберем по шагам доступные варианты её решения.
Самая распространенная причина ошибки — попытка загрузить 32-битную DLL-библиотеку (x86) напрямую в 64-битный рабочий процесс сервера 1С (rphost.exe). 64-битный процесс физически не может загрузить внутрипроцессный COM-объект или динамическую библиотеку разрядности 32 бит в свой адресный поток.
При использовании системной утилиты regsvr32 важно учитывать, какую именно версию вы запускали:
C:\Windows\System32\regsvr32.exe — используется для регистрации 64-битных библиотек на 64-битных системах.C:\Windows\SysWOW64\regsvr32.exe — используется для регистрации 32-битных компонент на 64-битных системах.Даже если 32-битная библиотека зарегистрирована корректно через SysWOW64, 64-битный сервер 1С не сможет подключить её напрямую через ПодключитьВнешнююКомпоненту.
Если вам необходимо использовать 32-битный COM-объект на 64-битном сервере 1С, наилучшим решением является создание суррогатного процесса через службы компонентов Windows (COM+).
Рассмотрим по шагам настройку обертки COM+:
C:\Windows\SysWOW64\regsvr32.exe путь_к_файлу.dll.dcomcnfg.После настройки COM+ библиотека будет запускаться в отдельном 32-битном процессе dllhost.exe, а 64-битный сервер 1С сможет взаимодействовать с ней по протоколу DCOM. В коде 1С при этом используется создание объекта через Новый COMОбъект:
&НаСервере
Процедура ВыполнитьДействиеНаСервере()
// Вместо ПодключитьВнешнююКомпоненту используем COM-соединение
Объект = Новый COMОбъект("AddIn.МояБиблиотека");
// Выполнение необходимых методов объекта
КонецПроцедура
Вызов метода ПодключитьВнешнююКомпоненту требует четкого указания типа компоненты и правильного ProgID или имени файла. Разберем синтаксис метода:
ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
Посмотрим на пример явного задания параметров для COM и Native API компонент:
// Для COM-компоненты по ProgID
Подключено = ПодключитьВнешнююКомпоненту("AddIn.МояБиблиотека", "МояБиблиотека", ТипВнешнейКомпоненты.COM);
// Для Native API компоненты
Подключено = ПодключитьВнешнююКомпоненту("C:\PathTo\MyAddIn.dll", "МояБиблиотека", ТипВнешнейКомпоненты.Native);
Если тип компоненты указан неверно (например, указан Native для классического COM-объекта), платформа вернет ЛОЖЬ.
Для Native API компонент рекомендуемым стандартом 1С является сборка ZIP-архива, содержащего библиотеки под различные архитектуры (x86 и x64), а также специальный файл описания manifest.xml.
В этом случае вызов выполняется через предварительную установку компоненты из макета или файла:
&НаСервере
Процедура ПодключитьАрхивКомпоненты()
// Путь к архиву или макету с компонентой
ИмяФайла = "c:\temp\MyComponent.zip";
// Установка и публикация компоненты
УспешноУстановлено = УстановитьВнешнююКомпоненту(ИмяФайла);
Если УспешноУстановлено Тогда
// Подключение по имени из манифеста
Подключено = ПодключитьВнешнююКомпоненту("AddIn.MyComponent");
КонецЕсли;
КонецПроцедура
При таком подходе платформа 1С автоматически выберет из архива нужный файл .dll или .so в зависимости от разрядности текущего процесса сервера или клиента.
Если разрядность библиотеки совпадает с разрядностью сервера, но вызов всё равно завершается ошибкой, проанализируем следующие моменты:
1C:Enterprise Server часто запущен под локальной учетной записью (например, usr1cv8). Эта учетная запись может не иметь прав на чтение каталога с DLL или прав на доступ к соответствующим веткам реестра Windows (особенно если регистрация выполнялась в HKEY_CURRENT_USER).В случаях, когда компонента предназначена для работы с торговым или физическим оборудованием (сканеры штрихкодов, ККТ, эквайринговые терминалы), вызывать её на сервере не следует. Выполнение работы с оборудованием необходимо переносить на клиентский контекст:
&НаКлиенте
Процедура ПодключитьОборудованиеНаКлиенте()
ИмяФайла = "AddIn.МояБиблиотека";
Подключено = ПодключитьВнешнююКомпоненту(ИмяФайла);
Если Подключено Тогда
// Создание объекта компоненты на клиенте
ОбъектОборудования = Новый("AddIn.МояБиблиотека");
КонецЕсли;
КонецПроцедура
Подводя итог: при поиске причин ошибки первоначально необходимо проверить совпадение разрядности сервера 1С и библиотеки, затем проверить права учетной записи службы сервера 1С, и при необходимости применить обертку COM+ или перенести выполнение операции на клиентскую сторону.