В процессе разработки собственных обработок для автоматизации торговых операций часто возникает задача интеграции со сканером штрихкодов. Настройка такого взаимодействия требует не только подключения физического устройства, но и правильного программного перехвата данных в коде управляемой формы. В данной статье мы подробно разберем, как реализовать получение штрихкода, используя механизмы Библиотеки подключаемого оборудования (БПО).
Прежде чем переходить к написанию кода, давайте разберем, как 1С взаимодействует с периферийным оборудованием. Существует два основных режима работы сканера: в разрыв клавиатуры (Keyboard Emulation) и через COM-порт (или эмуляцию COM-порта). Для корректного перехвата данных без привязки к активному полю ввода мы будем использовать механизм внешних событий. Это позволяет форме «слышать» сканер, даже если курсор не установлен в текстовое поле.
Для начала нам необходимо сообщить системе, что при открытии нашей формы нужно активировать сканер штрихкода. Мы используем методы типовой БПО, которые присутствуют в большинстве современных конфигураций (УТ 11, Розница 2, ERP). В модуле управляемой формы создадим процедуру ПриОткрытии.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем оборудование через менеджер оборудования
// Параметр "СканерШтрихкода" указывает на тип подключаемого устройства
МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтотОбъект, "СканерШтрихкода, СчитывательМагнитныхКарт");
КонецПроцедуры
Проанализируем этот код: метод НачатьПодключениеОборудованиеПриОткрытииФормы инициирует асинхронный процесс захвата устройства. Важно передать ЭтотОбъект, чтобы система понимала, какая форма будет «владельцем» событий от сканера.
Чтобы клиентские методы БПО понимали, какое именно оборудование закреплено за текущим рабочим местом, необходимо выполнить серверную настройку. Рассмотрим процедуру ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вызываем серверный метод БПО для подготовки настроек оборудования
ПодключаемоеОборудованиеРТВызовСервера.НастроитьПодключаемоеОборудование(ЭтотОбъект);
КонецПроцедуры
Этот вызов подготавливает внутренние структуры данных формы, связывая её с подсистемой торгового оборудования. Без этого шага клиентские методы могут не найти активных драйверов.
Самый ответственный момент — перехват самого штрихкода. Когда сканер считывает код, он генерирует внешнее событие, которое «прилетает» в форму. Для этого в свойствах формы должно быть назначено событие ВнешнееСобытие.
Разберем реализацию обработки события:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверяем, доступна ли форма для ввода, чтобы избежать обработки в фоновом режиме
Если ВводДоступен() Тогда
// Транслируем событие в типовой механизм обработки БПО
ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудования(ЭтотОбъект, Источник, Событие, Данные);
// В переменной "Данные" обычно приходит считанный штрихкод.
// Выведем его пользователю для проверки.
Сообщить("Считан штрихкод: " + Данные);
КонецЕсли;
КонецПроцедуры
Важно помнить, что в зависимости от версии драйвера, параметр Данные может содержать как чистую строку со штрихкодом, так и сложный объект (массив или структуру), содержащую тип штрихкода и само значение. Проанализируем ситуацию: если вы используете современные драйверы NativeApi, рекомендуется проверять тип данных.
Нельзя забывать об освобождении устройства. Если мы не «отпустим» сканер при закрытии формы, другие окна или даже другие программы могут не получить к нему доступ. Добавим обработчик ПриЗакрытии:
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
// Отключаем оборудование, чтобы освободить ресурсы
МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтотОбъект);
КонецПроцедуры
Если ваш сканер настроен как клавиатурное устройство, вы можете столкнуться с тем, что ВнешнееСобытие не срабатывает. Выясним причину: такие сканеры просто имитируют нажатие клавиш. Чтобы 1С воспринимала их как торговое оборудование, необходимо:
Если суффикс в настройках драйвера 1С не совпадает с настройками самого железного сканера, данные будут просто печататься в активное поле (если оно есть), но процедура ВнешнееСобытие не вызовется.
В последних версиях БПО механизм ВнешнееСобытие часто используется только как «транспорт», а реальная обработка данных происходит через ОбработкаОповещения. Это позволяет более гибко управлять логикой приложения. Рассмотрим пример, как это может выглядеть в современных конфигурациях:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Система БПО генерирует событие "ScanBarcode" после обработки внешнего события
Если ИмяСобытия = "ScanBarcode" Тогда
// Параметр содержит структуру с данными
Штрихкод = Параметр.Данные;
ТипШтрихкода = Параметр.ТипШтрихкода;
Сообщить("Успешно получено через оповещение: " + Штрихкод);
КонецЕсли;
КонецПроцедуры
Использование этого метода считается более правильным в рамках экосистемы 1С, так как он позволяет централизованно обрабатывать данные, прошедшие через предварительные проверки драйвера.
Если штрихкод не выводится, пройдите по следующим шагам:
ВнешнееСобытие действительно назначена в свойствах формы (в палитре свойств на закладке «События»).Таким образом, мы рассмотрели полный цикл работы со сканером: от программного подключения до обработки полученных данных. Данный шаблон кода является универсальным для большинства современных конфигураций на платформе 1С:Предприятие 8.3.