Как получить данные со сканера штрихкодов в собственной обработке 1С:Розница?

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

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

Разберем по шагам, как правильно встроить форму произвольной обработки в конвейер обработки событий БПО, чтобы гарантировать корректное считывание данных без зависаний и блокировок повторных сканирований.

Архитектура обработки событий сканера в БПО

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

  1. Драйвер оборудования генерирует низкоуровневое внешнее событие на стороне клиента.
  2. Ядро подсистемы подключаемого оборудования перехватывает сигнал драйвера, парсит полученные данные и формирует оповещение платформы.
  3. Оповещение рассылается активным управляемым формам, которые зарегистрировали интерес к данному типу оборудования.

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

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

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

Шаг 1. Инициализация и подключение при открытии

В модуле управляемой формы в обработчике ПриОткрытии инициируем захват сканера штрихкодов с помощью методов клиентского менеджера оборудования:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПоддерживаемыеТипы = "СканерШтрихкода";
    МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтотОбъект, ПоддерживаемыеТипы);
КонецПроцедуры

Шаг 2. Обработка входящего оповещения

Создадим стандартную процедуру формы ОбработкаОповещения. Именно сюда подсистема БПО передает преобразованные данные после считывания штрихкода:


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

&НаКлиенте
Процедура ОбработатьПолученныйШтрихкод(Штрихкод)
    Сообщить("Считан штрихкод: " + Штрихкод);
КонецПроцедуры

Шаг 3. Корректное освобождение оборудования при закрытии

Чтобы избежать блокировки сканера для других окон программы, в обработчике ПриЗакрытии обязательно освобождаем устройство:


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

Возможные проблемы и аппаратные особенности

Проанализируем сопутствующие причины, из-за которых сканирование может не работать или зависать:

  1. Режим работы сканера (USB HID vs Virtual COM): В режиме эмуляции клавиатуры (USB HID) устройство просто впечатывает символы в поле с фокусом ввода. Для полноценного перехвата событий независимо от положения курсора сканер должен быть переведен в режим эмуляции виртуального COM-порта (USB-COM / Virtual COM).
  2. Отсутствие суффикса: Драйвер БПО ожидает завершающий символ строки (обычно CR с кодом 13 или CR+LF). Если в прошивке сканера отключен суффикс, драйвер ожидает продолжения пакета и не передает данные как завершенное событие.
  3. Модальные диалоги и блокировка ввода: Метод ВводДоступен() возвращает Ложь, если поверх формы открыто модальное окно. В этом случае входящие события сканирования корректно отсекаются платформой.
  4. Считывание маркировки: При работе с кодами DataMatrix (маркированный товар) режим эмуляции клавиатуры часто искажает или теряет непечатный спецсимвол-разделитель GS (ASCII 29). Для таких задач использование режима COM-порта обязательно.
← На главную