Интеграция мобильного приложения 1С с торговым оборудованием, таким как прайсчекеры и терминалы сбора данных (ТСД) на базе ОС Android, часто преподносит разработчикам неприятные сюрпризы. Использование стандартной Библиотеки подключаемого оборудования (БПО) для мобильных приложений нередко сопровождается ошибками подключения, тишиной при сканировании или неудобным поведением интерфейса, когда экранная клавиатура перекрывает половину полезной площади дисплея.
В этой статье мы подробно разберем, почему стандартные драйверы БПО могут давать сбой, как решить проблему выдвигающейся экранной клавиатуры и как настроить стабильное получение штрихкодов с помощью механизма широковещательных сообщений (Broadcast Intent) в Android.
Рассмотрим типичную ситуацию: при попытке подключения оборудования через драйвер "1С:Устройство ввода" система выдает критическую ошибку выполнения команды "OPEN" для приложения com.e1c.inputdevice. Проанализируем, почему это происходит:
1C_InputDevice.apk). Если этого пакета нет на устройстве, вы будете постоянно получать ошибку запуска службы.Самый простой способ заставить сканер работать — настроить его в режиме «в разрыв клавиатуры» (Keyboard Emulation). В этом случае отсканированный штрихкод мгновенно «печатается» в активное текстовое поле на форме 1С.
Однако этот подход имеет критические недостатки для бизнес-приложений:
Чтобы избежать этих проблем, мы должны настроить передачу данных в обход клавиатурного ввода — через программные прерывания Android.
Широковещательные сообщения (Intents) — это стандартный системный механизм Android, позволяющий приложениям обмениваться событиями. Встроенная служба сканирования устройства при успешном считывании штрихкода генерирует системное событие (Intent), которое мобильная платформа 1С перехватывает и преобразует во внешнее событие 1С.
Разберем по шагам, как настроить этот процесс.
Прежде всего нам необходимо перевести встроенный сканер устройства из режима клавиатуры в режим посылки намерений (Intents). Для этого выполним следующие действия на самом прайсчекере или ТСД:
android.intent.ACTION_DECODE_DATA или barcodescanner.RECV_DATA).barcode_string или value).Для приема сообщений Intent на стороне 1С лучше отказаться от громоздких механизмов БПО и использовать нативную компоненту напрямую. Мы можем взять макет драйвера устройства ввода (например, Драйвер1СУстройствоВводаNative из состава БПО) и поместить его в общие макеты нашей мобильной конфигурации под именем Драйвер1ССканерШтрихкода.
Посмотрим на пример инициализации компоненты в модуле управляемого приложения или основной формы:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
#Если МобильноеПриложениеКлиент Тогда
Попытка
// Подключаем нативную компоненту 1С для работы с устройствами ввода
РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода", "InputDevice", ТипВнешнейКомпоненты.Native);
Если РезультатПодключения Тогда
СканерОбъект = Новый ("AddIn.InputDevice.InputDevice");
// Передаем настройки, которые мы ранее прописали в утилите сканирования ТСД
СканерОбъект.ИмяДействия = "android.intent.ACTION_DECODE_DATA"; // Наш Intent action
СканерОбъект.ИмяПеременной = "barcode_string"; // Наш Intent string extra
// Активируем получение данных
СканерОбъект.Подключить();
Иначе
Сообщить("Не удалось подключить компоненту сканера!");
КонецЕсли;
Исключение
ЗаписатьЛогСобытий("Ошибка инициализации сканера: " + ОписаниеОшибки());
КонецПопытки;
#КонецЕсли
КонецПроцедуры
Когда встроенный модуль ТСД успешно считает штрихкод, он сгенерирует Intent. Наша подключенная внешняя компонента перехватит его и перенаправит в платформу 1С. В результате в активной форме (или в модуле управляемого приложения) сработает предопределенная процедура ОбработкаВнешнегоСобытия.
Проанализируем пример обработки входящего события:
&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Проверяем, что событие пришло от нашей компоненты сканера
Если Источник = "InputDevice" ИЛИ Источник = "BarCodeScanner" Тогда
// Очищаем полученную строку от лишних символов (пробелы, переводы строк)
Штрихкод = СокрЛП(Данные);
Если НЕ ПустаяСтрока(Штрихкод) Тогда
// Вызываем логику обработки штрихкода (поиск товара, проверка прайса)
ОбработатьШтрихкод(Штрихкод);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьШтрихкод(Знач Штрихкод)
// Пример вывода сообщения пользователю без открытия клавиатуры
ПоказатьПредупреждение(, "Успешно отсканирован код: " + Штрихкод, 3);
// Здесь может быть вызов серверного метода для поиска номенклатуры
// НайтиТоварПоШтрихкодуНаСервере(Штрихкод);
КонецПроцедуры
Если устройство работает на нестандартной или сильно урезанной прошивке Android, где нет возможности перенаправить вывод сканера в Intent, мы можем воспользоваться альтернативными путями:
Использование технологии широковещательных сообщений (Broadcast Intent) является наиболее надежным, быстрым и профессиональным решением для интеграции мобильной платформы 1С с аппаратными сканерами штрихкодов. Это избавляет интерфейс приложения от навязчивой экранной клавиатуры и обеспечивает мгновенный отклик системы на действия пользователя.