При разработке и внедрении решений на платформе 1С:Предприятие часто возникает необходимость расширить стандартные возможности системы с помощью внешних компонент. Однако нередко разработчики сталкиваются с ситуацией, когда проверенный код, отлично работавший на одной машине, на другом компьютере наотрез отказывается запускаться. Функция ПодключитьВнешнююКомпоненту при этом просто возвращает значение Ложь, не выдавая детальных ошибок в системный журнал.
В этой статье мы подробно проанализируем причины, по которым внешняя компонента может не подключаться (особенно при её вызове из макета расширения конфигурации), и разберем по шагам, как настроить систему для её стабильной работы.
Это самая распространенная причина сбоя, с которой столкнулся автор темы при переносе базы на новый компьютер. Даже если на обоих компьютерах установлена 64-разрядная операционная система Windows, сама платформа 1С:Предприятие может быть запущена в разных версиях.
Если внешняя компонента (DLL-файл) скомпилирована как 32-битная (x86), она физически не сможет загрузиться в процесс 64-битного клиента 1С (x64). И наоборот, 64-битная библиотека не заработает под 32-битным клиентом платформы.
Как решить проблему правильно без даунгрейда платформы:
Перевод пользователя на 32-битный клиент — это лишь временная мера, которая искусственно ограничивает объем используемой оперативной памяти. Для полноценного решения проблемы рекомендуется использовать технологию многоплатформенных внешних компонент. Рассмотрим этот процесс по шагам:
AddIn_x86.dll для 32-битных систем и AddIn_x64.dll для 64-битных.manifest.xml, который указывает платформе 1С, какую библиотеку в каком случае использовать. Пример структуры такого файла:
<?xml version="1.0" encoding="UTF-8"?>
<bundle xmlns="http://v8.1c.ru/8.2/addin/bundle">
<component os="Windows" architecture="i386" path="AddIn_x86.dll" componentId="AL"/>
<component os="Windows" architecture="x86_64" path="AddIn_x64.dll" componentId="AL"/>
</bundle>
Если вы подключаете компоненту из общего макета, который расположен в расширении конфигурации, вы можете столкнуться с жесткой системой безопасности платформы. По умолчанию все вновь подключаемые расширения работают в так называемом безопасном режиме.
В этом режиме накладывается строгий запрет на выполнение операций, которые потенциально могут нанести вред операционной системе, в том числе полностью блокируется загрузка любых внешних библиотек программного кода.
Как исправить настройки безопасности:
Для устранения этой преграды нам необходимо отключить безопасный режим для конкретного расширения. Выполним следующие действия:
Жалоба пользователя «на старом ноутбуке всё работало, на новом не хочет» очень часто указывает на отсутствие базового системного окружения на новом компьютере. Внешние компоненты Native API пишутся на языке C++ и компилируются в среде разработки Microsoft Visual Studio.
Для их выполнения в операционной системе Windows обязательно должны быть установлены соответствующие пакеты Microsoft Visual C++ Redistributable (распространяемые пакеты сред выполнения). Если на старом рабочем компьютере они накопились со временем при установке других программ, то на «чистой» операционной системе нового ноутбука их просто нет.
Решение проблемы:
Выясните, с помощью какой версии компилятора была создана ваша DLL-библиотека, или просто установите на новый компьютер накопительный пакет Microsoft Visual C++ Redistributable за последние годы (включая версии 2015–2022). Крайне важно устанавливать пакеты той разрядности, которая соответствует разрядности вашего запущенного клиента 1С.
В коде, представленном в вопросе, используется синхронный метод подключения:
Возврат ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(
ПолучитьОбщийМакет("AddInALIntegration")), "AL", ТипВнешнейКомпоненты.Native);
В современных версиях платформы 1С:Предприятие (особенно при работе в тонком клиенте или через веб-браузер) синхронные вызовы считаются устаревшими. Они могут вызывать кратковременное зависание интерфейса программы или полностью блокироваться веб-клиентами по соображениям безопасности.
Рекомендуется переписать процедуру с использованием асинхронной модели работы:
Сначала мы инициируем фоновую установку компоненты на компьютер пользователя, а затем выполняем её подключение с помощью асинхронных методов. Посмотрим на пример реализации такого кода:
&НаКлиенте
Асинхронная Процедура ПодключитьКомпонентуАсинхронно()
ИмяМакета = "ОбщийМакет.AddInALIntegration";
// Сначала устанавливаем компоненту на компьютер
РезультатУстановки = Ждать НачатьУстановкуВнешнейКомпонентыАсинхронно(ИмяМакета);
Если РезультатУстановки Тогда
// Если установка прошла успешно, подключаем её в сеансе
РезультатПодключения = Ждать НачатьПодключениеВнешнейКомпонентыАсинхронно("AL");
Если РезультатПодключения Тогда
ПоказатьПредупреждение(, "Внешняя компонента успешно подключена!");
Иначе
ПоказатьПредупреждение(, "Не удалось подключить внешнюю компоненту.");
КонецЕсли;
Иначе
ПоказатьПредупреждение(, "Не удалось установить внешнюю компоненту.");
EndIf;
КонецПроцедуры
При вызове метода ПодключитьВнешнююКомпоненту из макета платформа 1С производит скрытую операцию: она берет двоичные данные библиотеки (DLL-файл), распаковывает их во временный каталог операционной системы пользователя (папку Temp) и только после этого осуществляет загрузку в память.
На новых рабочих станциях с жесткими политиками безопасности или активным встроенным антивирусом (например, Windows Defender) попытка стороннего приложения (в данном случае процесса 1cv8.exe) записать исполняемый DLL-файл в системную временную папку и запустить его оттуда мгновенно блокируется.
Для решения этой проблемы выполните следующие действия:
%TEMP%).Если внешняя компонента написана сторонними разработчиками, существует риск возникновения критических ошибок памяти внутри её бинарного кода. В стандартном режиме работы сбой внутри внешней компоненты приводит к моментальному аварийному завершению всего сеанса 1С у пользователя.
Для предотвращения подобных ситуаций в новых версиях платформы реализован изолированный режим работы.
При таком подключении компонента запускается в выделенном операционной системой отдельном процессе. Если в ней произойдет сбой, упадет только этот изолированный процесс, а сеанс пользователя 1С продолжит работу в штатном режиме. Для этого при подключении передается специальный параметр:
// Пример подключения компоненты в изолированном режиме
Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет.AddInALIntegration", "AL", ТипВнешнейКомпоненты.Native, ТипПодключенияВнешнейКомпоненты.Изолированно);