Подключение внешних компонент (Add-ins) в экосистеме 1С — это задача, которая часто кажется простой на первый взгляд, но скрывает множество нюансов при смене режима работы. Опытные разработчики знают: то, что идеально работает в файловой базе на обычных формах, может наотрез отказываться запускаться в клиент-серверном варианте под управлением тонкого клиента. В рамках этой статьи мы подробно разберем причины таких сбоев и найдем наиболее универсальный и надежный способ инициализации библиотек Native API. Для подготовки собственной сборки можно использовать базовый проект для создания и регистрации внешней компоненты 1С.
Рассмотрим типичную ситуацию. У нас есть внешняя компонента, предназначенная для работы по протоколу TCP. В файловой базе (обычное приложение) она подключается простейшей командой, указывающей на макет или прямой путь к файлу. Однако при переносе этого кода в управляемое приложение (серверная база) мы сталкиваемся с тем, что метод ПодключитьВнешнююКомпоненту возвращает Ложь или вызывает ошибку инициализации.
Проанализируем основные причины, по которым это происходит:
"C:\Bases\1\x64") система безопасности платформы или операционной системы может блокировать загрузку сторонней библиотеки, особенно если у пользователя ограничены права на чтение из корня диска.manifest.xml, чтобы платформа могла автоматически определить разрядность (x86 или x64).Как показывает практика и опыт участников сообщества, наиболее стабильным способом подключения внешней компоненты в управляемых формах является предварительное помещение двоичных данных во временное хранилище. Это заставляет платформу гарантированно доставить файл на клиентскую машину и подготовить его к запуску. Разобраться в тонкостях клиент-серверного взаимодействия поможет руководство по работе с файлами в управляемых формах 8.3.
Разберем этот алгоритм по шагам. Сначала нам необходимо получить двоичные данные из макета и передать их во временное хранилище. Затем мы используем полученный адрес для подключения.
Посмотрим на пример кода, который решает проблему:
// Код выполняется на клиенте
Процедура ПодключитьКомпонентуНаКлиенте()
// Получаем двоичные данные из макета (нужен серверный вызов)
МакетДанные = ПолучитьМакетКомпонентыНаСервере();
// Помещаем данные во временное хранилище
АдресХранилища = ПоместитьВоВременноеХранилище(МакетДанные, ЭтаФорма.УникальныйИдентификатор);
// Пытаемся подключить компоненту, используя адрес из хранилища
Если ПодключитьВнешнююКомпоненту(АдресХранилища, "SD849", ТипВнешнейКомпоненты.Native) Тогда
Попытка
Компонента = Новый("AddIn.SD849.tcpclient_async");
Сообщить("Компонента успешно подключена!");
Исключение
Сообщить("Ошибка при создании объекта компоненты: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не удалось подключить внешнюю компоненту из хранилища.");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьМакетКомпонентыНаСервере()
// "ВК_Библиотека" - это имя Общего макета с типом "Двоичные данные"
Возврат Справочники.ВнешниеКомпоненты.ПолучитьМакет("Библиотека");
// Или через ОбщиеМакеты: ПолучитьОбщийМакет("ИмяМакета");
КонецФункции
Почему это работает? Когда вы передаете в ПодключитьВнешнююКомпоненту адрес из временного хранилища, платформа 1С берет на себя всю "грязную работу": она создает временный файл в профиле пользователя (обычно в подпапке ExtCompT), корректно регистрирует его во внутреннем реестре сеанса и инициализирует библиотеку. Это обходит проблемы путей и прав доступа.
В современных конфигурациях, работающих в тонком или веб-клиенте, использование синхронных вызовов (которые блокируют интерфейс) крайне не рекомендуется, а иногда и вовсе запрещено настройками безопасности. Проанализируем, как сделать подключение максимально корректным с точки зрения современных стандартов платформы.
Для этого мы используем метод НачатьПодключениеВнешнейКомпоненты. Этот метод позволяет платформе загрузить компоненту в фоновом режиме, не замораживая работу пользователя.
Рассмотрим пример асинхронного подключения:
&НаКлиенте
Процедура ПодключитьАсинхронно()
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект);
// Можно указывать путь к макету напрямую в формате "ОбщийМакет.ИмяМакета"
// Платформа сама определит необходимость скачивания
НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения, "ОбщийМакет.SD849_x64", "SD849", ТипВнешнейКомпоненты.Native);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодключенияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Компонента = Новый("AddIn.SD849.tcpclient_async");
Сообщить("Асинхронное подключение выполнено!");
Иначе
Сообщить("Не удалось подключить компоненту асинхронно.");
КонецЕсли;
КонецПроцедуры
Важно отметить, что перед первым использованием компоненты в тонком клиенте иногда требуется вызвать УстановитьВнешнююКомпоненту. Это инициирует процесс загрузки архива с сервера на клиентскую машину и его распаковку.
При отладке подключения обязательно обратите внимание на следующие моменты, которые часто становятся камнем преткновения для программистов:
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С.
Итог: Если вам нужно гарантированное решение, работающее и в "толстом", и в "тонком" клиенте, всегда используйте схему с временным хранилищем. Это избавляет от необходимости следить за путями в файловой системе и обеспечивает корректную доставку компоненты в клиентское окружение независимо от топологии вашей сети.