При работе с мобильным клиентом 1С на терминалах сбора данных (ТСД) Zebra разработчики часто сталкиваются с проблемой: штатные механизмы либо не подхватывают событие сканирования, либо заставляют систему работать в режиме эмуляции клавиатуры. В последнем случае при каждом сканировании на экране появляется виртуальная клавиатура, перекрывающая полезную площадь интерфейса. Рассмотрим, как настроить полноценную работу сканера через механизм внешних событий.
По умолчанию многие ТСД Zebra настроены на передачу данных в активное поле ввода (режим Keystroke output). С точки зрения системы это выглядит так, будто пользователь очень быстро набрал текст на клавиатуре. Для 1С это создает две сложности:
Наша задача — перевести работу сканера в режим Broadcast Intent, когда данные передаются напрямую в приложение 1С как системное оповещение, не требуя фокуса на конкретном поле и не вызывая клавиатуру.
Проанализируем системные настройки ТСД. Основным инструментом управления сканером на Zebra является приложение DataWedge. Разберем по шагам, как настроить профиль для мобильного клиента 1С:
com.e1c.mobile.client).com.zebra.1c.action.Теперь ТСД вместо "печати" символов будет рассылать широковещательное сообщение в системе Android, которое мы сможем перехватить в коде 1С.
Если штатные возможности БПО (Библиотеки подключаемого оборудования) не позволяют гибко настроить перехват интентов, воспользуемся специализированными внешними компонентами. Существуют проверенные решения, позволяющие мобильному клиенту подписываться на системные события Android.
Рассмотрим пример логики работы с такой компонентой. В модуле формы или в общем модуле необходимо инициализировать компоненту и настроить обработку события:
// Подключение внешней компоненты в мобильном клиенте
&НаКлиенте
Процедура ПодключитьСканерZebra()
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСканера");
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСканера", "ZebraScanner", ТипВнешнейКомпоненты.Native);
ОбъектСканера = Новый ("AddIn.ZebraScanner.ScannerExtension");
// Настройка параметров интента, соответствующих профилю DataWedge
ОбъектСканера.Action = "com.zebra.1c.action";
ОбъектСканера.ExtraData = "com.symbol.datawedge.data_string";
ОбъектСканера.ПодключитьОповещение();
КонецПроцедуры
При таком подходе данные будут приходить в процедуру ВнешнееСобытие формы, где мы сможем их обработать стандартным образом.
Выясним причину, по которой стандартный мобильный клиент из Google Play может работать некорректно со сканером. Часто проблема кроется в том, что внешние компоненты и драйверы (например, Драйвер1ССканерШтрихкода) требуют жесткой привязки к версии платформы и разрешений ОС.
Многие разработчики отмечают, что стабильная работа достигается только после сборки собственного APK-файла мобильного клиента через Сборщик мобильных приложений 1С. Рассмотрим, что это дает:
При сборке важно указать в настройках сборщика путь к базе и включить компоненты 1С для работы с торговым оборудованием. После этого в самой 1С при настройке подключаемого оборудования следует выбирать тип подключения "Интерт" (Intent) и указывать имена действий, настроенных в DataWedge.
Иногда требуется не только получать данные, но и программно управлять сканером (например, отключать его, пока идет обработка данных). Это можно сделать через DataWedge API. Выполним это с помощью команды отправки интента из 1С:
&НаКлиенте
Процедура УправлениеСканером(Включить = Истина)
ПараметрыЗапуска = Новый ПараметрыЗапускаПриложения;
Если Включить Тогда
ПараметрыЗапуска.ДополнительныеДанные.Вставить("com.symbol.datawedge.api.SCANNER_INPUT_PLUGIN", "ENABLE_PLUGIN");
Иначе
ПараметрыЗапуска.ДополнительныеДанные.Вставить("com.symbol.datawedge.api.SCANNER_INPUT_PLUGIN", "DISABLE_PLUGIN");
КонецЕсли;
ЗапуститьПриложение("com.symbol.datawedge.api.ACTION", ПараметрыЗапуска);
КонецПроцедуры
Этот код позволяет гибко управлять поведением ТСД в зависимости от контекста текущей формы в мобильном клиенте.
Если вы всё же используете режим ввода в поле, но хотите скрыть клавиатуру, проанализируем следующие варианты:
Важный нюанс: при использовании современных версий Android (10 и выше) убедитесь, что мобильному клиенту выдано разрешение на работу поверх других окон и отключена оптимизация энергопотребления для приложения 1С и сервиса DataWedge, иначе системная шина интентов может "засыпать" вместе с устройством.