При разработке собственных конфигураций на управляемых формах часто возникает необходимость подключить торговое оборудование, в частности сканеры штрихкодов. Если сканер работает в режиме разрыва клавиатуры (эмуляция ввода с клавиатуры), прямой ввод в реквизиты формы может вызывать проблемы: сбивается фокус ввода, меняется раскладка клавиатуры или происходят разрывы передачи символов при работе через терминальный сервер (RDP).
Для решения этой проблемы перехват данных от сканера организуют через внешнюю компоненту и обработчик событий. Рассмотрим подробнее, как правильно инициализировать драйвер сканера и почему внешнее событие может не доходить до формы документа.
Разберем типичную ситуацию: в МодульУправляемогоПриложения добавлен код загрузки внешней компоненты AddIn.Scanner, драйвер успешно загружен, параметры префикса и суффикса установлены, но при считывании штрихкода процедура ВнешнееСобытие в открытой форме документа не вызывается.
Проанализируем механизм обработки событий платформой 1С. Когда внешняя компонента генерирует событие, платформа 1С сначала ищет его обработчик на уровне приложения. Если в МодульУправляемогоПриложения отсутствует процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные), цепочка вызовов прерывается, и событие не передается дальше в активную форму документа.
Рассмотрим по шагам, какой код необходимо добавить в МодульУправляемогоПриложения для успешной инициализации внешней компоненты и трансляции событий.
В начале модуля объявляем переменную драйвера и описываем процедуру подключения при старте системы:
&НаКлиенте
Перем Драйвер Экспорт;
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
Попытка
ПрогИД = "AddIn.Scanner";
ПодключитьВнешнююКомпоненту(ПрогИД);
Драйвер = Новый (ПрогИД);
Исключение
Сообщить("Невозможно подключить внешнюю компоненту сканера!");
Возврат;
КонецПопытки;
Если Драйвер.Подсоединить("Сканер штрихкода") <> 0 Тогда
Сообщить("Ошибка при подключении устройства!");
Возврат;
КонецЕсли;
// Настройки порта и параметров события
Драйвер.БитДанных = 8;
Драйвер.Порт = 0; // 0 - клавиатура
Драйвер.СтопСимвол = 13; // CR (Carriage Return)
// Настройка префикса (например, знак "(" с кодом 40)
Драйвер.Префикс = 40;
Драйвер.ПрефиксСтрока = "(";
Драйвер.ИмяСобытия = "ПолученШтрихкод";
Если Драйвер.Занять(1) = 0 Тогда
Драйвер.УстройствоВключено = 1;
Драйвер.ПосылкаДанных = 1;
Драйвер.ОчиститьВход();
Драйвер.ОчиститьВыход();
Иначе
Драйвер.Освободить();
Драйвер.Отсоединить();
Сообщить("Не удалось занять устройство!");
КонецЕсли;
КонецПроцедуры
Критически важный шаг: добавление процедуры ОбработкаВнешнегоСобытия в МодульУправляемогоПриложения. Именно она перехватывает сигнал от драйвера и позволяет платформе передавать его в активные формы.
&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Данная процедура принимает событие от драйвера
// и обеспечивает его прохождение в открытые формы
КонецПроцедуры
&НаКлиенте
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Если Драйвер <> Неопределено Тогда
Драйвер.УстройствоВключено = 0;
Драйвер.Освободить();
Драйвер.Отсоединить();
КонецЕсли;
КонецПроцедуры
После того как глобальный обработчик приложения настроен, событие начинает поступать в открытые формы. Настроим прием штрихкода в форме документа:
ВнешнееСобытие и создадим его обработчик.Посмотрим на пример кода в модуле формы:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "Сканер штрихкода" И Событие = "ПолученШтрихкод" Тогда
ОбработатьШтрихкодНаСервере(СокрЛП(Данные));
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьШтрихкодНаСервере(СчитанныйШтрихкод)
// Логика поиска номенклатуры по штрихкоду и добавления в табличную часть
// Например: НайтиНоменклатуруПоШтрихкоду(СчитанныйШтрихкод);
КонецПроцедуры
При работе сканера в режиме эмуляции клавиатуры в терминальном сеансе (RDP) могут возникать задержки и искажения символов из-за текущей раскладки клавиатуры на клиенте. Чтобы повысить надежность работы оборудования, проанализируем следующие рекомендации:
AddIn.Scanner (ScanOPOS) является 32-битным ActiveX-объектом и не работает в 64-битных клиентах 1С. Для современных конфигураций рекомендуется использовать 1С:Библиотеку подключаемого оборудования (БПО) и Native API драйверы, работающие независимо от разрядности платформы.F7). В форме создается команда с горячей клавишей F7, которая открывает диалог ввода строки методом ПоказатьВводСтроки.