В современных реалиях автоматизации складского учета использование терминалов сбора данных (ТСД) на базе операционной системы Android становится стандартом. Однако с выходом Android 11 и последующих версий разработчики столкнулись с серьезными изменениями в политике безопасности и архитектуре системы. Старые методы работы через прямые библиотеки (DLL или специфические внешние компоненты) часто перестают функционировать, так как система блокирует низкоуровневый доступ к оборудованию или не поддерживает 32-битную архитектуру устаревших библиотек. Рассмотрим самый надежный и современный способ интеграции — использование механизма Broadcast Intent в связке с мобильной платформой 1С.
Проанализируем ситуацию: в Android 11 компания Google ужесточила контроль над взаимодействием приложений. Традиционные внешние компоненты (ВК), написанные на C++ и подключаемые как динамические библиотеки, часто имеют жесткую привязку к архитектуре процессора (например, только armeabi-v7a). Современные ТСД Chainway работают на 64-битных процессорах, и попытка запустить 32-битную ВК может привести к ошибке загрузки. Кроме того, прямой доступ к портам сканера требует специфических разрешений, которые сложно пробросить через мобильную платформу 1С. Решение заключается в использовании системной службы ТСД, которая уже имеет доступ к железу и готова транслировать данные любому приложению через «широковещательные сообщения» — Broadcast.
Прежде чем приступать к коду в 1С, нам необходимо настроить само устройство. На ТСД Chainway за это отвечает предустановленное приложение, которое обычно называется KeyboardEmulator (в некоторых прошивках — Scan Settings). Выполним следующие действия:
com.rscja.android.scanactiondataПроанализируем эти настройки: когда лазер сканирует код, служба KeyboardEmulator перехватывает его и создает «сообщение» (Intent) с именем com.rscja.android.scanaction, внутрь которого упаковывает текст штрихкода в поле data. Наша задача в 1С — «поймать» именно это сообщение.
Для работы нам не нужны сторонние сомнительные библиотеки. Рассмотрим стандартную Библиотеку подключаемого оборудования (БПО) для мобильных приложений от 1С. В ней уже содержится универсальный драйвер «1С:Сканер штрихкода», который поддерживает режим Broadcast.
Выясним, как правильно добавить драйвер в самописную конфигурацию:
Драйвер1ССканерШтрихкода.Теперь компонента доступна для мобильного приложения. Посмотрим, как ее инициализировать программно.
В мобильном приложении нам нужно не просто подключить ВК, но и правильно настроить параметры связи. Разберем пример кода для подключения компоненты:
&НаКлиенте
Процедура ПодключитьСканер()
Результат = УстановитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода");
Если Результат Тогда
ПодключитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода", "Сканер", ТипВнешнейКомпоненты.Native);
ОбъектДрайвера = Новый ("AddIn.Сканер.BarcodeScanner");
// Настройка параметров Broadcast
ОбъектДрайвера.УстановитьПараметр("DeviceType", "Broadcast");
ОбъектДрайвера.УстановитьПараметр("Action", "com.rscja.android.scanaction");
ОбъектДрайвера.УстановитьПараметр("Extra", "data");
// Категорию обычно оставляем пустой, если не задано иное в ТСД
ОбъектДрайвера.УстановитьПараметр("Category", "");
КонецЕсли;
КонецПроцедуры
Важный момент: если вы используете типовую БПО, то все эти настройки выполняются в справочнике «Подключаемое оборудование». В форме настройки устройства нужно выбрать режим «Broadcast» и вручную вписать параметры Action и Extra, которые мы подсмотрели в KeyboardEmulator на первом шаге.
Когда сканирование произведено, мобильная платформа 1С генерирует ВнешнееСобытие. Нам нужно правильно его обработать в модуле формы. Рассмотрим типовой сценарий:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Источник — это имя устройства, которое мы задали при подключении
// Событие — обычно "Barcode"
// Данные — сам считанный штрихкод
Если Событие = "Barcode" Тогда
Штрихкод = СокрЛП(Данные);
ОбработатьШтрихкод(Штрихкод);
ИначеЕсли Событие = "RFID" Тогда
// Обработка RFID-метки, если драйвер разделяет потоки
ОбработатьМетку(Данные);
КонецЕсли;
КонецПроцедуры
Рассмотрим ситуацию с RFID, упомянутую в обсуждении. RFID-модуль в Chainway зачастую работает через отдельную службу или требует специфических настроек в приложении RFID Tool. В отличие от штрихкода, RFID-метка может содержать данные в разных форматах (HEX, ASCII).
Выясним причины, по которым RFID может не работать через стандартный драйвер сканера:
RFID Tool может быть задан другой Action (например, com.rscja.android.rfidaction). В этом случае стандартный драйвер 1С, настроенный на scanaction, проигнорирует эти сообщения.Если вам требуется одновременная работа и сканера, и RFID, рекомендуется настроить их на один и тот же Action в системных утилитах ТСД, но добавлять префикс к данным, чтобы в коде 1С вы могли их различить.
Проанализируем, почему данные могут не приходить даже после всех настроек:
KeyboardEmulator. Необходимо зайти в настройки батареи ТСД и разрешить приложению работу в фоновом режиме без ограничений.Подводя итог, использование Broadcast Intent — это наиболее стабильный путь для Android 11. Мы уходим от зависимости от конкретных версий библиотек .so и полагаемся на системный механизм передачи сообщений ОС Android, который поддерживается мобильной платформой 1С «из коробки» через стандартную компоненту печати и сканирования.