Часто при разработке мобильных решений для терминалов сбора данных (ТСД) возникает задача: нужно, чтобы сканирование штрихкода не просто вставляло цифры в поле ввода, а запускало определенный бизнес-процесс, например, создание документа. При этом важно, чтобы это работало из любого места приложения, а не только когда курсор находится в конкретном поле. Давайте разберем, как реализовать такой функционал.
Изначальная ситуация, с которой сталкиваются многие разработчики, заключается в том, что ТСД по умолчанию работает в режиме эмуляции клавиатуры. Это значит, что для операционной системы и для мобильного клиента 1С сканер — это просто внешняя клавиатура, которая очень быстро "набирает" цифры из штрихкода.
В этом случае обработать данные можно, но с ограничениями. Стандартный способ — повесить обработчик события ПриИзменении на поле ввода, куда попадают данные. Но это решение негибкое и неудобное для пользователя:
Это полностью противоречит идее быстрой и удобной работы с ТСД. Задача стоит в том, чтобы пользователь мог запустить 1С, нажать на кнопку сканера на ТСД, и система бы сама поняла, что делать с полученным штрихкодом, независимо от того, какая форма сейчас открыта.
Чтобы реализовать глобальную обработку сканирования, нужно отказаться от режима эмуляции клавиатуры и настроить ТСД на работу в нативном режиме. Для устройств на Android это, как правило, означает использование системного механизма Intents (Намерения).
Intent — это стандартный механизм в Android для обмена сообщениями между приложениями. Специальное ПО на ТСД после сканирования может сгенерировать системное событие (Intent), а мобильное приложение 1С — перехватить его и обработать. В этом событии будут содержаться все данные о сканировании, включая сам штрихкод.
Рассмотрим по шагам, как это настроить.
Первым делом нужно зайти в настройки самого терминала. Обычно на ТСД есть предустановленное приложение для управления сканером (может называться "Scanner", "ScanTool", "Wedge" и т.п.). В этом приложении необходимо найти настройки вывода данных.
com.mycompany.SCAN_EVENT. Именно на это имя будет реагировать 1С.DATA_STRING или barcode_data.Важно: названия настроек и приложений могут сильно отличаться в зависимости от модели ТСД (Zebra, Honeywell, Chainway и др.). Если найти нужные настройки не получается, обратитесь к документации производителя вашего устройства.
Теперь, когда ТСД отправляет системное событие при каждом сканировании, научим наше мобильное приложение 1С его "слышать" и обрабатывать. Это делается с помощью механизма внешних событий.
Всю настройку будем производить в конфигураторе 1С.
ПриНачалеРаботыСистемы, нужно добавить вызов процедуры ПодключитьОбработчикВнешнегоСобытия.
// Модуль мобильного приложения
Процедура ПриНачалеРаботыСистемы()
// Подключаем обработчик. Первым параметром указываем тот самый "Action",
// который мы задали в настройках ТСД.
ПодключитьОбработчикВнешнегоСобытия("com.mycompany.SCAN_EVENT", "ОбщиеМодулиСервер", "ОбработатьДанныеСканера");
КонецПроцедуры
Здесь мы говорим системе: "Когда в операционной системе произойдет событие с именем com.mycompany.SCAN_EVENT, вызови процедуру ОбработатьДанныеСканера из общего модуля ОбщиеМодулиСервер".
// Общий модуль "ОбщиеМодулиСервер"
&НаКлиенте
Процедура ОбработатьДанныеСканера(Источник, Событие, Данные) Экспорт
// Параметр "Данные" - это структура, которая содержит
// все дополнительные параметры, переданные в Intent.
// Нам нужно получить значение по ключу, который мы задали на ТСД.
Штрихкод = "";
Если Данные.Свойство("DATA_STRING") Тогда // Имя ключа должно совпадать с настройкой на ТСД
Штрихкод = Данные.DATA_STRING;
Иначе
// Можно попробовать найти другие стандартные ключи,
// если точное имя неизвестно.
Если Данные.Свойство("com.symbol.datawedge.data_string") Тогда
Штрихкод = Данные["com.symbol.datawedge.data_string"];
КонецЕсли;
КонецЕсли;
Если Не ПустаяСтрока(Штрихкод) Тогда
// Штрихкод получен! Здесь размещаем всю бизнес-логику.
ПоказатьПредупреждение(, "Отсканирован штрихкод: " + Штрихкод);
// Например, ищем номенклатуру по штрихкоду
// и открываем форму нового документа "ПеремещениеТоваров"
// с уже заполненной номенклатурой.
// ВАЖНО: вся логика должна выполняться на клиенте,
// так как обработчик вызывается на мобильном устройстве.
КонецЕсли;
КонецПроцедуры
После публикации мобильного приложения с этими изменениями, любое сканирование штрихкода на ТСД (при запущенном приложении 1С) будет вызывать процедуру ОбработатьДанныеСканера, и вы сможете реализовать любую логику, не привязываясь к конкретной форме или полю ввода.
Если нет времени или желания разбираться с особенностями каждой модели ТСД, можно рассмотреть готовые программные комплексы от компаний вроде Cleverence. Такие решения обычно предоставляют:
Этот путь значительно ускоряет внедрение, но требует финансовых вложений и может быть менее гибким, чем собственная разработка.