При разработке собственных обработок, рабочих мест кассира или нестандартных складских документов в конфигурациях на платформе 1С:Предприятие часто возникает задача напрямую перехватить считанный штрихкод со сканера. В типовых конфигурациях (таких как 1С:Розница, 1С:Управление торговлей, 1С:ERP) работа с торговым оборудованием стандартизирована и выполняется через Библиотеку подключаемого оборудования (БПО).
Разберем по шагам, как правильно встроить форму произвольной обработки в конвейер обработки событий БПО, чтобы гарантировать корректное считывание данных без зависаний и блокировок повторных сканирований.
Выясним, как устроена передача данных со сканера в управляемом приложении. При использовании БПО применяется централизованная схема работы:
Важно: если разработчик пытается обработать сигнал напрямую через стандартный обработчик формы ВнешнееСобытие в обход конвейера БПО, обработка события в подсистеме считается незавершенной. В результате очередь драйвера не очищается, и сканер срабатывает ровно один раз, после чего перестает реагировать на следующие штрихкоды.
Для корректного получения данных необходимо реализовать три обязательных этапа жизненного цикла формы: подключение при открытии, перехват события в оповещении и отключение устройства при закрытии.
Шаг 1. Инициализация и подключение при открытии
В модуле управляемой формы в обработчике ПриОткрытии инициируем захват сканера штрихкодов с помощью методов клиентского менеджера оборудования:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПоддерживаемыеТипы = "СканерШтрихкода";
МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтотОбъект, ПоддерживаемыеТипы);
КонецПроцедуры
Шаг 2. Обработка входящего оповещения
Создадим стандартную процедуру формы ОбработкаОповещения. Именно сюда подсистема БПО передает преобразованные данные после считывания штрихкода:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
Если ИмяСобытия = "ScanData" Тогда
// В переменной Параметр передается массив, где первый элемент содержит считанный ШК
Штрихкод = Параметр[0];
// Выполняем требуемые действия со штрихкодом
ОбработатьПолученныйШтрихкод(Штрихкод);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьПолученныйШтрихкод(Штрихкод)
Сообщить("Считан штрихкод: " + Штрихкод);
КонецПроцедуры
Шаг 3. Корректное освобождение оборудования при закрытии
Чтобы избежать блокировки сканера для других окон программы, в обработчике ПриЗакрытии обязательно освобождаем устройство:
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(ЭтотОбъект);
КонецПроцедуры
Проанализируем сопутствующие причины, из-за которых сканирование может не работать или зависать:
CR с кодом 13 или CR+LF). Если в прошивке сканера отключен суффикс, драйвер ожидает продолжения пакета и не передает данные как завершенное событие.ВводДоступен() возвращает Ложь, если поверх формы открыто модальное окно. В этом случае входящие события сканирования корректно отсекаются платформой.GS (ASCII 29). Для таких задач использование режима COM-порта обязательно.