Подключение торгового оборудования, в частности сканеров штрихкода, к управляемым формам 1С (тонкий клиент) часто вызывает затруднения у разработчиков. Основная проблема заключается в том, что сканер, работающий в режиме эмуляции клавиатуры, успешно передает данные в текстовые редакторы (например, Блокнот), но не инициирует ВнешнееСобытие в самой платформе 1С. В этой статье мы подробно разберем, как правильно инициализировать драйвер, какие свойства объекта необходимо настроить и на что обратить внимание в свойствах формы.
Для начала разберем ситуацию: сканер подключен к USB-порту и настроен как клавиатурное устройство. Это означает, что при считывании кода он просто «печатает» символы с очень высокой скоростью. Чтобы 1С восприняла этот поток символов не как ручной ввод пользователя, а как программное событие, используется специальная внешняя компонента (например, ScanOpos.dll от 1С или драйверы АТОЛ).
Рассмотрим основные шаги, которые необходимо выполнить для того, чтобы платформа «подхватила» устройство:
regsvr32).Выясним, какой код необходим для корректного запуска драйвера. Важно понимать, что объект драйвера должен быть доступен на протяжении всей работы с формой, поэтому его часто объявляют как переменную модуля или хранят в экспортной переменной модуля управляемого приложения.
Посмотрим на пример инициализации драйвера АТОЛ (AddIn.Scaner45) в обработчике события ПриОткрытии на стороне клиента:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ProgID = "AddIn.Scaner45";
// Пытаемся подключить компоненту
Если ПодключитьВнешнююКомпоненту(ProgID) Тогда
ОбъектДрайвера = Новый (ProgID);
// Настройка параметров устройства
ОбъектДрайвера.ДобавитьУстройство();
ОбъектДрайвера.АвтоВыключение = 0;
ОбъектДрайвера.БитыДанных = 3;
ОбъектДрайвера.БлокироватьУстройства = 0;
ОбъектДрайвера.НомерПорта = 100; // 100 обычно соответствует эмуляции клавиатуры
ОбъектДрайвера.Префикс = "";
ОбъектДрайвера.СкоростьОбмена = 7;
ОбъектДрайвера.СтопБиты = 0;
ОбъектДрайвера.Суффикс = "#13"; // Код возврата каретки (Enter)
// Критически важные параметры для активации события
ОбъектДрайвера.OldVersion = 1;
ОбъектДрайвера.ПосылкаДанных = 1;
// Включение устройства
ОбъектДрайвера.УстройствоВключено = 1;
ОбъектДрайвера.УстройствоВключеноПриCтарте = 1;
Сообщить("Сканер успешно подключен!");
Иначе
Сообщить("Не удалось загрузить внешнюю компоненту сканера.");
КонецЕсли;
КонецПроцедура
Проанализируем ключевые параметры. Обратите внимание на свойство Суффикс. Если ваш физический сканер не настроен на отправку символа Enter (код 13) после штрихкода, то драйвер не поймет, где заканчиваются данные, и ВнешнееСобытие не будет вызвано. Также параметры OldVersion и ПосылкаДанных часто являются решающими для корректной работы старых версий библиотек АТОЛ в среде управляемого приложения.
Если код написан, компонента загружена, но точка останова в процедуре ВнешнееСобытие не срабатывает, проверим следующие моменты:
Внешнее событие не просто написано имя процедуры, а выбрана соответствующая процедура из модуля формы. Это создает связь в метаданных.ScanOpos.dll) не будут работать в 64-битном тонком клиенте 1С. Проверьте разрядность вашего приложения.Разберем, как должна выглядеть процедура обработки события. После того как драйвер успешно перехватил штрихкод, он передает управление в 1С:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Источник — это идентификатор устройства
// Событие — обычно "Barcode" или имя, заданное в драйвере
// Данные — считанный штрихкод
Если Событие = "Barcode" Тогда
Штрихкод = СокрЛП(Данные);
// Вызываем серверную процедуру для поиска товара
ОбработатьШтрихкодНаСервере(Штрихкод);
КонецЕсли;
// Важно: после обработки события нужно снова включить устройство,
// если в настройках стоит автовыключение
ОбъектДрайвера.ПосылкаДанных = 1;
КонецПроцедура
Рассмотрим подробнее параметр Источник. В типовых конфигурациях (БПО) используется сложная система идентификации, но в самописной конфигурации достаточно проверить, что Данные содержат ожидаемую строку. Если вы используете современную «Библиотеку подключаемого оборудования» (БПО), рекомендуется использовать встроенные методы МенеджерОборудованияКлиент.ПодключитьОборудованиеПриНачалеРаботыСистемы(), которые автоматизируют весь процесс инициализации.
Если использование старой компоненты AddIn.Scaner45 вызывает постоянные проблемы, проанализируем альтернативу. Фирма 1С поставляет современный драйвер 1С:Сканер штрихкода, работающий по технологии NativeAPI (ProgID: AddIn.InputDevice).
Его преимущества:
regsvr32.Для перехода на NativeAPI достаточно изменить ProgID в коде и настроить параметры согласно документации к БПО. В большинстве случаев это решает проблемы с «пропаданием» событий и несовместимостью с новыми версиями Windows.
Таким образом, мы выяснили, что для успешного подключения сканера к управляемым формам необходимо не только написать код инициализации, но и обеспечить соответствие аппаратных настроек (суффиксов) программным ожиданиям драйвера, а также правильно связать событие в свойствах формы.