Часто при разработке собственных обработок для работы с торговым оборудованием, например, со сканером штрихкодов на мобильном ТСД, возникает неприятная ситуация. Вы написали код по всем правилам, используя Библиотеку подключаемого оборудования (БПО), но событие от сканера в вашей форме не отлавливается. При этом, если зайти в настройки оборудования, открыть параметры сканера и закрыть их, все волшебным образом начинает работать. Давайте разберемся, почему так происходит и как обеспечить стабильную работу сканера без "ручных трюков".
Ситуация, описанная выше, однозначно указывает на одну причину: оборудование не было корректно инициализировано и подключено к вашей форме в момент ее открытия. Когда вы вручную заходите в параметры сканера через стандартный интерфейс "РМК и оборудование", система выполняет все необходимые процедуры по активации драйвера и "привязке" его к текущему рабочему сеансу. После этого драйвер начинает генерировать события, и ваша форма, если она активна, их получает.
Наша задача — воспроизвести этот процесс инициализации программно, чтобы сканер был готов к работе сразу после открытия нашей обработки.
Для корректной работы с подключаемым оборудованием через БПО необходимо реализовать обработку нескольких событий формы. Пропуск одного из шагов, особенно отключения, часто приводит к "подвисанию" драйвера и проблемам с его последующим подключением.
Рассмотрим полный и правильный цикл работы со сканером на управляемой форме.
Шаг 1. Настройка оборудования на сервере (ПриСозданииНаСервере)
Это самый первый этап. Здесь мы сообщаем системе, что наша форма в принципе собирается работать с подключаемым оборудованием. Для этого используется процедура общего модуля.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// В типовых конфигурациях, например, УТ, есть обертки.
// Этот вызов регистрирует форму как потребителя оборудования.
ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование(ЭтаФорма);
// Если используется БСП напрямую:
// МенеджерОборудованияСервер.НастроитьФорму(ЭтаФорма);
КонецПроцедуры
Шаг 2. Подключение оборудования на клиенте (ПриОткрытии)
После того как форма создана на сервере и открывается у пользователя, необходимо выполнить непосредственное подключение сканера. Это особенно важно, если вы настраиваете подключение Bluetooth сканера в режиме SPP. Этим занимается клиентский менеджер оборудования.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Запускаем процесс подключения оборудования типа "СканерШтрихкода" к нашей форме.
// Первый параметр "Неопределено" означает, что будет подключено первое доступное
// устройство данного типа, настроенное для текущего рабочего места.
МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(
Неопределено,
ЭтаФорма,
"СканерШтрихкода");
КонецПроцедуры
Шаг 3. Обработка события сканирования (ОбработкаОповещения)
Это целевая процедура, которая будет вызываться, когда сканер успешно считает штрихкод. БПО формирует оповещение со стандартными параметрами, которые нам нужно проверить.
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло от подсистемы подключаемого оборудования
// и что это именно событие отсканированных данных.
Если Источник = "ПодключаемоеОборудование" И ИмяСобытия = "ScanData" Тогда
// В параметре "Параметр" обычно находится структура или массив структур
// с данными о сканировании. Как минимум, там будет сам штрихкод.
Штрихкод = Параметр.Штрихкод;
// Здесь размещаем вашу логику по обработке полученного штрихкода.
// Например, можно реализовать заполнение чека ККМ из Реализации по штрихкоду.
Сообщить("Получен штрихкод: " + Штрихкод);
КонецЕсли;
КонецПроцедуры
Важный момент: Многие путают эту процедуру с обработчиком ВнешнееСобытие. ВнешнееСобытие — это более старый механизм, который использовался в основном для COM-устройств. Современная БПО абстрагируется от способа подключения и использует единый механизм оповещений через Оповестить(), который и вызывает ОбработкаОповещения на форме.
Шаг 4. Отключение оборудования (ПриЗакрытии) — самый важный шаг!
Это этап, который чаще всего забывают реализовать. Если не отключить оборудование от формы при ее закрытии, драйвер может остаться в "занятом" состоянии. При следующей попытке открыть вашу или другую форму, которая работает со сканером, подключение не произойдет. Особенно критично это проявляется при перехвате событий в системе Android — для таких устройств разработано готовое решение складского учета на ТСД для 1С. Именно это часто является причиной плавающих ошибок, которые "лечатся" перезапуском сеанса или ручным входом в настройки.
&НаКлиенте
Процедура ПриЗакрытии()
// Обязательно отключаем оборудование, чтобы освободить его для других форм.
МенеджерОборудованияКлиент.ОтключитьОборудованиеПриЗакрытииФормы(ЭтаФорма);
КонецПроцедуры
Если вы реализовали полный цикл, описанный выше, но проблема сохраняется, проанализируем другие возможные причины:
НачатьПодключениеОборудованиеПриОткрытииФормы вместо Неопределено указать конкретный идентификатор устройства.МенеджерОборудованияКлиент.СтатусПодключенияУстройства(Идентификатор).ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование), является правильным для этой конфигурации. Стоит учитывать, что иногда требуется доработка логики, например, когда нужно реализовать сканирование штрихкодов в форме подбора номенклатуры в 1С: УТ 11, где это не предусмотрено штатно.Таким образом, ключ к решению проблемы — это строгое следование полному жизненному циклу работы с оборудованием на форме: Настройка -> Подключение -> Обработка событий -> Отключение. Реализация всех четырех этапов гарантирует стабильную и предсказуемую работу сканера штрихкода в ваших разработках.