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

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

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

Выбор технологии и внешней компоненты

Прежде всего, проанализируем доступные варианты драйверов. Существует два основных стандарта внешних компонент: COM и NativeAPI. Для современных управляемых приложений, особенно если предполагается работа через веб-клиент или в операционных системах, отличных от Windows, крайне рекомендуется использовать технологию NativeAPI. Однако на практике часто применяются проверенные временем драйверы от «1С» (ScanOPOS) или старые бесплатные версии драйверов «АТОЛ» (версия 6.x).

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

Подготовка структуры конфигурации

Для реализации механизма нам понадобятся следующие объекты:

  1. Общий макет: создадим макет с типом «Внешняя компонента», в который загрузим архив с драйвером (например, ScannerNVT.zip для NativeAPI или ScanOPOS.dll).
  2. Модуль управляемого приложения: здесь мы объявим глобальную переменную для хранения объекта драйвера.
  3. Общий модуль: в нем разместим процедуры инициализации и настройки параметров.

Объявим переменную в модуле управляемого приложения:

Перем ДрайверСканШК Экспорт; // Объект драйвера сканера

Асинхронное подключение компоненты

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

В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы вызовем инициализацию:


&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    ПодключитьСканерАсинхронно();
КонецПроцедуры

Рассмотрим реализацию самой функции подключения. Мы будем использовать метод НачатьПодключениеВнешнейКомпоненты, который требует указания процедуры-обработчика завершения:


&НаКлиенте
Процедура ПодключитьСканерАсинхронно()
    Оповещение = Новый ОписаниеОповещения("ЗавершитьПодключениеКомпоненты", ЭтотОбъект);
    НачатьПодключениеВнешнейКомпоненты(Оповещение, "ОбщийМакет.ДрайверСканера1С", "Scanner");
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьПодключениеКомпоненты(Результат, ДополнительныеПараметры) Экспорт
    Если Результат Тогда
        ДрайверСканШК = Новый("AddIn.Scanner.Scanner");
        // Переходим к настройке параметров
        НастроитьСканер();
    Иначе
        Сообщить("Не удалось загрузить внешнюю компоненту сканера!");
    КонецЕсли;
КонецПроцедуры

Настройка параметров драйвера в асинхронном режиме

После создания объекта драйвера необходимо установить его параметры: порт, скорость, префиксы и суффиксы. Проанализируем важный нюанс: при использовании NativeAPI и асинхронного режима обычное присваивание свойств (например, ДрайверСканШК.Port = 0) может не срабатывать. Вместо этого используются специальные методы установки параметров.

Рассмотрим пример настройки сканера, работающего в режиме «Клавиатура»:


&НаКлиенте
Процедура НастроитьСканер()
    // Устанавливаем режим работы
    // 0 - Клавиатура, остальные значения обычно соответствуют COM-портам
    ДрайверСканШК.УстановитьПараметр("Port", 0); 
    
    // Суффикс (обычно это символ перевода строки Enter - код 13)
    ДрайверСканШК.УстановитьПараметр("Suffix", 13);
    
    // Чувствительность (Timeout) - критично для режима клавиатуры
    // Это время ожидания между приходом символов штрихкода
    ДрайверСканШК.УстановитьПараметр("Timeout", 75); 
    
    // Включаем устройство
    ДрайверСканШК.DeviceEnabled = Истина;
    ДрайверСканШК.DataEventEnabled = Истина; // Разрешаем генерацию событий
КонецПроцедуры

Обработка события в формах

Чтобы данные со сканера попадали в форму документа или справочника, необходимо правильно настроить обработчик события. В управляемых формах процедура ВнешнееСобытие не создается автоматически по имени, как в 7.7. Ее необходимо назначить в свойствах самой формы.

Выполним следующие действия в редакторе формы:

  1. Откроем свойства формы.
  2. Найдем событие «Внешнее событие».
  3. Нажмем на лупу, чтобы создать процедуру-обработчик на клиенте.

Пример кода обработки события:


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

Важный момент: Если сканер работает в режиме эмуляции клавиатуры, внешнее событие будет генерироваться только в том случае, если драйвер успевает «перехватить» поток символов. Это зависит от настройки Timeout (Чувствительность). Если штрихкод «выстреливается» в текстовое поле, но событие не срабатывает — попробуйте увеличить или уменьшить этот параметр.

Типичные ошибки при подключении

Проанализируем ситуации, из-за которых сканер может не работать:

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

← На главную