При разработке мобильных приложений на платформе 1С разработчики часто сталкиваются с неочевидным поведением терминалов сбора данных (ТСД), таких как Symbol MC3200 или устройства Zebra / Honeywell. Типичная ситуация: пользователь сканирует штрихкод в поле ввода с типом Строка, значение на долю секунды появляется на экране и тут же исчезает, оставляя поле пустым. Если же вводить символы вручную с клавиатуры устройства, данные сохраняются корректно.
Проанализируем причины возникновения этой проблемы и рассмотрим практические способы её решения.
По умолчанию большинство ТСД работают в режиме эмуляции клавиатуры (режим «в разрыв клавиатуры» или Keystroke Output). Когда сканер считывает штрихкод, он посылает в активное текстовое поле поток символов с высокой скоростью и завершает передачу символом перевода строки — Enter (CR/LF).
В этот момент происходит следующее:
Enter.Если установить точку останова в обработчиках событий ОкончаниеВводаТекста или АвтоПодбор, можно заметить, что на экране ТСД цифры еще видны, но параметр Текст в коде уже равен пустой строке "".
Самый простой способ устранить гонку событий — скорректировать параметры службы сканирования на самом устройстве (например, утилиты DataWedge на ТСД Motorola / Symbol / Zebra):
Inter-character delay (задержка между символами) или Delay before Send. Задержка в 10–30 миллисекунд позволит интерфейсному потоку мобильной платформы 1С корректно обработать поступающий поток данных.Enter (ASCII 13) на Tab (ASCII 9). Символ табуляции завершает ввод строки и переключает фокус на следующий элемент формы без сброса текста.Enter/CR/LF в настройках сканера. В этом случае штрихкод будет появляться в поле ввода стабильно, но для фиксации потребуется нажать клавишу перехода на клавиатуре ТСД или программно обработать событие изменения.Если требуется сохранить автопереход после сканирования, можно использовать событие ПриИзменении поля ввода. В этом случае мы считываем значение элемента, выполняем необходимую бизнес-логику (например, поиск товара) и очищаем поле для приема следующего штрихкода.
Рассмотрим пример кода формы:
Процедура ШтрихКодПриИзменении(Элемент)
СтрокаШтрихкода = СокрЛП(Элемент.Значение);
Если Не ЗначениеЗаполнено(СтрокаШтрихкода) Тогда
Возврат;
КонецЕсли;
// Выполняем поиск или обработку полученного штрихкода
ОбработатьСканирование(СтрокаШтрихкода);
// Очищаем поле и возвращаем на него фокус для следующего сканирования
Элемент.Значение = "";
ЭтаФорма.ТекущийЭлемент = Элемент;
КонецПроцедуры
Если у реквизита формы включено свойство АвтоПодбор, платформа пытается на лету искать совпадения в списках при каждом поступившем символе. При высокоскоростном вводе со сканера механизм автоподбора вступает в конфликт с окончанием ввода текста.
В свойствах элемента формы установку Автоподбор следует перевести в значение Выключить (или задать программно Элемент.АвтоПодбор = Ложь).
Работа со сканером штрихкодов в режиме эмуляции клавиатуры считается наименее надежной для мобильной разработки. Рекомендуемый подход для мобильной платформы 1С — работа с оборудованием через механику внешних событий.
ОбработкаВнешнегоСобытия(Источник, Событие, Данные).При использовании ОбработкаВнешнегоСобытия удерживать фокус в текстовом поле ввода не требуется — считывание штрихкода происходит корректно в любом состоянии формы.