Как подключить сканер штрихкода к управляемым формам 1С и настроить Внешнее событие

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

Подключение торгового оборудования, в частности сканеров штрихкода, к управляемым формам 1С (тонкий клиент) часто вызывает затруднения у разработчиков. Основная проблема заключается в том, что сканер, работающий в режиме эмуляции клавиатуры, успешно передает данные в текстовые редакторы (например, Блокнот), но не инициирует ВнешнееСобытие в самой платформе 1С. В этой статье мы подробно разберем, как правильно инициализировать драйвер, какие свойства объекта необходимо настроить и на что обратить внимание в свойствах формы.

Анализ механизма работы сканера в режиме эмуляции клавиатуры

Для начала разберем ситуацию: сканер подключен к USB-порту и настроен как клавиатурное устройство. Это означает, что при считывании кода он просто «печатает» символы с очень высокой скоростью. Чтобы 1С восприняла этот поток символов не как ручной ввод пользователя, а как программное событие, используется специальная внешняя компонента (например, ScanOpos.dll от 1С или драйверы АТОЛ).

Рассмотрим основные шаги, которые необходимо выполнить для того, чтобы платформа «подхватила» устройство:

  1. Регистрация библиотеки в операционной системе (через regsvr32).
  2. Подключение компоненты в коде 1С.
  3. Инициализация объекта драйвера и установка его параметров.
  4. Настройка обработчика события в метаданных формы.

Программная инициализация драйвера в управляемом приложении

Выясним, какой код необходим для корректного запуска драйвера. Важно понимать, что объект драйвера должен быть доступен на протяжении всей работы с формой, поэтому его часто объявляют как переменную модуля или хранят в экспортной переменной модуля управляемого приложения.

Посмотрим на пример инициализации драйвера АТОЛ (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 и ПосылкаДанных часто являются решающими для корректной работы старых версий библиотек АТОЛ в среде управляемого приложения.

Почему не срабатывает Внешнее событие: чек-лист

Если код написан, компонента загружена, но точка останова в процедуре ВнешнееСобытие не срабатывает, проверим следующие моменты:

  1. Свойства формы: Перейдите в конфигуратор, откройте форму обработки, найдите список событий. Убедитесь, что в строке Внешнее событие не просто написано имя процедуры, а выбрана соответствующая процедура из модуля формы. Это создает связь в метаданных.
  2. Чувствительность: В настройках драйвера (через тест устройства) проверьте параметр «Чувствительность». Это время в миллисекундах, в течение которого драйвер «ждет» следующий символ. Если символы от сканера идут слишком медленно, драйвер может принять их за обычный ввод с клавиатуры.
  3. Права доступа: Для корректной работы клавиатурных хуков (перехвата ввода) в ОС Windows иногда требуется запуск 1С от имени администратора.
  4. Разрядность: Помните, что 32-битные DLL (ScanOpos.dll) не будут работать в 64-битном тонком клиенте 1С. Проверьте разрядность вашего приложения.

Обработка полученных данных

Разберем, как должна выглядеть процедура обработки события. После того как драйвер успешно перехватил штрихкод, он передает управление в 1С:


&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    // Источник — это идентификатор устройства
    // Событие — обычно "Barcode" или имя, заданное в драйвере
    // Данные — считанный штрихкод
    
    Если Событие = "Barcode" Тогда
        Штрихкод = СокрЛП(Данные);
        // Вызываем серверную процедуру для поиска товара
        ОбработатьШтрихкодНаСервере(Штрихкод);
    КонецЕсли;
    
    // Важно: после обработки события нужно снова включить устройство, 
    // если в настройках стоит автовыключение
    ОбъектДрайвера.ПосылкаДанных = 1;
    
КонецПроцедура

Рассмотрим подробнее параметр Источник. В типовых конфигурациях (БПО) используется сложная система идентификации, но в самописной конфигурации достаточно проверить, что Данные содержат ожидаемую строку. Если вы используете современную «Библиотеку подключаемого оборудования» (БПО), рекомендуется использовать встроенные методы МенеджерОборудованияКлиент.ПодключитьОборудованиеПриНачалеРаботыСистемы(), которые автоматизируют весь процесс инициализации.

Использование NativeAPI (современный подход)

Если использование старой компоненты AddIn.Scaner45 вызывает постоянные проблемы, проанализируем альтернативу. Фирма 1С поставляет современный драйвер 1С:Сканер штрихкода, работающий по технологии NativeAPI (ProgID: AddIn.InputDevice).

Его преимущества:

Для перехода на NativeAPI достаточно изменить ProgID в коде и настроить параметры согласно документации к БПО. В большинстве случаев это решает проблемы с «пропаданием» событий и несовместимостью с новыми версиями Windows.

Таким образом, мы выяснили, что для успешного подключения сканера к управляемым формам необходимо не только написать код инициализации, но и обеспечить соответствие аппаратных настроек (суффиксов) программным ожиданиям драйвера, а также правильно связать событие в свойствах формы.

← На главную