Почему не работает сканер штрихкодов в самописной форме 1С:УТ 11 и как это исправить

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

Часто при разработке собственных форм в 1С:Управление торговлей 11 программисты сталкиваются с ситуацией: сканер штрихкодов отлично работает в типовых формах (например, в рабочем месте кассира), успешно «печатает» цифры в обычном блокноте, но при попытке считать код в текстовое поле самописной формы ничего не происходит. Даже если курсор установлен в нужное поле, данные просто не появляются.

В этой статье мы подробно разберем, почему так происходит, как работает механизм перехвата событий в 1С и что именно нужно добавить в программный код вашей формы, чтобы сканер «ожил».

Разберем причину: Эмуляция клавиатуры против Подключаемого оборудования

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

  1. Режим эмуляции клавиатуры (HID): Сканер работает как обычное устройство ввода. Когда вы считываете штрихкод, операционная система «думает», что кто-то очень быстро нажал клавиши на клавиатуре. В этом режиме данные попадают в любое активное текстовое поле.
  2. Работа через драйвер (Native API / OPOS): В 1С:УТ 11 используется подсистема «Подключаемое оборудование». Как только сканер добавлен в справочник оборудования и настроен, драйвер 1С начинает перехватывать поток данных на низком уровне.

Важный нюанс: Если сканер зарегистрирован в системе как «Подключаемое оборудование», 1С блокирует стандартный клавиатурный ввод от этого устройства. Это делается для того, чтобы программа могла обработать штрихкод в фоновом режиме, даже если фокус не стоит в поле ввода. Поэтому простое ожидание текста в поле Элементы.ПолеШтрихкода не даст результата — событие «проваливается» в систему, но форма не знает, что с ним делать.

Шаг 1. Реализация обработчика оповещения

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


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

В этом коде мы проверяем ИмяСобытия = "ScanData". Это стандартное имя события для сканеров, прошедших сертификацию «1С:Совместимо». Если вы используете старые драйверы, имя может отличаться, но в современных версиях УТ 11 это стандарт.

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

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

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


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

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

Использование УникальныйИдентификатор формы позволяет системе четко понимать, какой именно объект сейчас является «слушателем» порта сканера.

Шаг 3. Обработка полученных данных

После того как данные получены и преобразованы в массив, нам нужно поместить их в наше текстовое поле или выполнить поиск в базе. Рассмотрим пример процедуры обработки:


&НаКлиенте
Процедура ОбработатьПолученныеШтрихкоды(МассивШтрихкодов)
    
    Если МассивШтрихкодов.Количество() > 0 Тогда
        // Берем первый считанный код (обычно он один)
        ДанныеШтрихкода = МассивШтрихкодов[0];
        
        // Записываем значение в реквизит формы, связанный с текстовым полем
        Объект.ШтрихкодТекст = ДанныеШтрихкода.Штрихкод;
        
        // Здесь можно сразу вызвать поиск товара или другие действия
        ПоискТовараПоШтрихкоду(Объект.ШтрихкодТекст);
    КонецЕсли;
    
КонецПроцедуры

Дополнительные технические нюансы

Выясним, какие еще факторы могут влиять на работу сканера в самописной форме:

  1. Проблема модальных окон: Если ваша форма открыта модально (через ОткрытьМодально, что уже не рекомендуется), внешние события могут блокироваться. Старайтесь использовать метод ОткрытьФорму с режимом блокировки владельца.
  2. Настройка суффиксов: Если сканер работает в режиме эмуляции клавиатуры (и вы НЕ хотите использовать ОбработкаОповещения), убедитесь, что в самом сканере настроен суффикс CR (Enter). Без него 1С не поймет, что ввод завершен, и курсор останется в поле, не вызывая событие ПриИзменении.
  3. Права доступа: Убедитесь, что у пользователя, работающего с формой, есть роль ИспользованиеПодключаемогоОборудования. Без этой роли менеджер оборудования не сможет инициализировать драйвер в вашей форме.
  4. Фокус и невидимые поля: Огромный плюс работы через ОбработкаОповещения заключается в том, что данные будут считаны, даже если фокус стоит на кнопке или табличной части. Вам больше не нужно заставлять пользователя постоянно держать курсор в текстовом поле.

Подведем итог: Если вы работаете в современной 1С:УТ 11, забудьте про простую «печать» штрихкода в поле ввода. Правильный путь — регистрация формы в менеджере оборудования и обработка внешнего события через ОбработкаОповещения. Это гарантирует стабильную работу с любыми моделями сканеров, будь то USB-HID или COM-портовые устройства.

← На главную