При разработке конфигураций на обычных формах (Толстый клиент) программисты часто сталкиваются с проблемой: современные сканеры штрихкода в режиме «в разрыв клавиатуры» просто печатают символы в активное поле ввода, не вызывая при этом процедуру ОбработкаВнешнегоСобытия. В типовых решениях на управляемых формах (например, УТ 11 или Розница 2) эта задача решена с помощью Библиотеки подключаемого оборудования (БПО). Однако в самописных конфигурациях «с нуля» нам необходимо реализовать этот механизм самостоятельно. В данной статье мы подробно разберем, как заставить 1С перехватывать клавиатурный ввод сканера и обрабатывать его как полноценное внешнее событие.
Для начала проанализируем разницу в подходах. Старый драйвер ScanOPOS.dll изначально проектировался для работы с физическими или виртуальными COM-портами. Чтобы работать с ним в режиме клавиатуры, требовались сторонние драйверы-эмуляторы. Современный стандарт 1С — NativeApi (компонента AddIn.InputDevice) — обладает уникальной способностью: он умеет анализировать поток символов, поступающих от клавиатуры. Если символы приходят с очень высокой скоростью (что характерно для сканера), драйвер «перехватывает» их, не дает напечатать в активное поле и вместо этого генерирует внешнее событие в 1С. Это именно то, что нам нужно для комфортной работы без использования эмуляции COM-портов.
Чтобы наше решение не зависело от путей к файлам на конкретном компьютере (вроде C:\Program Files...), мы поместим драйвер непосредственно в конфигурацию. Рассмотрим, как это сделать правильно:
Внешняя компонента. Назовем его, например, ДрайверСканераNative.Scanner1C.zip или BarcodeScanner_Native.dll, который можно извлечь из типовой конфигурации или папки установленного драйвера 1С).Теперь компонента всегда будет «путешествовать» вместе с нашей информационной базой.
Для того чтобы сканер работал во всех формах программы, объект драйвера должен «жить» на протяжении всего сеанса работы пользователя. Проанализируем процесс подключения. Нам необходимо объявить глобальную переменную и инициализировать ее при старте системы.
В модуле Обычного приложения пропишем следующий код:
Перем глСканер Экспорт;
Процедура ПриНачалеРаботыСистемы()
// Пытаемся подключить компоненту из макета
РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверСканераNative", "Scanner", ТипВнешнейКомпоненты.Native);
Если РезультатПодключения Тогда
Попытка
// Создаем объект драйвера. Для Native-версии программный идентификатор обычно AddIn.Scanner.BarcodeScanner
// или AddIn.InputDevice в зависимости от версии драйвера.
глСканер = Новый("AddIn.Scanner.BarcodeScanner");
// Настраиваем основные параметры
// 0 - обычно означает автоматический поиск или клавиатуру в Native-драйверах
// Но в современных версиях лучше использовать установку через параметры
глСканер.УстройствоВключено = Истина;
// Если требуется специфическая настройка через XML
НастройкиXML = глСканер.ПолучитьПараметры();
// Здесь можно программно модифицировать XML, установив Port = 31 (Клавиатура)
// и Timeout (Чувствительность клавиатуры) = 50-100 мс.
Сообщить("Сканер штрихкода успешно подключен (NativeApi)");
Исключение
Сообщить("Ошибка при создании объекта сканера: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не удалось загрузить внешнюю компоненту сканера!");
КонецЕсли;
КонецПроцедуры
Разберем критически важный момент: как драйвер отличает сканер от пользователя, который быстро печатает? За это отвечает параметр Таймаут (или Чувствительность). Если пауза между символами меньше, например, 30 миллисекунд, драйвер считает это вводом со сканера. Если вы столкнулись с тем, что штрихкод «пролетает» мимо события и печатается в поле ввода, нужно уменьшить или увеличить этот порог в настройках компоненты.
Также крайне важно настроить Суффикс. Большинство сканеров Honeywell по умолчанию посылают символ Enter (код 13) в конце штрихкода. Драйвер 1С должен знать об этом, чтобы понять, где заканчивается один штрихкод и начинается другой. Выясним это значение и установим его в коде или через форму настроек.
// Пример установки параметров через методы драйвера
глСканер.УстановитьПараметр("Port", 31); // 31 - код клавиатурного порта в некоторых версиях NativeApi
глСканер.УстановитьПараметр("Suffix", 13); // Суффикс CR (Enter)
глСканер.УстановитьПараметр("Timeout", 75); // Чувствительность в мс
Теперь, когда драйвер активен и «слушает» клавиатурный поток, нам нужно принять данные в форме. В обычных формах для этого используется предопределенная процедура ОбработкаВнешнегоСобытия. Посмотрим на пример реализации в форме документа или списка:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Проверяем, что событие пришло именно от нашего сканера
// Источник - это имя, которое мы могли присвоить при подключении
// Событие для сканера обычно называется "BarCodeValue"
Если Событие = "BarCodeValue" Тогда
Штрихкод = СокрЛП(Данные);
// Вызываем функцию поиска товара по штрихкоду
ОбработатьСканирование(Штрихкод);
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьСканирование(Штрихкод)
// Ваша логика поиска номенклатуры и добавления в табличную часть
Сообщить("Считан штрихкод: " + Штрихкод);
КонецПроцедуры
Рассмотрим типичные ситуации, которые могут помешать корректной работе:
Alt+NumPad (через сервисные коды из инструкции Honeywell), тогда он будет передавать корректные цифры независимо от языка.Если по каким-то причинам NativeApi не удается запустить в вашей версии платформы, проанализируем вариант из сообщения №2 темы. Он использует COM-объект AddIn.Scanner. Этот метод более капризен к настройкам «разрыва клавиатуры», но также жизнеспособен, если использовать Порт = 0.
// Упрощенный пример для старой ScanOPOS.dll
Попытка
ЗагрузитьВнешнююКомпоненту("ScanOPOS.dll");
ОбъектДрайвера = Новый("AddIn.Scanner");
ОбъектДрайвера.Порт = 0; // Режим клавиатуры
ОбъектДрайвера.УстройствоВключено = 1;
ОбъектДрайвера.ПосылкаДанных = 1;
Исключение
// Обработка ошибки
КонецПопытки;
Важный момент: Для старой ScanOPOS.dll в режиме клавиатуры часто требуется, чтобы префикс и суффикс были настроены крайне точно, иначе внешнее событие просто не сработает. Современный NativeApi гораздо гибче и стабильнее работает с USB-сканерами Honeywell, работающими в режиме эмуляции клавиатуры (HID Keyboard).
Подводя итог, мы видим, что для реализации функционала «как в УТ 11» на обычных формах достаточно правильно интегрировать Native-компоненту и корректно настроить параметры таймаута и суффикса. Это позволяет избежать устаревшего метода с F7 и лишних кликов пользователя, делая работу со сканером бесшовной и быстрой.