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