Работа с торговым оборудованием в 1С часто требует использования внешних компонент (драйверов). Хранение этих драйверов непосредственно в конфигурации (в макетах) — это отличная практика, которая позволяет централизованно обновлять компоненты у всех пользователей. Однако при реализации этого механизма программисты часто сталкиваются с неочевидными ошибками. Рассмотрим подробно, как правильно организовать этот процесс, разберем причины типовых ошибок и выясним, как работать с зависимостями библиотек.
Часто при вызове метода ПодключитьВнешнююКомпоненту возникает ошибка "Недопустимое значение параметра (параметр номер '1') (Некорректное имя компоненты)". Проанализируем типичный код, который к этому приводит:
&НаКлиенте
Процедура УстановитьВнешнююКомп(Команда)
Адрес = ПолучитьМакетНаСервере(); // Получаем адрес из временного хранилища
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(Адрес, "AddIn.Scaner45");
ОбъектДрайвера = Новый ("AddIn.Scaner45");
КонецПроцедуры
Первая важная деталь: при подключении компоненты из временного хранилища или по пути к файлу, второй параметр метода (символическое имя) должен удовлетворять правилам именования переменных 1С. Использование точки в строке "AddIn.Scaner45" может восприниматься системой некорректно в определенных контекстах. Попробуем заменить точку на нижнее подчеркивание, например, "AddIn_Scaner45". Важно помнить, что именно это имя вы должны будете использовать далее в операторе Новый.
Если после исправления имени возникает системная ошибка вида "The program can't start because rt70.bpl is missing", это означает, что сама компонента (DLL-файл) успешно найдена, но она не может запуститься без своих "помощников".
Многие старые драйверы (например, АТОЛ 6.х) написаны на языке Delphi и требуют наличия runtime-пакетов, таких как rt70.bpl или vcl70.bpl. Проблема заключается в том, что когда 1С извлекает компоненту из хранилища во временную папку пользователя, она извлекает только один основной файл. Зависимые библиотеки остаются в хранилище или вовсе отсутствуют на компьютере пользователя.
Рассмотрим варианты решения этой проблемы:
rt70.bpl в системную папку C:\Windows\System32 (или SysWOW64 для 64-битных ОС). Это надежно, но неудобно для массового внедрения.Для стабильной работы рекомендуется использовать связку двух методов. Давайте разберем их назначение подробнее:
Метод УстановитьВнешнююКомпоненту()
Этот метод предназначен для "инсталляции" компоненты из макета или хранилища на компьютер пользователя. 1С проверяет версию компоненты в локальном кеше (папка %AppData%\1C\1cv8\ExtCompT) и, если её там нет или версия устарела, копирует файл туда. Это избавляет от необходимости регистрировать COM-объекты вручную под правами администратора.
Метод ПодключитьВнешнююКомпоненту()
Этот метод загружает компоненту в память текущего сеанса 1С для работы. Если мы используем Native API компоненту, регистрация в реестре Windows вообще не требуется.
Посмотрим на правильный алгоритм работы в коде:
&НаКлиенте
Процедура ПодключитьДрайвер()
// 1. Пытаемся подключить уже установленную компоненту по символическому имени
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтол", "AtolScan", ТипВнешнейКомпоненты.Native) Тогда
Драйвер = Новый("AddIn.AtolScan.Scaner45");
Возврат;
КонецЕсли;
// 2. Если не удалось, пробуем установить её из макета
Если УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтол") Тогда
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтол", "AtolScan", ТипВнешнейКомпоненты.Native) Тогда
Драйвер = Новый("AddIn.AtolScan.Scaner45");
КонецЕсли;
Иначе
Сообщить("Не удалось установить компоненту сканера!");
КонецЕсли;
КонецПроцедуры
Существует два основных типа внешних компонент для 1С: COM и Native API.
Проанализируем ситуацию с COM-компонентами. Они требуют регистрации в реестре Windows через утилиту regsvr32. Это часто вызывает проблемы с правами доступа и разрядностью (32-битный клиент 1С не увидит 64-битную COM-компоненту и наоборот). Ошибка в Сообщении 10 форума как раз указывает на то, что для COM-компонент хранилище может быть лишь промежуточным этапом, но регистрация в ОС обязательна.
Преимущества Native API:
Чтобы 1С понимала, какой файл из архива загружать под конкретную операционную систему или разрядность, в корень 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="Atol32.dll" type="native" />
<component os="Windows" arch="x86_64" path="Atol64.dll" type="native" />
</bundle>
Когда вы передаете такой ZIP-архив в метод УстановитьВнешнююКомпоненту, платформа 1С автоматически выберет нужную библиотеку исходя из разрядности клиентского приложения пользователя. Это решает проблему совместимости x86 и x64 систем.
Выясним еще один нюанс: можно ли передавать адрес временного хранилища напрямую? В современных версиях платформы (8.3.х) методы УстановитьВнешнююКомпоненту и ПодключитьВнешнююКомпоненту принимают адрес временного хранилища (начинающийся на e1cib/tempstorage/...). Однако, если вы работаете в старой конфигурации или на платформе ниже 8.2.15, вам придется сначала сохранить двоичные данные из макета во временный файл на диске с помощью ПолучитьИмяВременногоФайла("dll"), а затем передавать в метод подключения путь к этому файлу.
Важный совет по правам доступа: При установке компоненты 1С записывает файлы в профиль пользователя. Убедитесь, что у пользователя не ограничены права на запись в папку %AppData%, иначе вы получите неинформативную ошибку о "недопустимом значении параметра".
Проанализировав ситуацию, мы можем составить идеальный чек-лист для работы с компонентами из макетов:
manifest.xml и всеми зависимыми библиотеками (теми самыми .bpl или вспомогательными .dll).УстановитьВнешнююКомпоненту, чтобы платформа корректно разместила файлы в локальном кеше.Следуя этим правилам, вы обеспечите стабильную работу оборудования и легкое обновление драйверов без необходимости обходить каждое рабочее место вручную.