При обновлении парка терминалов сбора данных (ТСД) или переходе с устаревших версий операционной системы (например, Android 7) на актуальные (Android 10 и выше) разработчики и администраторы часто сталкиваются с ситуацией, когда привычный компонент 1С:Устройство ввода (пакет com.e1c.inputdevice) перестает функционировать или вовсе не поддерживается операционной системой. Попытка перейти на стандартную Библиотеку подключаемого оборудования (БПО) и компонент 1С:Сканер штрихкода (NativeApi) при этом нередко заканчивается неудачей: встроенная утилита ТСД успешно считывает штрихкоды, но в тесте 1С ничего не отображается. Разберем причины такого поведения и настроим корректный обмен данными между сканером ТСД и мобильным приложением 1С.
Проанализируем системные изменения операционной системы Android, приведшие к неработоспособности старого решения:
com.e1c.inputdevice проектировалось под архитектуру Android 4–7, где службы могли бесконтрольно оставаться в памяти и перехватывать глобальные события. На современных ОС система принудительно выгружает такие процессы или изолирует их.Первое решение, которое часто пробуют при возникновении проблем, — перевод сканера ТСД в режим эмуляции клавиатуры (Keyboard Wedge). Выясним, почему для корпоративного учета этот путь является тупиковым:
<GS> (ASCII 29 / FNC1). Режим клавиатуры трансформирует ввод в системные нажатия клавиш и просто отбрасывает служебные символы. В результате считанный код признается невалидным при проверке в 1С.Рассмотрим, как устроен компонент 1С:Сканер штрихкода (NativeApi) на Android. В отличие от настольной платформы, где драйвер взаимодействует с COM-портом или USB-устройством напрямую, на ТСД под Android драйвер выступает в роли программного приемника — BroadcastReceiver. Он не управляет лазерным лучом напрямую, а ожидает, когда штатная служба сканирования ТСД декодирует код и отправит системное широковещательное намерение (Intent).
Если тест в Библиотеке подключаемого оборудования молчит, это означает лишь одно: параметры широковещательного канала сканера в Android не совпадают с параметрами, которые ожидает драйвер в 1С.
Разберем по шагам порядок действий для запуска сканирования через NativeApi:
Откроем на терминале встроенное приложение управления сканером (на ТСД Urovo это утилита «Настройки сканера» / «Scanner Settings»). Найдем раздел настроек вывода данных (Data Output Mode) и переключим его из режима вывода в фокус/клавиатуру в режим передачи широковещательного сообщения (Broadcast или Intent).
В настройках утилиты ТСД проверим и зафиксируем два ключевых строковых параметра:
— Действие намерения (Action): имя события рассылки (например, urovo.rcv.message или android.intent.ACTION_DECODE_DATA).
— Имя дополнительного поля (String Extra Key): имя ключа, под которым утилита вкладывает декодированную строку штрихкода в сообщение (например, barcode_string или barcode).
В форме настройки подключаемого оборудования в 1С или непосредственно в структуре параметров инициализации драйвера NativeApi зададим режим соединения как получение широковещательных сообщений (Broadcast) и пропишем в соответствующие поля точные наименования параметров Action и Extra, указанные на ТСД.
Как показывает практика, при разработке собственных мобильных приложений на базе мобильной платформы 1С нет необходимости внедрять тяжеловесную подсистему БПО со всеми ее вспомогательными регистрами и формами. Достаточно загрузить внешнюю компоненту 1С:Сканер штрихкода (NativeApi) прямо из макета конфигурации и инициализировать ее базовыми методами.
Посмотрим на пример инициализации драйвера в модуле формы или мобильного приложения:
&НаКлиенте
Процедура ПодключитьСканерТСД()
// Подключаем внешнюю компоненту NativeApi из макета
Если Не ПодключитьВнешнююКомпоненту("Макет.ДрайверСканераNativeApi", "СканерТСД", ТипВнешнейКомпоненты.Native) Тогда
Сообщить("Не удалось загрузить внешнюю компоненту сканера!");
Возврат;
КонецЕсли;
ОбъектДрайвера = Новый ("AddIn.СканерТСД.BarcodeScanner");
// Открываем устройство и передаем параметры Broadcast
Если ОбъектДрайвера.Open() = 0 Тогда
// Задаем параметры широковещательного намерения
ОбъектДрайвера.SetParameter("IntentAction", "urovo.rcv.message");
ОбъектДрайвера.SetParameter("IntentExtraBarcode", "barcode_string");
ОбъектДрайвера.SetParameter("ListeningMode", "Broadcast");
ОбъектДрайвера.DeviceEnable = 1;
Иначе
Сообщить("Ошибка при открытии устройства сканирования.");
КонецЕсли;
КонецПроцедуры
После успешной инициализации драйвер перехватывает системный Broadcast от терминала сбора данных и генерирует событие платформы. Обработка полученных данных выполняется в стандартном предопределенном обработчике формы:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "СканерТСД" И Событие = "Штрихкод" Тогда
// Обрабатываем считанную строку штрихкода или маркировки
Штрихкод = СокрЛП(Данные);
ОбработатьСчитанныйШтрихкод(Штрихкод);
КонецЕсли;
КонецПроцедуры
Таким образом, отказ от устаревшего 1С:Устройство ввода и правильная синхронизация параметров широковещательных пакетов в связке с компонентой NativeApi позволяют быстро и надежно запустить сканирование на любых современных ТСД под управлением Android 10 и выше с полной поддержкой кодов маркировки.