При автоматизации складов и розничных точек мы часто сталкиваемся с ситуацией, когда одно и то же оборудование — сканер штрихкодов — должно вести себя по-разному в разных сценариях работы. Классический пример, который мы разберем сегодня: в документе инвентаризации нам нужно потоковое сканирование с автоматическим подтверждением ввода (где помогает суффикс "Enter"), а в форме авторизации сотрудника или когда выполняется поиск номенклатуры по отсканированному штрихкоду тот же самый "Enter" приводит к закрытию окна или некорректному срабатыванию кнопок по умолчанию.
Давайте подробно разберем, почему попытка переключать настройки сканера "на лету" — это тупиковый путь, и как решить эту задачу средствами платформы 1С, чтобы все работало стабильно.
Для начала определимся с терминологией, чтобы говорить на одном языке. Когда мы говорим о суффиксе (или постфиксе), мы чаще всего подразумеваем управляющий символ, который сканер отправляет в компьютер сразу после последовательности цифр штрихкода. Обычно это символ возврата каретки — #13 (CR) или Enter.
Проблема автора заключается в конфликте режимов:
Автор темы хотел сделать кнопку, которая программно меняет настройки сканера: то включает суффикс, то выключает его (ставит в NULL). Давайте проанализируем, почему мы не рекомендуем так делать.
Желание сделать "переключатель" понятно, но с технической точки зрения это влечет за собой ряд проблем:
Самый надежный способ работы со сканером в 1С — это использование механизма внешних событий. В этом случае нам не важно, где стоит фокус ввода и есть ли суффикс "Enter" на физическом уровне (точнее, мы настраиваем его один раз и забываем).
Давайте рассмотрим алгоритм настройки:
#13 (CR) всегда. Это стандарт.CR. Тогда драйвер будет "откусывать" этот символ и передавать в 1С чистый штрихкод.Теперь самое главное — программная обработка. Вместо того чтобы полагаться на то, что сканер "впечатает" цифры в поле ввода, мы будем ловить событие. В управляемых формах за это отвечает обработчик ОбработкаОповещения. Это особенно актуально, когда требуется сканирование штрихкодов в форме подбора номенклатуры в 1С: УТ 11, где стандартный поиск может не поддерживать сканер "из коробки".
Посмотрим на пример кода, который решает проблему автора (сканирование пропуска сотрудника в специальном поле, где "Enter" мешает):
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло от сканера штрихкодов
// ИмяСобытия может отличаться в зависимости от БПО, часто это "Штрихкод" или "ScanData"
Если ИмяСобытия = "Штрихкод" ИЛИ ИмяСобытия = "ScanData" Тогда
Штрихкод = Параметр[0]; // Получаем сами данные
// Логика для формы, где "Enter" мешал бы при эмуляции клавиатуры
// Мы принудительно вставляем данные туда, куда нам нужно, игнорируя фокус
Если Элементы.ГруппаСканированияСотрудника.Видимость Тогда
// Программно заполняем поле
Объект.ШтрихкодСотрудника = Штрихкод;
// Запускаем процедуру поиска сотрудника программно
НайтиСотрудникаПоШтрихкоду();
// Прерываем дальнейшую обработку, если нужно
Возврат;
КонецЕсли;
// Логика для обычного подбора товаров (если мы не в режиме сотрудника)
ОбработатьПодборТовара(Штрихкод);
КонецЕсли;
КонецПроцедуры
В чем преимущество этого метода? Сканер работает в фоновом режиме. Даже если курсор стоит не в том поле, 1С перехватит данные. "Лишний" Enter не нажмет кнопку по умолчанию, потому что драйвер (или Native API) передает данные пакетом, а не эмулирует нажатия клавиш.
Если по каким-то причинам вы вынуждены использовать сканер как клавиатуру (Keyboard Wedge) и суффикс "Enter" физически нажимается сканером, нам нужно научить форму правильно реагировать на это.
Когда сканер вводит цифры и нажимает Enter, происходит событие изменения поля ввода. Часто проблема заключается в том, что поле ввода имеет свойство АвтоКнопкаПоУмолчанию или на форме есть кнопка "ОК", которая срабатывает по Enter.
Рассмотрим, как это обойти программно:
КнопкаПоУмолчанию (DefaultButton) в значение Ложь (если такое свойство доступно для элемента) или убедитесь, что на форме нет кнопки, которая срабатывает по Enter бесконтрольно.ОкончаниеВводаТекста.
&НаКлиенте
Процедура ПолеШтрихкодОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
// Если сканер ввел текст и "нажал" Enter, мы попадаем сюда.
// Текст содержит штрихкод.
Если Не ПустаяСтрока(Текст) Тогда
// Выполняем нашу логику
НайтиНоменклатуруИлиСотрудника(Текст);
// Очищаем поле для следующего сканирования, если нужно
Элемент.Текст = "";
// Важный момент: предотвращаем стандартную обработку,
// чтобы фокус не улетел на следующий элемент
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Однако, этот метод менее надежен, чем первый, так как зависит от раскладки клавиатуры и скорости ввода. Если пользователь случайно нажмет клавишу во время сканирования, штрихкод исказится.
В современных конфигурациях (УТ 11, ERP, Розница 2/3) настройки драйвера позволяют гибко управлять суффиксами. Кроме того, вы можете вывести дополнительные колонки в справочнике и подборах номенклатуры, чтобы сразу видеть штрихкод товара при сканировании.
Если вы зайдете в НСИ и Администрирование -> РМК и оборудование -> Подключаемое оборудование, откроете настройки сканера, вы увидите поле "Суффикс".
В обсуждении автор упомянул, что когда он убрал суффикс и нажимал Enter вручную, поиск не работал. Это происходит из-за особенностей события ПриИзменении в управляемых формах.
Когда данные вводятся программно или очень быстро (как со сканера без суффикса), платформа может не зафиксировать факт окончания ввода, пока фокус не покинет поле. Если суффикса нет, сканер просто "пишет" цифры. Поле ввода остается активным, событие не срабатывает. Вам приходится нажимать Enter, чтобы сдвинуть фокус или подтвердить ввод.
Если вы хотите, чтобы поиск работал сразу после ввода последнего символа (без нажатия Enter), вам пришлось бы использовать событие АвтоПодбор, но для штрихкодов это плохая практика (будет срабатывать поиск после каждой цифры, что "повесит" систему).
Подводя итог, можно дать следующие рекомендации для решения проблемы автора:
#13 (Enter) включенным на сканере всегда.ОбработкаОповещения. В этом методе проверяйте контекст: если открыта форма подбора сотрудника — ищите сотрудника; если склад — ищите товар.