Почему не срабатывает событие от сканера штрихкода в 1С и как это исправить?

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

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

Анализ проблемы: почему сканер "просыпается" после входа в настройки?

Ситуация, описанная выше, однозначно указывает на одну причину: оборудование не было корректно инициализировано и подключено к вашей форме в момент ее открытия. Когда вы вручную заходите в параметры сканера через стандартный интерфейс "РМК и оборудование", система выполняет все необходимые процедуры по активации драйвера и "привязке" его к текущему рабочему сеансу. После этого драйвер начинает генерировать события, и ваша форма, если она активна, их получает.

Наша задача — воспроизвести этот процесс инициализации программно, чтобы сканер был готов к работе сразу после открытия нашей обработки.

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

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

Рассмотрим полный и правильный цикл работы со сканером на управляемой форме.

  1. Шаг 1. Настройка оборудования на сервере (ПриСозданииНаСервере)

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

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

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

    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    
        // Запускаем процесс подключения оборудования типа "СканерШтрихкода" к нашей форме.
        // Первый параметр "Неопределено" означает, что будет подключено первое доступное
        // устройство данного типа, настроенное для текущего рабочего места.
        МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(
            Неопределено, 
            ЭтаФорма, 
            "СканерШтрихкода");
            
    КонецПроцедуры
    
  3. Шаг 3. Обработка события сканирования (ОбработкаОповещения)

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

    
    &НаКлиенте
    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
        // Проверяем, что событие пришло от подсистемы подключаемого оборудования
        // и что это именно событие отсканированных данных.
        Если Источник = "ПодключаемоеОборудование" И ИмяСобытия = "ScanData" Тогда
            
            // В параметре "Параметр" обычно находится структура или массив структур
            // с данными о сканировании. Как минимум, там будет сам штрихкод.
            Штрихкод = Параметр.Штрихкод;
            
            // Здесь размещаем вашу логику по обработке полученного штрихкода.
            // Например, можно реализовать заполнение чека ККМ из Реализации по штрихкоду.
            Сообщить("Получен штрихкод: " + Штрихкод);
            
        КонецЕсли;
    
    КонецПроцедуры
    

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

  4. Шаг 4. Отключение оборудования (ПриЗакрытии) — самый важный шаг!

    Это этап, который чаще всего забывают реализовать. Если не отключить оборудование от формы при ее закрытии, драйвер может остаться в "занятом" состоянии. При следующей попытке открыть вашу или другую форму, которая работает со сканером, подключение не произойдет. Особенно критично это проявляется при перехвате событий в системе Android — для таких устройств разработано готовое решение складского учета на ТСД для 1С. Именно это часто является причиной плавающих ошибок, которые "лечатся" перезапуском сеанса или ручным входом в настройки.

    
    &НаКлиенте
    Процедура ПриЗакрытии()
    
        // Обязательно отключаем оборудование, чтобы освободить его для других форм.
        МенеджерОборудованияКлиент.ОтключитьОборудованиеПриЗакрытииФормы(ЭтаФорма);
        
    КонецПроцедуры
    

Что еще может быть не так?

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

Таким образом, ключ к решению проблемы — это строгое следование полному жизненному циклу работы с оборудованием на форме: Настройка -> Подключение -> Обработка событий -> Отключение. Реализация всех четырех этапов гарантирует стабильную и предсказуемую работу сканера штрихкода в ваших разработках.

← На главную