При разработке мобильных приложений и мобильных клиентов на платформе 1С для терминалов сбора данных (ТСД) программисты часто сталкиваются с крайне неприятным поведением интерфейса. При активации поля ввода для сканирования штрихкода на экране устройства автоматически всплывает виртуальная клавиатура Android. Она перекрывает рабочую область экрана, мешает оператору видеть вводимые данные и замедляет процесс работы на складе или в торговом зале.
В этой статье мы подробно разберем, почему возникает эта проблема, и проанализируем наиболее эффективные практические способы ее решения. Мы изучим как программные методы в самой платформе 1С, так и системные настройки операционной системы Android, а также специализированный софт от производителей ТСД (на примере устройств Zebra).
По умолчанию большинство ТСД "из коробки" настроены на работу в режиме эмуляции клавиатуры (Keystroke output). В этом режиме встроенный лазерный сканер при считывании штрихкода ведет себя как обычная внешняя USB-клавиатура: он быстро имитирует нажатие клавиш, соответствующих символам штрихкода, и в конце посылает сигнал нажатия клавиши Enter.
Для того чтобы 1С могла принять этот штрихкод в таком режиме, разработчику приходится принудительно устанавливать фокус (активировать курсор) на конкретное поле ввода на форме мобильного приложения. Как только мобильная платформа 1С видит, что текстовое поле ввода получило фокус, она отправляет операционной системе Android стандартный запрос на отображение экранной клавиатуры. ОС честно выполняет этот запрос, выдвигая виртуальные клавиши на пол-экрана, хотя физический ввод пользователю не требуется — вся работа идет через аппаратный сканер.
Ниже мы подробно рассмотрим пять практических методов борьбы с этой проблемой, начиная с самого правильного и технологичного и заканчивая обходными системными решениями.
Это наиболее грамотное, надежное и профессиональное решение. Вместо того чтобы имитировать нажатие клавиш в активное поле ввода, мы настроим сканер ТСД на отправку данных через системные широковещательные сообщения Android (Broadcast Intents). В этом сценарии нам вообще не нужно держать текстовое поле активным на форме, а значит, у операционной системы не будет повода показывать клавиатуру.
Разберем по шагам, как настроить этот механизм на примере популярного ТСД Zebra через встроенную службу DataWedge.
Шаг 1. Настройка профиля в DataWedge на ТСД Zebra:
Profile0 или специально созданный профиль).Enabled (Включено). Это предотвратит эмуляцию ввода символов в активные текстовые поля.Enabled.com.1c.ru.scan.android.intent.category.DEFAULT.Broadcast Intent (Широковещательный интент).Шаг 2. Реализация обработки в конфигурации 1С:
Для того чтобы мобильное приложение 1С могло перехватывать системные сообщения Android, используется стандартная библиотека подключаемого оборудования (БПО) для мобильной платформы или специализированные внешние компоненты (ВК), работающие как Android Broadcast Receiver. При инициализации компонента регистрируется на прослушивание экшена com.1c.ru.scan.
В кодовой базе 1С на управляемой форме нам больше не нужно позиционировать курсор в поле ввода. Само поле может быть заблокировано для изменения (свойство ТолькоПросмотр = Истина), что полностью исключает появление клавиатуры. При успешном сканировании система сгенерирует внешнее событие.
Давайте посмотрим на пример программного кода, который обрабатывает входящие данные в модуле управляемой формы мобильного приложения:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Инициализируем подключение сканера штрихкодов через внешнюю компоненту
Попытка
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСканераAndroid", "СканерКарманный", ТипВнешнейКомпоненты.Native);
ОбъектСканера = Новый("AddIn.СканерКарманный.BarcodeReceiver");
// Задаем Action, который мы прописали в DataWedge
ОбъектСканера.УстановитьЭкшен("com.1c.ru.scan");
ОбъектСканера.ВключитьПриемник();
Исключение
Сообщить("Не удалось запустить сканер через Broadcast Intent: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Проверяем, что событие пришло от нашего сканера
Если Источник = "СканерКарманный" И Событие = "Штрихкод" Тогда
ПолученныйШтрихкод = СокрЛП(Данные);
// Вызываем логику обработки штрихкода
ОбработатьШтрихкодНаСервере(ПолученныйШтрихкод);
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует стабильную работу: клавиатура никогда не появится на экране самопроизвольно, а данные будут считываться моментально и безошибочно в любом месте приложения.
Если специфика вашей конфигурации или используемой внешней компоненты не позволяет быстро переписать логику под Broadcast Intent, и вам приходится работать в режиме эмуляции клавиатуры, можно решить задачу на уровне настроек самой операционной системы ТСД.
Современные версии Android воспринимают встроенный модуль сканера штрихкодов ТСД как подключенную аппаратную (физическую) клавиатуру. В Android заложено стандартное поведение: если к устройству подключена физическая клавиатура, то виртуальная экранная клавиатура скрывается за ненадобностью. Нам нужно лишь принудительно зафиксировать эту настройку.
Рассмотрим по шагам, как выполнить эту настройку в операционной системе ТСД:
После деактивации этого тумблера Android заблокирует автоматическое появление экранных клавиш при фокусировке курсора на любых текстовых полях ввода в 1С. При этом сканер ТСД продолжит без проблем передавать штрихкоды в активное поле методом эмуляции ввода.
На некоторых бюджетных моделях ТСД или старых версиях Android производители вырезают пункт меню управления физической клавиатурой. В этом случае отключить стандартную клавиатуру системным переключателем не удастся. Для обхода этого ограничения мы можем использовать специализированные программные клавиатуры-"пустышки".
Разберем, как устроен этот метод:
Null Keyboard в списке доступных средств ввода.Когда платформа 1С потребует от Android показать клавиатуру при фокусе на поле ввода, система вызовет активную клавиатуру по умолчанию. Поскольку установленная клавиатура-заглушка физически не имеет графического интерфейса и кнопок, на экране ТСД абсолютно ничего не появится. Интерфейс 1С останется чистым и удобным для работы.
В условиях крупного склада или розничной сети настраивать каждый терминал вручную крайне неэффективно. Если на предприятии развернут парк устройств Zebra, администраторы могут заблокировать экранную клавиатуру централизованно с помощью официального инструмента автоматизации Zebra StageNow.
Проанализируем процесс настройки профиля блокировки:
UiMgr находим настройку ShowVirtualKeyBoard и принудительно переводим ее в значение Hide (Скрыть) или выбираем режим отключения при обнаружении аппаратных клавиш ввода.На многих промышленных ТСД с аппаратной клавиатурой (например, устройствах Seuic, Mertech или некоторых моделях Zebra) производители предусматривают возможность быстрой ручной блокировки экранных сервисов ввода кнопками самого терминала.
Рекомендуем проверить техническую документацию к конкретной модели вашего ТСД. Очень часто зажатие комбинации клавиш FN + P1, FN + 1 или быстрое двойное нажатие системной кнопки переключения регистра (FN или ALT) позволяет мгновенно включить или выключить отображение экранной клавиатуры на уровне драйвера клавиатуры устройства. Также в настройках ТСД в разделе "Key Programmer" (Программирование клавиш) можно назначить действие "Скрыть/Показать клавиатуру" на одну из боковых кнопок сканирования.
Мы подробно рассмотрели все возможные варианты блокировки виртуальной клавиатуры в мобильной платформе 1С. Подведем итог и выберем оптимальный путь: