Как программно «отловить» и обработать событие сканирования штрихкода в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Понимание работы сканера в режиме эмуляции клавиатуры

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

В современных конфигурациях, построенных на базе Библиотеки подключаемого оборудования (БТО), прямое использование обработчика ОбработкаВнешнегоСобытия в модуле формы часто не дает результата, так как БТО перехватывает это событие на уровне ядра и транслирует его в систему оповещений. Выясним, как правильно интегрировать сканер в свою форму.

Шаг 1. Подключение оборудования при открытии формы

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

Рассмотрим пример кода в модуле формы, который необходимо добавить в процедуру ПриОткрытии:


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

Важный момент: если вы работаете в нетиповой конфигурации или создаете новую форму в типовой, вы можете столкнуться с ошибкой Поле объекта не обнаружено (ПоддерживаемыеТипыПодключаемогоОборудования). Проанализируем причину: методы БТО ожидают наличие этого реквизита у формы для фильтрации событий. Решить это можно добавлением реквизита в редакторе формы или программным способом через ЭтаФорма.Вставить(...), как показано выше.

Шаг 2. Обработка события через Оповещение

В типовых решениях (таких как Комплексная автоматизация 2, ERP 2.5 или УТ 11) событие от сканера не приходит напрямую в ОбработкаВнешнегоСобытия. Вместо этого используется механизм оповещений. Разберем, как реализовать обработчик:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    // Проверяем, что событие пришло от подключаемого оборудования
    Если Источник = "ПодключаемоеОборудование" Тогда
        Если ИмяСобытия = "ScanData" Тогда
            // Параметр содержит массив данных штрихкода
            // Обычно Параметр[0] - это считанный ШК (строка)
            // Параметр[1] - данные штрихкода в виде структуры
            
            ОбработатьШтрихкод(Параметр[0]);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьШтрихкод(Штрихкод)
    Сообщить("Считан штрихкод: " + Штрихкод);
    // Здесь ваша логика: поиск товара, добавление в корзину и т.д.
КонецПроцедуры

Шаг 3. Завершение работы с оборудованием

Очень важно освобождать ресурсы при закрытии формы, чтобы сканер мог корректно работать в других окнах системы. Для этого используем процедуру ПриЗакрытии:


&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
    МенеджерОборудованияКлиент.НачатьОтключениеОборудованияПриЗакрытииФормы(Неопределено, ЭтаФорма);
КонецПроцедуры

Почему событие может не «ловиться»? (Чек-лист для проверки)

Если код написан, а точка останова в ОбработкаОповещения все равно не срабатывает, проанализируем технические настройки самого устройства:

  1. Настройка суффикса: Это самая частая причина. В настройках оборудования в 1С (раздел «Подключение и настройка оборудования» -> «Параметры») должен быть указан точно такой же суффикс, какой настроен в самом сканере. Обычно это #13 (CR). Проверить это можно кнопкой «Тест устройства». Если в окне теста при сканировании данные появляются, значит суффикс настроен верно.
  2. Драйвер устройства: Убедитесь, что используется актуальный драйвер 1С:Сканеры штрихкода (NativeAPI). Старые версии драйверов могут некорректно работать в 64-битных клиентах 1С.
  3. Чувствительность (Тайм-аут): В параметрах драйвера есть настройка чувствительности. Если она слишком низкая, драйвер может не успеть понять, что последовательность нажатий клавиш — это штрихкод, а не быстрый ввод пользователя. Оптимальное значение — от 30 до 60 мс.
  4. Модальные окна: Помните, что внешние события блокируются, если в программе открыто модальное окно (например, Вопрос() или Предупреждение() в модальном режиме). Используйте асинхронные вызовы.

Глобальная обработка сканера во всех формах

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

Таким образом, мы выяснили, что для успешной работы со сканером в 1С 8.3 необходимо не только настроить само железо, но и правильно интегрировать вызовы БТО в жизненный цикл управляемой формы. Использование ОбработкаОповещения является современным стандартом для конфигураций на управляемых формах. Для решения частных задач в типовых конфигурациях можно использовать готовые инструменты, например, готовое расширение для интеграции сканера в форму подбора УТ 11.

← На главную