Как правильно сохранить и подключить внешнюю компоненту из макета или временного хранилища

Программист 1С v8.3 (Управляемые формы)
← На главную

Работа с торговым оборудованием в 1С часто требует использования внешних компонент (драйверов). Хранение этих драйверов непосредственно в конфигурации (в макетах) — это отличная практика, которая позволяет централизованно обновлять компоненты у всех пользователей. Однако при реализации этого механизма программисты часто сталкиваются с неочевидными ошибками. Рассмотрим подробно, как правильно организовать этот процесс, разберем причины типовых ошибок и выясним, как работать с зависимостями библиотек.

Разбор первой проблемы: Некорректное имя компоненты

Часто при вызове метода ПодключитьВнешнююКомпоненту возникает ошибка "Недопустимое значение параметра (параметр номер '1') (Некорректное имя компоненты)". Проанализируем типичный код, который к этому приводит:


&НаКлиенте
Процедура УстановитьВнешнююКомп(Команда)
    Адрес = ПолучитьМакетНаСервере(); // Получаем адрес из временного хранилища
    ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(Адрес, "AddIn.Scaner45");
    ОбъектДрайвера = Новый ("AddIn.Scaner45");
КонецПроцедуры

Первая важная деталь: при подключении компоненты из временного хранилища или по пути к файлу, второй параметр метода (символическое имя) должен удовлетворять правилам именования переменных 1С. Использование точки в строке "AddIn.Scaner45" может восприниматься системой некорректно в определенных контекстах. Попробуем заменить точку на нижнее подчеркивание, например, "AddIn_Scaner45". Важно помнить, что именно это имя вы должны будете использовать далее в операторе Новый.

Проблема зависимостей и ошибка rt70.bpl

Если после исправления имени возникает системная ошибка вида "The program can't start because rt70.bpl is missing", это означает, что сама компонента (DLL-файл) успешно найдена, но она не может запуститься без своих "помощников".

Многие старые драйверы (например, АТОЛ 6.х) написаны на языке Delphi и требуют наличия runtime-пакетов, таких как rt70.bpl или vcl70.bpl. Проблема заключается в том, что когда 1С извлекает компоненту из хранилища во временную папку пользователя, она извлекает только один основной файл. Зависимые библиотеки остаются в хранилище или вовсе отсутствуют на компьютере пользователя.

Рассмотрим варианты решения этой проблемы:

  1. Ручное копирование: Поместить файл rt70.bpl в системную папку C:\Windows\System32 (или SysWOW64 для 64-битных ОС). Это надежно, но неудобно для массового внедрения.
  2. Использование ZIP-архива: Современные версии 1С позволяют хранить в макете не голый DLL-файл, а ZIP-архив. В этот архив можно упаковать основную библиотеку и все её зависимости.

Различие между методами Установить и Подключить

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

Метод УстановитьВнешнююКомпоненту()
Этот метод предназначен для "инсталляции" компоненты из макета или хранилища на компьютер пользователя. 1С проверяет версию компоненты в локальном кеше (папка %AppData%\1C\1cv8\ExtCompT) и, если её там нет или версия устарела, копирует файл туда. Это избавляет от необходимости регистрировать COM-объекты вручную под правами администратора.

Метод ПодключитьВнешнююКомпоненту()
Этот метод загружает компоненту в память текущего сеанса 1С для работы. Если мы используем Native API компоненту, регистрация в реестре Windows вообще не требуется.

Посмотрим на правильный алгоритм работы в коде:


&НаКлиенте
Процедура ПодключитьДрайвер()
    
    // 1. Пытаемся подключить уже установленную компоненту по символическому имени
    Если ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтол", "AtolScan", ТипВнешнейКомпоненты.Native) Тогда
        Драйвер = Новый("AddIn.AtolScan.Scaner45");
        Возврат;
    КонецЕсли;
    
    // 2. Если не удалось, пробуем установить её из макета
    Если УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтол") Тогда
        Если ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтол", "AtolScan", ТипВнешнейКомпоненты.Native) Тогда
            Драйвер = Новый("AddIn.AtolScan.Scaner45");
        КонецЕсли;
    Иначе
        Сообщить("Не удалось установить компоненту сканера!");
    КонецЕсли;

КонецПроцедуры

Переход на Native API: Почему это важно?

Существует два основных типа внешних компонент для 1С: COM и Native API.

Проанализируем ситуацию с COM-компонентами. Они требуют регистрации в реестре Windows через утилиту regsvr32. Это часто вызывает проблемы с правами доступа и разрядностью (32-битный клиент 1С не увидит 64-битную COM-компоненту и наоборот). Ошибка в Сообщении 10 форума как раз указывает на то, что для COM-компонент хранилище может быть лишь промежуточным этапом, но регистрация в ОС обязательна.

Преимущества Native API:

Использование Манифеста в ZIP-архиве

Чтобы 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%, иначе вы получите неинформативную ошибку о "недопустимом значении параметра".

Итоги и рекомендации

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

  1. Используйте Native API вместо COM везде, где это возможно.
  2. Упаковывайте компоненты в ZIP-архив вместе с файлом manifest.xml и всеми зависимыми библиотеками (теми самыми .bpl или вспомогательными .dll).
  3. Всегда вызывайте сначала УстановитьВнешнююКомпоненту, чтобы платформа корректно разместила файлы в локальном кеше.
  4. Следите за именованием: имя, указанное при подключении, должно быть уникальным в рамках сеанса и не содержать спецсимволов, кроме подчеркивания.
  5. Проверяйте разрядность: если драйвер только 32-битный, пользователь обязан запускать 32-битный клиент 1С.

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

← На главную