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

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

Работа с торговым оборудованием в среде мобильного клиента 1С существенно отличается от разработки под обычную мобильную платформу. Часто разработчики сталкиваются с тем, что стандартные драйверы из БПО (Библиотеки подключаемого оборудования), успешно работающие в мобильном приложении, отказываются инициализироваться в мобильном клиенте. Разберем подробно, почему это происходит и как правильно реализовать подключение внешних компонент (ВК) для сканирования штрихкодов на терминалах сбора данных (ТСД).

Различия между мобильным клиентом и мобильной платформой

Прежде всего, проанализируем ситуацию: мобильный клиент — это тонкий клиент, который исполняет код на сервере, передавая на мобильное устройство лишь визуальный интерфейс и обрабатывая клиентские методы. Когда мы вызываем ПодключитьВнешнююКомпоненту, мы взаимодействуем с операционной системой Android напрямую через среду исполнения мобильного клиента. Основная проблема заключается в том, что стандартный мобильный клиент из магазинов приложений (Google Play или AppGallery) имеет ограниченный набор разрешений и может не поддерживать произвольные Native-библиотеки, если они не соответствуют архитектуре процессора устройства.

Архитектура и манифест компоненты

Для успешного подключения Native-компоненты в мобильном клиенте необходимо убедиться, что внутри ZIP-архива компоненты (который вы помещаете в общий макет) присутствуют библиотеки под актуальные архитектуры Android. Чаще всего современные ТСД работают на архитектуре arm64-v8a, в то время как старые компоненты могут содержать только armeabi-v7a.

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

Правильная последовательность подключения компоненты

Рассмотрим по шагам алгоритм инициализации компоненты. В мобильном клиенте недостаточно просто вызвать «Подключить». Рекомендуется использовать связку из установки и последующего подключения. Выясним причину: УстановитьВнешнююКомпоненту принудительно копирует файлы из информационной базы в локальное защищенное хранилище приложения на устройстве.

Рекомендуемый шаблон кода для подключения:


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

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

Решение через механизмы Android Intent (Broadcast Receiver)

Как показывает практика, наиболее стабильным решением для работы со сканером в мобильном клиенте является использование механизма Android Intent. Вместо того чтобы пытаться напрямую управлять лазером сканера через драйвер, мы настраиваем ТСД так, чтобы он при успешном сканировании отправлял широковещательное сообщение (Broadcast). Внешняя компонента в 1С при этом выступает «слушателем» этого сообщения.

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


&НаКлиенте
Процедура ИнициализироватьСканерIntent()
    
    // Имя события, которое мы настроили в профиле DataWedge (или аналоге) на ТСД
    ИмяСобытия = "scan.rcv.message"; 
    
    Если ПодключитьВнешнююКомпоненту("ОбщийМакет.Component", "Broadcasts", ТипВнешнейКомпоненты.Native) Тогда
        глСканерШК = Новый("AddIn.Broadcasts.UniversalBroadcast");
        
        // Устанавливаем фильтр сообщений, чтобы слушать только сканер
        глСканерШК.УстановитьПараметр("FilterName", ИмяСобытия);
        
        // Получаем структуру данных, которую присылает сканер
        ШаблонДанных = глСканерШК.ПолучитьШаблонОписанияДанных();        
        
        // Конфигурируем захват данных (data - стандартный тег для штрихкода во многих ТСД)
        barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных, "data", XMLСтрока(Ложь), XMLСтрока(0));                
        глСканерШК.УстановитьПараметр("CaptureData", barcode);
        
        Сообщить("Сканер успешно инициализирован через Intent.");
    Иначе
        ПоказатьПредупреждение(, "Компонента прослушивания Intent не загружена", 5);
    КонецЕсли;
    
КонецПроцедуры

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

Использование специализированных драйверов (RSDriver)

Для некоторых моделей ТСД существуют специализированные Native-компоненты (например, RSDriver), которые позволяют управлять не только сканером, но и аппаратными кнопками устройства. Разберем пример подключения такой компоненты:


&НаКлиенте
Функция ПодключитьRSDriver()
    
    Если ПодключитьВнешнююКомпоненту("ОбщийМакет.RSDriver", "RSDriver", ТипВнешнейКомпоненты.Native) Тогда
        Попытка
            глВКRSDriver = Новый ("AddIn.RSDriver.RSDriver");
            
            // Включаем обработку аппаратной клавиатуры ТСД
            глВКRSDriver.Подключить("Keyboard"); 
            
            // Если нужно включить сам лазер сканера через ВК
            // глВКRSDriver.Подключить("Barcode");
            
            Возврат Истина;
        Исключение
            Сообщить("Ошибка создания класса RSDriver. Возможно, архитектура не поддерживается.");
            Возврат Ложь;
        КонецПопытки;
    Иначе
        Возврат Ложь;
    КонецЕсли;
    
КонецФункции

Проблема разрешений в Android 10 и выше

Если вы используете современное устройство на базе Android 10+, проанализируем настройки безопасности. Операционная система может блокировать доступ внешних компонент к оборудованию, если мобильный клиент 1С не имеет соответствующих разрешений.

Важный нюанс: стандартный мобильный клиент 1С может не иметь разрешений на «чтение данных из других приложений» или специфических прав на периферию. В таких случаях единственным надежным решением является сборка собственного мобильного клиента. С помощью «Сборщика мобильных приложений» вы можете создать свой APK-файл, в манифест которого будут заранее включены все необходимые Native-библиотеки и прописаны требуемые permissions (разрешения) для работы с оборудованием конкретного вендора (Zebra, Honeywell и др.).

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

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

  1. Проверьте manifest.xml внутри ZIP-архива компоненты на соответствие архитектуре процессора (arm64-v8a).
  2. Используйте связку УстановитьВнешнююКомпоненту + ПодключитьВнешнююКомпоненту.
  3. Вместо прямого управления драйвером сканера настройте работу через Broadcast Intent. Это самый стабильный способ для ТСД в среде мобильного клиента.
  4. Если стандартные средства не помогают, рассмотрите возможность сборки кастомного мобильного клиента с включенными в состав поставки драйверами.

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

← На главную