Как правильно подключить внешнюю компоненту в 1С:Предприятие 8.3 при использовании разных платформ и режимов запуска?

Программист IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: почему стандартные пути не всегда работают?

Рассмотрим типичную ситуацию. У нас есть внешняя компонента, предназначенная для работы по протоколу TCP. В файловой базе (обычное приложение) она подключается простейшей командой, указывающей на макет или прямой путь к файлу. Однако при переносе этого кода в управляемое приложение (серверная база) мы сталкиваемся с тем, что метод ПодключитьВнешнююКомпоненту возвращает Ложь или вызывает ошибку инициализации.

Проанализируем основные причины, по которым это происходит:

  1. Разрыв контекста между клиентом и сервером: В управляемом приложении код выполняется либо на клиенте, либо на сервере. Если вы пытаетесь подключить компоненту из общего макета напрямую, платформа должна корректно передать эти данные на сторону клиента и распаковать их в локальную папку пользователя.
  2. Ограничения прав доступа: При прямом указании пути к файлу (например, "C:\Bases\1\x64") система безопасности платформы или операционной системы может блокировать загрузку сторонней библиотеки, особенно если у пользователя ограничены права на чтение из корня диска.
  3. Отсутствие необходимых зависимостей: Компонента может зависеть от других DLL (например, библиотек MSVC Runtime), которые присутствуют в системе разработчика, но отсутствуют на целевой машине.
  4. Неверная структура архива: Для современных версий 1С (8.3) компоненты должны быть упакованы в ZIP-архив с файлом manifest.xml, чтобы платформа могла автоматически определить разрядность (x86 или x64).

Решение №1: Использование временного хранилища (Самый надежный способ)

Как показывает практика и опыт участников сообщества, наиболее стабильным способом подключения внешней компоненты в управляемых формах является предварительное помещение двоичных данных во временное хранилище. Это заставляет платформу гарантированно доставить файл на клиентскую машину и подготовить его к запуску. Разобраться в тонкостях клиент-серверного взаимодействия поможет руководство по работе с файлами в управляемых формах 8.3.

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

Посмотрим на пример кода, который решает проблему:


// Код выполняется на клиенте
Процедура ПодключитьКомпонентуНаКлиенте()
    
    // Получаем двоичные данные из макета (нужен серверный вызов)
    МакетДанные = ПолучитьМакетКомпонентыНаСервере();
    
    // Помещаем данные во временное хранилище
    АдресХранилища = ПоместитьВоВременноеХранилище(МакетДанные, ЭтаФорма.УникальныйИдентификатор);
    
    // Пытаемся подключить компоненту, используя адрес из хранилища
    Если ПодключитьВнешнююКомпоненту(АдресХранилища, "SD849", ТипВнешнейКомпоненты.Native) Тогда
        Попытка
            Компонента = Новый("AddIn.SD849.tcpclient_async");
            Сообщить("Компонента успешно подключена!");
        Исключение
            Сообщить("Ошибка при создании объекта компоненты: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Не удалось подключить внешнюю компоненту из хранилища.");
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьМакетКомпонентыНаСервере()
    // "ВК_Библиотека" - это имя Общего макета с типом "Двоичные данные"
    Возврат Справочники.ВнешниеКомпоненты.ПолучитьМакет("Библиотека"); 
    // Или через ОбщиеМакеты: ПолучитьОбщийМакет("ИмяМакета");
КонецФункции

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

Решение №2: Использование асинхронных методов

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

Для этого мы используем метод НачатьПодключениеВнешнейКомпоненты. Этот метод позволяет платформе загрузить компоненту в фоновом режиме, не замораживая работу пользователя.

Рассмотрим пример асинхронного подключения:


&НаКлиенте
Процедура ПодключитьАсинхронно()
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект);
    
    // Можно указывать путь к макету напрямую в формате "ОбщийМакет.ИмяМакета"
    // Платформа сама определит необходимость скачивания
    НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения, "ОбщийМакет.SD849_x64", "SD849", ТипВнешнейКомпоненты.Native);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеПодключенияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат Тогда
        Компонента = Новый("AddIn.SD849.tcpclient_async");
        Сообщить("Асинхронное подключение выполнено!");
    Иначе
        Сообщить("Не удалось подключить компоненту асинхронно.");
    КонецЕсли;
    
КонецПроцедуры

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

Важные рекомендации по работе с Native API

При отладке подключения обязательно обратите внимание на следующие моменты, которые часто становятся камнем преткновения для программистов:

1. Контроль разрядности. Это самая частая причина ошибок. Если ваш тонкий клиент имеет разрядность x86 (32 бита), а вы пытаетесь подключить библиотеку x64, подключение всегда будет возвращать Ложь. Помните, что разрядность клиента 1С не обязательно совпадает с разрядностью операционной системы Windows. Всегда проверяйте это через меню "Справка — О программе".

2. Структура ZIP-архива. Для универсального подключения рекомендуется создавать один общий макет, содержащий ZIP-архив. В корне архива должен лежать файл manifest.xml, в котором прописаны соответствия файлов операционным системам и архитектурам. Пример структуры манифеста:


<?xml version="1.0" encoding="UTF-8"?>
<bundle xmlns="http://v8.1c.ru/8.2/addin/bundle">
    <component os="Windows" arch="i386" path="my_comp_x86.dll" type="native" />
    <component os="Windows" arch="x86_64" path="my_comp_x64.dll" type="native" />
</bundle>

3. Защита от опасных действий. Начиная с версии 8.3.9, в 1С встроены механизмы защиты. Если при попытке подключения внешней компоненты ничего не происходит, проверьте настройки пользователя в Конфигураторе. Снимите галочку "Защита от опасных действий" или добавьте вашу информационную базу в список исключений через файл conf.cfg.

4. Очистка кэша компонентов. Если вы обновляете версию компоненты, но система продолжает "подхватывать" старую DLL, необходимо очистить локальный кэш. Он находится по пути %APPDATA%\1C\1cv8\ExtCompT. Удаление содержимого этой папки заставит платформу заново скачать и распаковать компоненту из макета при следующем запуске кода.

Выясним причину неудач при работе с прямыми путями

В сообщениях форума упоминалось, что указание прямого пути к каталогу, например, "C:\Bases\1\x64", не работает. Выясним, почему. Метод ПодключитьВнешнююКомпоненту ожидает либо путь к конкретному файлу (с расширением .dll или .so), либо специальный URL-адрес ресурса. Указание папки вместо файла является синтаксической ошибкой. Однако, даже указание точного пути к DLL файлу часто блокируется из-за политик безопасности современных ОС и механизмов изоляции сеансов 1С.

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

← На главную