Почему не подключается внешняя компонента в 1С и как решить эту проблему?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке и внедрении решений на платформе 1С:Предприятие часто возникает необходимость расширить стандартные возможности системы с помощью внешних компонент. Однако нередко разработчики сталкиваются с ситуацией, когда проверенный код, отлично работавший на одной машине, на другом компьютере наотрез отказывается запускаться. Функция ПодключитьВнешнююКомпоненту при этом просто возвращает значение Ложь, не выдавая детальных ошибок в системный журнал.

В этой статье мы подробно проанализируем причины, по которым внешняя компонента может не подключаться (особенно при её вызове из макета расширения конфигурации), и разберем по шагам, как настроить систему для её стабильной работы.

Причина 1. Несовпадение разрядности клиента 1С и библиотеки внешней компоненты

Это самая распространенная причина сбоя, с которой столкнулся автор темы при переносе базы на новый компьютер. Даже если на обоих компьютерах установлена 64-разрядная операционная система Windows, сама платформа 1С:Предприятие может быть запущена в разных версиях.

Если внешняя компонента (DLL-файл) скомпилирована как 32-битная (x86), она физически не сможет загрузиться в процесс 64-битного клиента 1С (x64). И наоборот, 64-битная библиотека не заработает под 32-битным клиентом платформы.

Как решить проблему правильно без даунгрейда платформы:

Перевод пользователя на 32-битный клиент — это лишь временная мера, которая искусственно ограничивает объем используемой оперативной памяти. Для полноценного решения проблемы рекомендуется использовать технологию многоплатформенных внешних компонент. Рассмотрим этот процесс по шагам:

  1. Подготовка библиотек: Разработчик компоненты должен предоставить версии файлов под разные архитектуры — например, AddIn_x86.dll для 32-битных систем и AddIn_x64.dll для 64-битных.
  2. Создание манифеста: В текстовом редакторе создается специальный файл с именем 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>
  1. Упаковка архива: Обе библиотеки и файл манифеста упаковываются в один общий ZIP-архив. Этот архив загружается в общий макет конфигурации или расширения.
  2. Подключение: При вызове метода подключения платформа сама распакует нужный файл в зависимости от того, какой клиент (32 или 64 бита) сейчас запущен у пользователя.

Причина 2. Ограничения безопасного режима в расширениях

Если вы подключаете компоненту из общего макета, который расположен в расширении конфигурации, вы можете столкнуться с жесткой системой безопасности платформы. По умолчанию все вновь подключаемые расширения работают в так называемом безопасном режиме.

В этом режиме накладывается строгий запрет на выполнение операций, которые потенциально могут нанести вред операционной системе, в том числе полностью блокируется загрузка любых внешних библиотек программного кода.

Как исправить настройки безопасности:

Для устранения этой преграды нам необходимо отключить безопасный режим для конкретного расширения. Выполним следующие действия:

  1. Запустите информационную базу в режиме «1С:Предприятие» под учетной записью с правами администратора.
  2. Перейдите в меню «Функции для технического специалиста» (или «Все функции»).
  3. Найдите и откройте стандартный список «Расширения».
  4. В появившемся списке выберите ваше расширение, из макета которого вызывается компонента.
  5. Найдите флажок «Безопасный режим» и снимите его. При необходимости также снимите флажок «Защита от опасных действий».
  6. Перезапустите сеанс работы пользователя.

Причина 3. Отсутствие системных библиотек Microsoft Visual C++

Жалоба пользователя «на старом ноутбуке всё работало, на новом не хочет» очень часто указывает на отсутствие базового системного окружения на новом компьютере. Внешние компоненты Native API пишутся на языке C++ и компилируются в среде разработки Microsoft Visual Studio.

Для их выполнения в операционной системе Windows обязательно должны быть установлены соответствующие пакеты Microsoft Visual C++ Redistributable (распространяемые пакеты сред выполнения). Если на старом рабочем компьютере они накопились со временем при установке других программ, то на «чистой» операционной системе нового ноутбука их просто нет.

Решение проблемы:

Выясните, с помощью какой версии компилятора была создана ваша DLL-библиотека, или просто установите на новый компьютер накопительный пакет Microsoft Visual C++ Redistributable за последние годы (включая версии 2015–2022). Крайне важно устанавливать пакеты той разрядности, которая соответствует разрядности вашего запущенного клиента 1С.

Причина 4. Использование устаревших синхронных методов

В коде, представленном в вопросе, используется синхронный метод подключения:


Возврат ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(
                    ПолучитьОбщийМакет("AddInALIntegration")), "AL", ТипВнешнейКомпоненты.Native);

В современных версиях платформы 1С:Предприятие (особенно при работе в тонком клиенте или через веб-браузер) синхронные вызовы считаются устаревшими. Они могут вызывать кратковременное зависание интерфейса программы или полностью блокироваться веб-клиентами по соображениям безопасности.

Рекомендуется переписать процедуру с использованием асинхронной модели работы:

Сначала мы инициируем фоновую установку компоненты на компьютер пользователя, а затем выполняем её подключение с помощью асинхронных методов. Посмотрим на пример реализации такого кода:


&НаКлиенте
Асинхронная Процедура ПодключитьКомпонентуАсинхронно()
    
    ИмяМакета = "ОбщийМакет.AddInALIntegration";
    
    // Сначала устанавливаем компоненту на компьютер
    РезультатУстановки = Ждать НачатьУстановкуВнешнейКомпонентыАсинхронно(ИмяМакета);
    
    Если РезультатУстановки Тогда
        // Если установка прошла успешно, подключаем её в сеансе
        РезультатПодключения = Ждать НачатьПодключениеВнешнейКомпонентыАсинхронно("AL");
        Если РезультатПодключения Тогда
            ПоказатьПредупреждение(, "Внешняя компонента успешно подключена!");
        Иначе
            ПоказатьПредупреждение(, "Не удалось подключить внешнюю компоненту.");
        КонецЕсли;
    Иначе
        ПоказатьПредупреждение(, "Не удалось установить внешнюю компоненту.");
    EndIf;
    
КонецПроцедуры

Причина 5. Блокировки со стороны антивирусного ПО и права доступа к папке Temp

При вызове метода ПодключитьВнешнююКомпоненту из макета платформа 1С производит скрытую операцию: она берет двоичные данные библиотеки (DLL-файл), распаковывает их во временный каталог операционной системы пользователя (папку Temp) и только после этого осуществляет загрузку в память.

На новых рабочих станциях с жесткими политиками безопасности или активным встроенным антивирусом (например, Windows Defender) попытка стороннего приложения (в данном случае процесса 1cv8.exe) записать исполняемый DLL-файл в системную временную папку и запустить его оттуда мгновенно блокируется.

Для решения этой проблемы выполните следующие действия:

  1. Проверьте права текущего пользователя Windows на чтение и запись в его персональную папку временных файлов (каталог %TEMP%).
  2. Добавьте каталоги кэша 1С и временных файлов операционной системы в список исключений вашего антивируса.

Причина 6. Падение платформы при ошибках в коде компоненты (Изолированный режим)

Если внешняя компонента написана сторонними разработчиками, существует риск возникновения критических ошибок памяти внутри её бинарного кода. В стандартном режиме работы сбой внутри внешней компоненты приводит к моментальному аварийному завершению всего сеанса 1С у пользователя.

Для предотвращения подобных ситуаций в новых версиях платформы реализован изолированный режим работы.

При таком подключении компонента запускается в выделенном операционной системой отдельном процессе. Если в ней произойдет сбой, упадет только этот изолированный процесс, а сеанс пользователя 1С продолжит работу в штатном режиме. Для этого при подключении передается специальный параметр:


// Пример подключения компоненты в изолированном режиме
Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет.AddInALIntegration", "AL", ТипВнешнейКомпоненты.Native, ТипПодключенияВнешнейКомпоненты.Изолированно);
← На главную