При автоматизации складского учета или розничных продаж часто возникает задача организовать высокоскоростное сканирование товаров. Если у сотрудников нет терминалов сбора данных (ТСД) и они используют обычные ручные сканеры в режиме эмуляции клавиатуры, возникает классическая проблема: после считывания штрихкода фокус «улетает» из поля ввода, и для следующего сканирования пользователю приходится снова нажимать на поле мышкой. В этой статье мы разберем, почему это происходит и как реализовать программное удержание фокуса для комфортной работы «без перерыва».
Проанализируем механику работы обычного сканера. Большинство устройств по умолчанию настроены так, что после передачи цифр штрихкода они отправляют символ возврата каретки (Enter). Для платформы «1С:Предприятие» нажатие Enter в поле ввода является сигналом к окончанию редактирования и переходу к следующему элементу в порядке обхода формы. Даже если вы пропишете ЭтаФорма.ТекущийЭлемент = Элементы.ШК непосредственно в обработчике события, платформа может сначала выполнить ваш код, а затем завершить стандартную обработку клавиши Enter, что приведет к потере фокуса.
Как показала практика обсуждения, самым стабильным методом в управляемом приложении является вынос процедуры активации элемента из общего потока событий. Рассмотрим подробнее, как это реализовать. Мы будем использовать метод ПодключитьОбработчикОжидания, чтобы выполнить возврат фокуса через мизерную паузу после того, как все стандартные системные события (включая переход по Enter) завершатся.
Рассмотрим пример кода, который позволяет очищать поле и возвращать в него курсор автоматически:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Сразу устанавливаем фокус при открытии формы
ЭтаФорма.ТекущийЭлемент = Элементы.Штрихкод;
Штрихкод = "";
КонецПроцедуры
&НаКлиенте
Процедура ШтрихкодПриИзменении(Элемент)
Если Штрихкод <> "" Тогда
// Очищаем лишние символы переноса строк, если они есть
ШтрихкодВвод = СтрЗаменить(Штрихкод, Символы.ПС, "");
Штрихкод = "";
// Вызываем основную логику обработки штрихкода
ОбработатьВводШтрихкодов(ШтрихкодВвод);
КонецЕсли;
// Вместо прямой установки фокуса подключаем обработчик на 0.1 секунды
ПодключитьОбработчикОжидания("ПриОжиданииВводаШтрихкода", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПриОжиданииВводаШтрихкода()
// Возвращаем фокус в поле ввода
ЭтаФорма.ТекущийЭлемент = Элементы.Штрихкод;
КонецПроцедуры
В данном примере параметр Истина в методе ПодключитьОбработчикОжидания означает, что процедура выполнится однократно. Этого достаточно, чтобы «перехватить» управление после завершения стандартного цикла событий формы.
В некоторых случаях помогает использование расширенных свойств элемента формы. Попробуем проанализировать ситуацию, когда стандартная обработка прерывается принудительно. В событии ОкончаниеВводаТекста можно попытаться сбросить стандартное поведение платформы.
&НаКлиенте
Процедура ШКОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
// Обрабатываем текст
ТекстШК = Текст;
// Очищаем текст в поле
Текст = "";
// Указываем платформе, что фокус должен остаться здесь
Элементы.ШК.АктивизироватьПоУмолчанию = Истина;
ЭтаФорма.ТекущийЭлемент = Элементы.ШК;
// Отменяем стандартную обработку завершения ввода
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Важный нюанс: использование СтандартнаяОбработка = Ложь предотвращает переход к следующему элементу, но требует внимательной ручной очистки данных, чтобы поле было готово к новому циклу сканирования.
Если программные методы в 1С кажутся избыточными, проанализируем возможность настройки самого оборудования. У каждого сканера есть инструкция с настроечными штрихкодами.
ПриИзменении может не сработать (так как ввод формально не завершен). Вам придется использовать событие АвтоПодбор или анализировать изменение текста.ВнешнееСобытие. Это позволяет сканировать в любой момент, независимо от того, какой элемент формы активен в данный момент. Программа сама «поймает» штрихкод и обработает его.Чтобы интерфейс был максимально дружелюбным для пользователя, обратите внимание на следующие моменты:
ПодключитьОбработчикОжидания с небольшим запасом по времени (0.2–0.3 сек).Таким образом, мы выяснили, что наиболее надежным способом удержания фокуса в управляемом приложении является комбинация очистки реквизита и отложенного вызова установки ТекущийЭлемент через обработчик ожидания. Это гарантирует, что интерфейс будет готов к приему новых данных сразу после обработки предыдущего товара.