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

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

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

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

Выясним причину проблемы: почему не срабатывает событие в форме

Разберем типичную ситуацию: в МодульУправляемогоПриложения добавлен код загрузки внешней компоненты AddIn.Scanner, драйвер успешно загружен, параметры префикса и суффикса установлены, но при считывании штрихкода процедура ВнешнееСобытие в открытой форме документа не вызывается.

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

Настройка Модуля управляемого приложения

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

В начале модуля объявляем переменную драйвера и описываем процедуру подключения при старте системы:


&НаКлиенте
Перем Драйвер Экспорт;

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

Критически важный шаг: добавление процедуры ОбработкаВнешнегоСобытия в МодульУправляемогоПриложения. Именно она перехватывает сигнал от драйвера и позволяет платформе передавать его в активные формы.


&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    // Данная процедура принимает событие от драйвера 
    // и обеспечивает его прохождение в открытые формы
КонецПроцедуры

&НаКлиенте
Процедура ПередЗавершениемРаботыСистемы(Отказ)
    Если Драйвер <> Неопределено Тогда 
        Драйвер.УстройствоВключено = 0;
        Драйвер.Освободить();
        Драйвер.Отсоединить();
    КонецЕсли;
КонецПроцедуры

Настройка формы документа или справочника

После того как глобальный обработчик приложения настроен, событие начинает поступать в открытые формы. Настроим прием штрихкода в форме документа:

  1. Откроем форму документа в конфигураторе.
  2. В палитре свойств формы найдем событие ВнешнееСобытие и создадим его обработчик.
  3. В созданном обработчике напишем логику поиска и добавления номенклатуры.

Посмотрим на пример кода в модуле формы:


&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    Если Источник = "Сканер штрихкода" И Событие = "ПолученШтрихкод" Тогда
        ОбработатьШтрихкодНаСервере(СокрЛП(Данные));
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура ОбработатьШтрихкодНаСервере(СчитанныйШтрихкод)
    
    // Логика поиска номенклатуры по штрихкоду и добавления в табличную часть
    // Например: НайтиНоменклатуруПоШтрихкоду(СчитанныйШтрихкод);
    
КонецПроцедуры

Особенности работы через RDP и альтернативные подходы

При работе сканера в режиме эмуляции клавиатуры в терминальном сеансе (RDP) могут возникать задержки и искажения символов из-за текущей раскладки клавиатуры на клиенте. Чтобы повысить надежность работы оборудования, проанализируем следующие рекомендации:

  1. Перевод сканера в режим эмуляции COM-порта (Virtual COM): Это наиболее стабильный способ работы в RDP. Сканер переводится в режим виртуального последовательного порта с помощью управляющих штрихкодов из инструкции к сканеру. После этого порт пробрасывается в RDP-сессию, а в 1С подключение выполняется к конкретному номеру COM-порта.
  2. Использование драйверов Native API или БПО: Старая компонента AddIn.Scanner (ScanOPOS) является 32-битным ActiveX-объектом и не работает в 64-битных клиентах 1С. Для современных конфигураций рекомендуется использовать 1С:Библиотеку подключаемого оборудования (БПО) и Native API драйверы, работающие независимо от разрядности платформы.
  3. Использование назначенных горячих клавиш: Если установить внешнюю компоненту невозможно, сканер программируют на добавление префикса (например, клавиши F7). В форме создается команда с горячей клавишей F7, которая открывает диалог ввода строки методом ПоказатьВводСтроки.
← На главную