При разработке и интеграции собственных внешних компонент (Native API) разработчики часто сталкиваются с ошибкой «Установка внешней компоненты не выполнена». Эта ошибка обычно возникает на этапе вызова метода УстановитьВнешнююКомпоненту, когда в качестве параметра передается обычный путь к файлу на локальном диске. Разберем детально, почему возникает данное поведение платформы «1С:Предприятие» и как правильно организовать подключение как на этапе разработки, так и при промышленной эксплуатации.
Проанализируем назначение метода УстановитьВнешнююКомпоненту. Данный метод предназначен для извлечения ZIP-архива компоненты из базы данных (макета конфигурации или хранилища значений) и его распаковки в специальный локальный кэш пользователя (каталог ExtCompT). Этот шаг обязателен для тонкого и веб-клиента перед непосредственным подключением, если компонента распространяется внутри конфигурации.
Метод УстановитьВнешнююКомпоненту не предназначен для работы с прямыми путями файловой системы (например, D:\Phone-Native.dll или D:\Phone-Native.zip). В качестве параметра он ожидает:
"ОбщийМакет.ДрайверОборудования").ПолучитьНавигационнуюСсылку()).Если передать в метод строку с путем к локальному диску, платформа не сможет распознать ресурс и вернет ошибку установки.
Если вы находитесь в процессе компиляции и отладки исходного кода C++, упаковывать библиотеку в ZIP-архив каждый раз неудобно. В этом случае вызывать УстановитьВнешнююКомпоненту вообще не нужно. Платформа умеет подключать скомпилированную DLL напрямую с локального диска.
Посмотрим на пример правильного подключения файла библиотеки:
АдресВнешнейКомпоненты = "D:\Phone-Native.dll";
Результат = ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты, "Datum", ТипВнешнейКомпоненты.Native);
Если Результат Тогда
// Создаем экземпляр объекта компоненты
ОбъектВК = Новый("AddIn.Datum.PhoneClass");
Иначе
ВызватьИсключение "Не удалось подключить внешнюю компоненту!";
КонецЕсли;
Обратите внимание на инициализацию объекта: первым сегментом имени выступает префикс AddIn, вторым — символическое имя подключения (в примере Datum), а третьим — имя класса, зарегистрированное в исходном коде библиотеки в методе GetClassNames.
Рассмотрим порядок действий для штатного встраивания компоненты в конфигурацию «1С:Предприятия». Чтобы компонента автоматически доставлялась на рабочие места пользователей тонкого клиента, выполним следующие шаги:
<bundle xmlns="http://v8.1c.ru/8.2/addin/bundle">
<component os="Windows" path="Phone-Native-32.dll" type="native" arch="i386"/>
<component os="Windows" path="Phone-Native-64.dll" type="native" arch="x86_64"/>
</bundle>
MANIFEST.xml и скомпилированные DLL-файлы нужных разрядностей в корень ZIP-архива (без создания лишних вложенных папок).ОбщийМакет с типом Двоичные данные и загрузим туда подготовленный ZIP-архив.Разберем программный код для установки и подключения компоненты из макета:
ИмяМакета = "ОбщийМакет.AddInPhoneNative";
СимволическоеИмя = "PhoneDriver";
// 1. Распаковываем компоненту в кэш клиента
Установлено = УстановитьВнешнююКомпоненту(ИмяМакета);
Если Установлено Тогда
// 2. Подключаем компоненту из кэша
Подключено = ПодключитьВнешнююКомпоненту(ИмяМакета, СимволическоеИмя, ТипВнешнейКомпоненты.Native);
Если Подключено Тогда
ОбъектВК = Новый("AddIn." + СимволическоеИмя + ".PhoneClass");
КонецЕсли;
КонецЕсли;
В современных конфигурациях при работе в режиме без использования модальных окон, а также в веб-клиенте, рекомендуется использовать неблокирующие асинхронные вызовы:
&НаКлиенте
Асинх Процедура ПодключитьДрайверАсинх()
ИмяМакета = "ОбщийМакет.AddInPhoneNative";
// Асинхронная установка в кэш
Установлено = Ждать УстановитьВнешнююКомпонентуАсинх(ИмяМакета);
Если Установлено Тогда
// Асинхронное подключение
Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(ИмяМакета, "PhoneDriver", ТипВнешнейКомпоненты.Native);
Если Подключено Тогда
ОбъектВК = Новый("AddIn.PhoneDriver.PhoneClass");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если даже при корректном синтаксисе методов 1С функция ПодключитьВнешнююКомпоненту возвращает Ложь, проверим следующие критические моменты:
1cv8c.exe), а не с общей разрядностью Windows./MT в Visual Studio).GetClassObject, DestroyObject, GetClassNames, SetPlatformCapabilities) должны быть объявлены как extern "C" и экспортированы без искажения имен через DEF-файл или __declspec(dllexport).