Как правильно обрабатывать суффикс сканера штрихкодов в разных формах 1С без перенастройки оборудования?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При автоматизации складов и розничных точек мы часто сталкиваемся с ситуацией, когда одно и то же оборудование — сканер штрихкодов — должно вести себя по-разному в разных сценариях работы. Классический пример, который мы разберем сегодня: в документе инвентаризации нам нужно потоковое сканирование с автоматическим подтверждением ввода (где помогает суффикс "Enter"), а в форме авторизации сотрудника или когда выполняется поиск номенклатуры по отсканированному штрихкоду тот же самый "Enter" приводит к закрытию окна или некорректному срабатыванию кнопок по умолчанию.

Давайте подробно разберем, почему попытка переключать настройки сканера "на лету" — это тупиковый путь, и как решить эту задачу средствами платформы 1С, чтобы все работало стабильно.

Суть проблемы: Суффикс и режимы работы

Для начала определимся с терминологией, чтобы говорить на одном языке. Когда мы говорим о суффиксе (или постфиксе), мы чаще всего подразумеваем управляющий символ, который сканер отправляет в компьютер сразу после последовательности цифр штрихкода. Обычно это символ возврата каретки — #13 (CR) или Enter.

Проблема автора заключается в конфликте режимов:

  1. Режим "Клавиатурный ввод" (Keyboard Wedge). Сканер притворяется клавиатурой. Он "нажимает" цифры, а в конце "нажимает" Enter. Это удобно, если вы сканируете в блокнот или Excel. В 1С это может вызывать проблемы: если фокус стоит на поле ввода, нажатие Enter может сработать как нажатие кнопки "ОК" на форме или переход к следующему элементу, что нарушает логику работы.
  2. Режим "Эмуляция COM-порта" (или Native API). Сканер передает данные в драйвер. Драйвер генерирует событие в 1С. В этом случае суффикс нужен драйверу, чтобы понять, что штрихкод закончился.

Автор темы хотел сделать кнопку, которая программно меняет настройки сканера: то включает суффикс, то выключает его (ставит в NULL). Давайте проанализируем, почему мы не рекомендуем так делать.

Почему программное переключение настроек оборудования — плохое решение

Желание сделать "переключатель" понятно, но с технической точки зрения это влечет за собой ряд проблем:

  1. Задержка (Latency). Процедура изменения параметров драйвера требует обращения к внешнему компоненту. Часто это требует отключения устройства, изменения параметров и повторного подключения. Это может занимать от 1 до 3 секунд. Для кладовщика, который сканирует сотни товаров, постоянные "фризы" интерфейса недопустимы.
  2. Нестабильность. Частое передергивание драйвера повышает риск его зависания или потери связи с портом.
  3. Архитектурная ошибка. Логика поведения программы должна быть зашита в коде программы, а не зависеть от конфигурации "железа". Для обеспечения гибкости интерфейса лучше использовать программное изменение форм, а сканер настроить один раз для единообразной работы во всей системе.

Решение 1: Использование внешнего события (Рекомендуемый метод)

Самый надежный способ работы со сканером в 1С — это использование механизма внешних событий. В этом случае нам не важно, где стоит фокус ввода и есть ли суффикс "Enter" на физическом уровне (точнее, мы настраиваем его один раз и забываем).

Давайте рассмотрим алгоритм настройки:

  1. Настройте сканер на передачу суффикса #13 (CR) всегда. Это стандарт.
  2. В настройках драйвера 1С (в разделе "Подключаемое оборудование") укажите, что суффикс — это CR. Тогда драйвер будет "откусывать" этот символ и передавать в 1С чистый штрихкод.

Теперь самое главное — программная обработка. Вместо того чтобы полагаться на то, что сканер "впечатает" цифры в поле ввода, мы будем ловить событие. В управляемых формах за это отвечает обработчик ОбработкаОповещения. Это особенно актуально, когда требуется сканирование штрихкодов в форме подбора номенклатуры в 1С: УТ 11, где стандартный поиск может не поддерживать сканер "из коробки".

Посмотрим на пример кода, который решает проблему автора (сканирование пропуска сотрудника в специальном поле, где "Enter" мешает):


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	// Проверяем, что событие пришло от сканера штрихкодов
	// ИмяСобытия может отличаться в зависимости от БПО, часто это "Штрихкод" или "ScanData"
	Если ИмяСобытия = "Штрихкод" ИЛИ ИмяСобытия = "ScanData" Тогда
		
		Штрихкод = Параметр[0]; // Получаем сами данные
		
		// Логика для формы, где "Enter" мешал бы при эмуляции клавиатуры
		// Мы принудительно вставляем данные туда, куда нам нужно, игнорируя фокус
		Если Элементы.ГруппаСканированияСотрудника.Видимость Тогда
			
			// Программно заполняем поле
			Объект.ШтрихкодСотрудника = Штрихкод;
			
			// Запускаем процедуру поиска сотрудника программно
			НайтиСотрудникаПоШтрихкоду();
			
			// Прерываем дальнейшую обработку, если нужно
			Возврат;
			
		КонецЕсли;
		
		// Логика для обычного подбора товаров (если мы не в режиме сотрудника)
		ОбработатьПодборТовара(Штрихкод);
		
	КонецЕсли;

КонецПроцедуры

В чем преимущество этого метода? Сканер работает в фоновом режиме. Даже если курсор стоит не в том поле, 1С перехватит данные. "Лишний" Enter не нажмет кнопку по умолчанию, потому что драйвер (или Native API) передает данные пакетом, а не эмулирует нажатия клавиш.

Решение 2: Работа в режиме разрыва клавиатуры (Если нельзя использовать драйвер)

Если по каким-то причинам вы вынуждены использовать сканер как клавиатуру (Keyboard Wedge) и суффикс "Enter" физически нажимается сканером, нам нужно научить форму правильно реагировать на это.

Когда сканер вводит цифры и нажимает Enter, происходит событие изменения поля ввода. Часто проблема заключается в том, что поле ввода имеет свойство АвтоКнопкаПоУмолчанию или на форме есть кнопка "ОК", которая срабатывает по Enter.

Рассмотрим, как это обойти программно:

  1. У поля ввода, в которое сканируется штрихкод, установите свойство КнопкаПоУмолчанию (DefaultButton) в значение Ложь (если такое свойство доступно для элемента) или убедитесь, что на форме нет кнопки, которая срабатывает по Enter бесконтрольно.
  2. Используйте событие ОкончаниеВводаТекста.

&НаКлиенте
Процедура ПолеШтрихкодОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	// Если сканер ввел текст и "нажал" Enter, мы попадаем сюда.
	// Текст содержит штрихкод.
	
	Если Не ПустаяСтрока(Текст) Тогда
		// Выполняем нашу логику
		НайтиНоменклатуруИлиСотрудника(Текст);
		
		// Очищаем поле для следующего сканирования, если нужно
		Элемент.Текст = ""; 
		
		// Важный момент: предотвращаем стандартную обработку, 
		// чтобы фокус не улетел на следующий элемент
		СтандартнаяОбработка = Ложь; 
	КонецЕсли;
	
КонецПроцедуры

Однако, этот метод менее надежен, чем первый, так как зависит от раскладки клавиатуры и скорости ввода. Если пользователь случайно нажмет клавишу во время сканирования, штрихкод исказится.

Решение 3: Фильтрация на уровне БПО (Библиотеки подключаемого оборудования)

В современных конфигурациях (УТ 11, ERP, Розница 2/3) настройки драйвера позволяют гибко управлять суффиксами. Кроме того, вы можете вывести дополнительные колонки в справочнике и подборах номенклатуры, чтобы сразу видеть штрихкод товара при сканировании.

Если вы зайдете в НСИ и Администрирование -> РМК и оборудование -> Подключаемое оборудование, откроете настройки сканера, вы увидите поле "Суффикс".

Почему не сработало решение с "Ручным Энтером"?

В обсуждении автор упомянул, что когда он убрал суффикс и нажимал Enter вручную, поиск не работал. Это происходит из-за особенностей события ПриИзменении в управляемых формах.

Когда данные вводятся программно или очень быстро (как со сканера без суффикса), платформа может не зафиксировать факт окончания ввода, пока фокус не покинет поле. Если суффикса нет, сканер просто "пишет" цифры. Поле ввода остается активным, событие не срабатывает. Вам приходится нажимать Enter, чтобы сдвинуть фокус или подтвердить ввод.

Если вы хотите, чтобы поиск работал сразу после ввода последнего символа (без нажатия Enter), вам пришлось бы использовать событие АвтоПодбор, но для штрихкодов это плохая практика (будет срабатывать поиск после каждой цифры, что "повесит" систему).

Резюме

Подводя итог, можно дать следующие рекомендации для решения проблемы автора:

  1. Не переключайте настройки сканера кнопкой. Это медленно и ненадежно. Оставьте суффикс #13 (Enter) включенным на сканере всегда.
  2. Используйте драйверы Native API или COM. Это позволит системе получать событие сканирования независимо от того, где находится курсор.
  3. Обрабатывайте данные в ОбработкаОповещения. В этом методе проверяйте контекст: если открыта форма подбора сотрудника — ищите сотрудника; если склад — ищите товар.
  4. Игнорируйте "лишние" нажатия. Если драйвер настроен корректно (суффикс указан в настройках 1С), он сам очистит штрихкод от управляющих символов, и ваша программа получит чистые данные для поиска.
← На главную