Часто при разработке собственных форм в 1С:Управление торговлей 11 программисты сталкиваются с ситуацией: сканер штрихкодов отлично работает в типовых формах (например, в рабочем месте кассира), успешно «печатает» цифры в обычном блокноте, но при попытке считать код в текстовое поле самописной формы ничего не происходит. Даже если курсор установлен в нужное поле, данные просто не появляются.
В этой статье мы подробно разберем, почему так происходит, как работает механизм перехвата событий в 1С и что именно нужно добавить в программный код вашей формы, чтобы сканер «ожил».
Первым делом проанализируем, как сканер взаимодействует с компьютером. Существует два основных режима работы:
Важный нюанс: Если сканер зарегистрирован в системе как «Подключаемое оборудование», 1С блокирует стандартный клавиатурный ввод от этого устройства. Это делается для того, чтобы программа могла обработать штрихкод в фоновом режиме, даже если фокус не стоит в поле ввода. Поэтому простое ожидание текста в поле Элементы.ПолеШтрихкода не даст результата — событие «проваливается» в систему, но форма не знает, что с ним делать.
Для того чтобы форма начала принимать данные от сканера, перехваченные драйвером, нам необходимо реализовать в модуле формы процедуру ОбработкаОповещения. Рассмотрим пример кода, который используется в типовых конфигурациях на базе БСП:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло именно от подключаемого оборудования
Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
// Проверяем тип события - сканирование данных
Если ИмяСобытия = "ScanData" Тогда
// Важно использовать менеджер оборудования для корректной расшифровки
// В УТ 11 это обычно МенеджерОборудованияУТКлиент
Если МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
// Преобразуем полученные данные в массив (может быть несколько кодов)
МассивШтрихкодов = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр);
// Вызываем свою процедуру обработки полученных данных
ОбработатьПолученныеШтрихкоды(МассивШтрихкодов);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом коде мы проверяем ИмяСобытия = "ScanData". Это стандартное имя события для сканеров, прошедших сертификацию «1С:Совместимо». Если вы используете старые драйверы, имя может отличаться, но в современных версиях УТ 11 это стандарт.
Простого наличия процедуры ОбработкаОповещения недостаточно. Мы должны явно сообщить менеджеру оборудования, что наша форма готова принимать данные. Это критически важно, иначе события могут уходить в другие открытые окна или игнорироваться.
Для этого в процедурах ПриОткрытии и ПриЗакрытии нужно добавить вызовы подключения и отключения устройства. Проанализируем, как это сделать правильно:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем сканер штрихкодов для данной формы
МенеджерОборудованияКлиент.ПодключитьОборудованиеПоТипу(УникальныйИдентификатор, "СканерШтрихкода");
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
// Обязательно отключаем, чтобы не блокировать работу сканера в других формах
МенеджерОборудованияКлиент.ОтключитьОборудованиеПоТипу(УникальныйИдентификатор, "СканерШтрихкода");
КонецПроцедуры
Использование УникальныйИдентификатор формы позволяет системе четко понимать, какой именно объект сейчас является «слушателем» порта сканера.
После того как данные получены и преобразованы в массив, нам нужно поместить их в наше текстовое поле или выполнить поиск в базе. Рассмотрим пример процедуры обработки:
&НаКлиенте
Процедура ОбработатьПолученныеШтрихкоды(МассивШтрихкодов)
Если МассивШтрихкодов.Количество() > 0 Тогда
// Берем первый считанный код (обычно он один)
ДанныеШтрихкода = МассивШтрихкодов[0];
// Записываем значение в реквизит формы, связанный с текстовым полем
Объект.ШтрихкодТекст = ДанныеШтрихкода.Штрихкод;
// Здесь можно сразу вызвать поиск товара или другие действия
ПоискТовараПоШтрихкоду(Объект.ШтрихкодТекст);
КонецЕсли;
КонецПроцедуры
Выясним, какие еще факторы могут влиять на работу сканера в самописной форме:
ОткрытьМодально, что уже не рекомендуется), внешние события могут блокироваться. Старайтесь использовать метод ОткрытьФорму с режимом блокировки владельца.ОбработкаОповещения), убедитесь, что в самом сканере настроен суффикс CR (Enter). Без него 1С не поймет, что ввод завершен, и курсор останется в поле, не вызывая событие ПриИзменении.ИспользованиеПодключаемогоОборудования. Без этой роли менеджер оборудования не сможет инициализировать драйвер в вашей форме.ОбработкаОповещения заключается в том, что данные будут считаны, даже если фокус стоит на кнопке или табличной части. Вам больше не нужно заставлять пользователя постоянно держать курсор в текстовом поле.Подведем итог: Если вы работаете в современной 1С:УТ 11, забудьте про простую «печать» штрихкода в поле ввода. Правильный путь — регистрация формы в менеджере оборудования и обработка внешнего события через ОбработкаОповещения. Это гарантирует стабильную работу с любыми моделями сканеров, будь то USB-HID или COM-портовые устройства.