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

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

При работе со сканерами штрихкода в среде 1С:Предприятие на обычных формах часто возникает классическая проблема: если пользователь не установил курсор в специальное поле ввода или не нажал кнопку поиска (обычно F7), данные со сканера либо «улетают» в никуда, либо вводятся в случайное текстовое поле, вызывая ошибки. В этой статье мы разберем, как настроить систему так, чтобы 1С перехватывала данные сканера автоматически, независимо от того, какой элемент формы активен в данный момент.

Анализ режимов работы сканера

Прежде всего, разберем физику процесса. Сканеры штрихкода (включая упомянутый в обсуждении Newland NLS-HR32) могут работать в двух основных режимах:

  1. Эмуляция клавиатуры (HID Keyboard): Сканер прикидывается клавиатурой и «печатает» символы штрихкода туда, где стоит курсор. Это самый простой, но и самый проблемный режим для разработчика 1С.
  2. Эмуляция COM-порта (Virtual COM Port): Сканер передает данные в конкретный порт. 1С «слушает» этот порт и, как только приходят данные, генерирует специальное ВнешнееСобытие. Это наиболее надежный и профессиональный способ интеграции.

Рассмотрим подробнее, как реализовать перехват события в обоих случаях.

Способ 1: Перевод сканера в режим Virtual COM (Рекомендуемый)

Проанализируем ситуацию: если сканер работает как клавиатура, 1С не понимает разницы между нажатием клавиш человеком и вводом от сканера. Чтобы это исправить, переведем устройство в режим виртуального COM-порта. Для модели Newland HR32 и аналогичных это делается следующим образом:

  1. Найдите руководство по программированию (Programming Guide) для вашего устройства.
  2. Считайте специальный настроечный штрихкод "USB COM Port Emulation".
  3. Установите драйвер виртуального COM-порта (VCP Driver) от производителя (Newland) на компьютер.
  4. В диспетчере устройств Windows проверьте, какой номер порта был присвоен устройству (например, COM3).

Теперь настроим 1С. Зайдем в меню «Сервис» — «Торговое оборудование» — «Подключение и настройка торгового оборудования». Добавим новое устройство с использованием драйвера «1С: Сканеры штрихкода». В параметрах укажем наш номер порта. Теперь, при сканировании, форма будет получать управление через процедуру ВнешнееСобытие.

Способ 2: Работа в режиме эмуляции клавиатуры через программный перехват

Если нет возможности использовать COM-порт (например, из-за ограничений терминального сервера), мы можем заставить 1С генерировать внешнее событие даже от клавиатурного сканера. Для этого воспользуемся современными драйверами (например, 1C:Barcode Scanner NativeAPI).

Выясним причину, почему это работает: современные драйверы используют механизм Keyboard Hook (перехват клавиатуры). Они анализируют скорость ввода символов. Если 10-13 символов приходят за доли секунды, драйвер понимает, что это сканер, блокирует ввод в текущее поле и передает данные в 1С как событие.

Для настройки этого режима выполним шаги:

  1. В настройках торгового оборудования 1С выберите порт «Клавиатура».
  2. Укажите Суффикс (обычно это #13 — символ возврата каретки Enter). Почти все сканеры по умолчанию «нажимают» Enter после считывания кода. Если суффикс в настройках 1С совпадает с настройкой сканера, событие будет успешно генерироваться.

Программная обработка события в коде формы

Теперь, когда оборудование настроено на генерацию внешнего события, нам нужно научить форму 1С реагировать на него. Разберем по шагам, как написать обработчик в модуле обычной формы документа.

Для этого в модуле формы должна присутствовать предопределенная процедура ВнешнееСобытие. Проанализируем пример кода:


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

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

Рассмотрим подробнее функцию обработки. Важно не просто получить строку, но и найти по ней товар в базе данных и добавить его в табличную часть документа.


Процедура ПроверитьИОбработатьШтрихкод(СчитанныйШтрихкод)
    
    // Ищем товар в справочнике "Штрихкоды" или через регистр сведений
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |   Штрихкоды.Владелец КАК Номенклатура,
    |   Штрихкоды.ЕдиницаИзмерения КАК Единица
    |ИЗ
    |   РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |   Штрихкоды.Штрихкод = &Штрихкод";
    
    Запрос.УстановитьПараметр("Штрихкод", СчитанныйШтрихкод);
    Результат = Запрос.Выполнить().Выбрать();
    
    Если Результат.Следующий() Тогда
        // Товар найден, добавляем в табличную часть "Товары"
        НоваяСтрока = Товары.Добавить();
        НоваяСтрока.Номенклатура = Результат.Номенклатура;
        НоваяСтрока.ЕдиницаИзмерения = Результат.Единица;
        НоваяСтрока.Количество = 1;
        
        // Вызываем пересчет сумм и налогов, если это типовая конфигурация
        ОбработкаТабличнойЧастиТовары(НоваяСтрока); 
    Иначе
        Предупреждение("Штрихкод " + СчитанныйШтрихкод + " не зарегистрирован в базе!");
    КонецЕсли;
    
КонецПроцедуры

Использование утилиты EasySet для Newland

Если вы используете сканер Newland HR32, крайне рекомендуем воспользоваться фирменной утилитой EasySet. Она позволяет визуально настроить параметры сканирования:

Почему "ОбновлениеОтображения" не подходит?

В обсуждении автор упоминал попытку использовать ОбновлениеОтображения. Выясним причину неэффективности этого метода: данное событие срабатывает при любом изменении визуального состояния формы (фокус, прокрутка, изменение текста). Оно не предназначено для захвата потока данных и не может «знать», что нажатия клавиш — это штрихкод. Более того, использование этого метода создает колоссальную нагрузку на систему, так как процедура вызывается десятки раз в секунду.

Заключение

Подводя итог, наиболее правильным решением для отлова события сканирования в любой области формы является настройка сканера как торгового оборудования. Это переводит взаимодействие в событийную модель:

  1. Драйвер перехватывает данные на уровне ОС или порта.
  2. 1С генерирует ВнешнееСобытие в активной форме.
  3. Разработчик обрабатывает данные в процедуре ВнешнееСобытие(Источник, Событие, Данные).

Такой подход избавляет пользователя от необходимости использовать кнопку F7 и гарантирует стабильную работу системы даже при «случайных» кликах по форме.

← На главную