Как запустить встроенный сканер штрихкода в мобильном приложении 1С на Android?

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

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

В этой статье мы подробно разберем, почему стандартные драйверы БПО могут давать сбой, как решить проблему выдвигающейся экранной клавиатуры и как настроить стабильное получение штрихкодов с помощью механизма широковещательных сообщений (Broadcast Intent) в Android.

Почему возникают ошибки при использовании стандартной БПО?

Рассмотрим типичную ситуацию: при попытке подключения оборудования через драйвер "1С:Устройство ввода" система выдает критическую ошибку выполнения команды "OPEN" для приложения com.e1c.inputdevice. Проанализируем, почему это происходит:

  1. Отсутствие сервисной утилиты: Драйвер «1С:Устройство ввода» не является полностью автономным. Для его работы в операционной системе Android должно быть установлено специальное вспомогательное приложение-сервис (пакет 1C_InputDevice.apk). Если этого пакета нет на устройстве, вы будете постоянно получать ошибку запуска службы.
  2. Ограничения безопасности Android: Начиная с Android 6.0 (и особенно в более современных версиях), операционная система жестко контролирует фоновую активность приложений и межпроцессное взаимодействие. Без явного предоставления системных разрешений мобильное приложение 1С просто не сможет достучаться до стороннего сервиса сканирования.
  3. Защита вендоров: Драйверы сторонних производителей (например, СКАНКОД, CipherLab, ScanPort), встроенные в БПО, ориентированы на конкретные модели оборудования. При попытке запустить их на «неродном» железе (например, на прайсчекерах CSI) они часто отказываются работать без лицензии или просто игнорируют сигналы сканера.

Проблема эмуляции клавиатуры (Keyboard Wedge)

Самый простой способ заставить сканер работать — настроить его в режиме «в разрыв клавиатуры» (Keyboard Emulation). В этом случае отсканированный штрихкод мгновенно «печатается» в активное текстовое поле на форме 1С.

Однако этот подход имеет критические недостатки для бизнес-приложений:

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

Решение: Использование широковещательных сообщений (Broadcast Intent)

Широковещательные сообщения (Intents) — это стандартный системный механизм Android, позволяющий приложениям обмениваться событиями. Встроенная служба сканирования устройства при успешном считывании штрихкода генерирует системное событие (Intent), которое мобильная платформа 1С перехватывает и преобразует во внешнее событие 1С.

Разберем по шагам, как настроить этот процесс.

Шаг 1: Настройка службы сканирования на Android-устройстве

Прежде всего нам необходимо перевести встроенный сканер устройства из режима клавиатуры в режим посылки намерений (Intents). Для этого выполним следующие действия на самом прайсчекере или ТСД:

  1. Откроем системные настройки Android и найдем приложение, отвечающее за работу сканера (оно может называться ScanWedge, DataWedge, Scanner Settings или находиться в меню «Спец. возможности»).
  2. Найдем раздел настроек вывода данных (Data Output / Wedge Profiles).
  3. Отключим эмуляцию клавиатуры (снимем флажок Keyboard Emulation или Wedge).
  4. Включим отправку данных через Intent (установим флажок Intent Output или Send via Intent в положение «Включено»).
  5. Зададим параметры вещания (эти строки нам понадобятся для настройки кода в 1С):
    • Intent action: системное имя события (например, android.intent.ACTION_DECODE_DATA или barcodescanner.RECV_DATA).
    • Intent string extra: имя переменной, внутри которой передается строка штрихкода (например, barcode_string или value).

Шаг 2: Программное подключение компоненты в мобильной 1С

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

Посмотрим на пример инициализации компоненты в модуле управляемого приложения или основной формы:


&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    
    #Если МобильноеПриложениеКлиент Тогда
        Попытка
            // Подключаем нативную компоненту 1С для работы с устройствами ввода
            РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода", "InputDevice", ТипВнешнейКомпоненты.Native);
            
            Если РезультатПодключения Тогда
                СканерОбъект = Новый ("AddIn.InputDevice.InputDevice");
                
                // Передаем настройки, которые мы ранее прописали в утилите сканирования ТСД
                СканерОбъект.ИмяДействия = "android.intent.ACTION_DECODE_DATA"; // Наш Intent action
                СканерОбъект.ИмяПеременной = "barcode_string";                 // Наш Intent string extra
                
                // Активируем получение данных
                СканерОбъект.Подключить();
            Иначе
                Сообщить("Не удалось подключить компоненту сканера!");
            КонецЕсли;
        Исключение
            ЗаписатьЛогСобытий("Ошибка инициализации сканера: " + ОписаниеОшибки());
        КонецПопытки;
    #КонецЕсли

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

Шаг 3: Перехват отсканированного штрихкода в 1С

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

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


&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    
    // Проверяем, что событие пришло от нашей компоненты сканера
    Если Источник = "InputDevice" ИЛИ Источник = "BarCodeScanner" Тогда
        
        // Очищаем полученную строку от лишних символов (пробелы, переводы строк)
        Штрихкод = СокрЛП(Данные);
        
        Если НЕ ПустаяСтрока(Штрихкод) Тогда
            // Вызываем логику обработки штрихкода (поиск товара, проверка прайса)
            ОбработатьШтрихкод(Штрихкод);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьШтрихкод(Знач Штрихкод)
    
    // Пример вывода сообщения пользователю без открытия клавиатуры
    ПоказатьПредупреждение(, "Успешно отсканирован код: " + Штрихкод, 3);
    
    // Здесь может быть вызов серверного метода для поиска номенклатуры
    // НайтиТоварПоШтрихкодуНаСервере(Штрихкод);
    
КонецПроцедуры

Альтернативные способы решения проблемы

Если устройство работает на нестандартной или сильно урезанной прошивке Android, где нет возможности перенаправить вывод сканера в Intent, мы можем воспользоваться альтернативными путями:

Использование технологии широковещательных сообщений (Broadcast Intent) является наиболее надежным, быстрым и профессиональным решением для интеграции мобильной платформы 1С с аппаратными сканерами штрихкодов. Это избавляет интерфейс приложения от навязчивой экранной клавиатуры и обеспечивает мгновенный отклик системы на действия пользователя.

← На главную