При работе со сканерами штрихкода в среде 1С:Предприятие на обычных формах часто возникает классическая проблема: если пользователь не установил курсор в специальное поле ввода или не нажал кнопку поиска (обычно F7), данные со сканера либо «улетают» в никуда, либо вводятся в случайное текстовое поле, вызывая ошибки. В этой статье мы разберем, как настроить систему так, чтобы 1С перехватывала данные сканера автоматически, независимо от того, какой элемент формы активен в данный момент.
Прежде всего, разберем физику процесса. Сканеры штрихкода (включая упомянутый в обсуждении Newland NLS-HR32) могут работать в двух основных режимах:
ВнешнееСобытие. Это наиболее надежный и профессиональный способ интеграции.Рассмотрим подробнее, как реализовать перехват события в обоих случаях.
Проанализируем ситуацию: если сканер работает как клавиатура, 1С не понимает разницы между нажатием клавиш человеком и вводом от сканера. Чтобы это исправить, переведем устройство в режим виртуального COM-порта. Для модели Newland HR32 и аналогичных это делается следующим образом:
COM3).Теперь настроим 1С. Зайдем в меню «Сервис» — «Торговое оборудование» — «Подключение и настройка торгового оборудования». Добавим новое устройство с использованием драйвера «1С: Сканеры штрихкода». В параметрах укажем наш номер порта. Теперь, при сканировании, форма будет получать управление через процедуру ВнешнееСобытие.
Если нет возможности использовать COM-порт (например, из-за ограничений терминального сервера), мы можем заставить 1С генерировать внешнее событие даже от клавиатурного сканера. Для этого воспользуемся современными драйверами (например, 1C:Barcode Scanner NativeAPI).
Выясним причину, почему это работает: современные драйверы используют механизм Keyboard Hook (перехват клавиатуры). Они анализируют скорость ввода символов. Если 10-13 символов приходят за доли секунды, драйвер понимает, что это сканер, блокирует ввод в текущее поле и передает данные в 1С как событие.
Для настройки этого режима выполним шаги:
#13 — символ возврата каретки Enter). Почти все сканеры по умолчанию «нажимают» Enter после считывания кода. Если суффикс в настройках 1С совпадает с настройкой сканера, событие будет успешно генерироваться.Теперь, когда оборудование настроено на генерацию внешнего события, нам нужно научить форму 1С реагировать на него. Разберем по шагам, как написать обработчик в модуле обычной формы документа.
Для этого в модуле формы должна присутствовать предопределенная процедура ВнешнееСобытие. Проанализируем пример кода:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Источник - это идентификатор устройства, который мы задали в настройках
// Событие - обычно строка "Barcode"
// Данные - сам считанный штрихкод в виде строки
Если Событие = "Barcode" Тогда
Штрихкод = СокрЛП(Данные);
// Очищаем переменную от возможных префиксов/суффиксов,
// если драйвер их не отрезал сам
ПроверитьИОбработатьШтрихкод(Штрихкод);
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее функцию обработки. Важно не просто получить строку, но и найти по ней товар в базе данных и добавить его в табличную часть документа.
Процедура ПроверитьИОбработатьШтрихкод(СчитанныйШтрихкод)
// Ищем товар в справочнике "Штрихкоды" или через регистр сведений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Владелец КАК Номенклатура,
| Штрихкоды.ЕдиницаИзмерения КАК Единица
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", СчитанныйШтрихкод);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
// Товар найден, добавляем в табличную часть "Товары"
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = Результат.Номенклатура;
НоваяСтрока.ЕдиницаИзмерения = Результат.Единица;
НоваяСтрока.Количество = 1;
// Вызываем пересчет сумм и налогов, если это типовая конфигурация
ОбработкаТабличнойЧастиТовары(НоваяСтрока);
Иначе
Предупреждение("Штрихкод " + СчитанныйШтрихкод + " не зарегистрирован в базе!");
КонецЕсли;
КонецПроцедуры
Если вы используете сканер Newland HR32, крайне рекомендуем воспользоваться фирменной утилитой EasySet. Она позволяет визуально настроить параметры сканирования:
~), чтобы драйвер 1С гарантированно отличал сканер от клавиатуры.CR (Carriage Return) или Tab.В обсуждении автор упоминал попытку использовать ОбновлениеОтображения. Выясним причину неэффективности этого метода: данное событие срабатывает при любом изменении визуального состояния формы (фокус, прокрутка, изменение текста). Оно не предназначено для захвата потока данных и не может «знать», что нажатия клавиш — это штрихкод. Более того, использование этого метода создает колоссальную нагрузку на систему, так как процедура вызывается десятки раз в секунду.
Подводя итог, наиболее правильным решением для отлова события сканирования в любой области формы является настройка сканера как торгового оборудования. Это переводит взаимодействие в событийную модель:
ВнешнееСобытие в активной форме.ВнешнееСобытие(Источник, Событие, Данные).Такой подход избавляет пользователя от необходимости использовать кнопку F7 и гарантирует стабильную работу системы даже при «случайных» кликах по форме.