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

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

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

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

Режимы работы сканера штрихкодов

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

  1. Режим эмуляции COM-порта (Virtual COM Port / RS-232): В этом режиме устройство передает данные через виртуальный последовательный порт. Для перехвата данных требуется внешняя компонента (драйвер), которая слушает порт и при считывании штрихкода генерирует событие в платформе 1С. В управляемых формах вызывается обработчик ОбработкаВнешнегоСобытия, а в обычных формах — предопределенная процедура ВнешнееСобытие.
  2. Режим эмуляции клавиатуры (USB HID): Сканер определяется системой как обычная клавиатура. При считывании кода он просто последовательно вводит символы в то поле формы, на котором установлен фокус ввода. В этом режиме внешнее событие не генерируется.

Вариант 1. Использование внешней компоненты из БПО или типовых конфигураций

Рассмотрим основной способ работы через генерацию внешних событий. Для этого не требуется переносить всю БПО — достаточно извлечь макет с внешней компонентой (драйвером Native API) из любой типовой конфигурации (например, 1С:Управление торговлей 11 или 1С:Розница) и загрузить его в свою базу.

Разберем по шагам подключение и инициализацию компоненты:

  1. Создадим в дереве метаданных общий макет с типом Двоичные данные и сохраним туда файл внешней компоненты Native API (обычно архив .zip, поддерживающий x86 и x64 архитектуры).
  2. На клиенте выполним подключение внешней компоненты методом ПодключитьВнешнююКомпоненту.
  3. Создадим экземпляр объекта драйвера и вызовем методы инициализации порта.

Посмотрим на пример программного кода подключения компоненты при открытии формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем внешнюю компоненту из общего макета
    РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверСканераШтрихкодов", "СканерNative", ТипВнешнейКомпоненты.Native);
    
    Если РезультатПодключения Тогда
        Попытка
            ОбъектДрайвера = Новый ("AddIn.СканерNative.BarcodeScanner");
            // Инициализация параметров устройства (номер порта, скорость и включение)
            ОбъектДрайвера.УстановитьПараметр("Port", 3); // Номер COM-порта
            ОбъектДрайвера.УстановитьПараметр("Speed", 9600);
            ОбъектДрайвера.Включить(Истина);
        Исключение
            Сообщить("Ошибка инициализации объекта драйвера сканера: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Не удалось подключить внешнюю компоненту сканера.");
    КонецЕсли;
КонецПроцедуры

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


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

Вариант 2. Работа в режиме клавиатуры (USB HID) без внешних компонент

Если нет возможности перевести сканер в режим COM-порта или использовать сторонние компоненты, проанализируем альтернативный вариант работы через режим клавиатуры:

  1. Настроим сканер с помощью служебных штрихкодов из его руководства пользователя на автоматическую отправку управляющего символа в конце строки — суффикса Enter (CR/LF).
  2. Разместим на форме невидимое или выделенное поле ввода строки, например ПолеВводаШтрихкода, и установим флаг ОчищатьПриРедактировании.
  3. В обработчике события ПриИзменении этого поля перехватываем считанный код и выполняем серверную обработку.

&НаКлиенте
Процедура ПолеВводаШтрихкодаПриИзменении(Элемент)
    Если Не ПустаяСтрока(ПолеВводаШтрихкода) Тогда
        СчитанныйШтрихкод = СокрЛП(ПолеВводаШтрихкода);
        ПолеВводаШтрихкода = ""; // Очищаем поле для следующего сканирования
        
        ОбработатьШтрихкодНаСервере(СчитанныйШтрихкод);
    КонецЕсли;
КонецПроцедуры

Интеграция со сторонней СУБД и создание документа

После того как штрихкод перехвачен на клиенте, дальнейшая бизнес-логика (обращение к сторонней СУБД и запись нового документа в 1С) должна выполняться строго на стороне сервера (&НаСервере или &НаСервереБезКонтекста).

Рассмотрим основные способы связи со сторонней СУБД из платформы 1С:

  1. Внешние источники данных: Встроенный механизм платформы 1С:Предприятие 8. С помощью ODBC-драйвера внешняя таблица СУБД (PostgreSQL, MS SQL, MySQL, Oracle) подключается непосредственно в дерево объектов конфигурации. Чтение данных выполняется стандартным языком запросов 1С через объект Запрос.
  2. HTTP-сервисы и REST API: Если у сторонней информационной системы предусмотрен веб-интерфейс, запросы отправляются с использованием объектов HTTPСоединение и HTTPЗапрос. Это кроссплатформенный подход, не зависящий от операционной системы сервера 1С.
  3. Прямое подключение через COM (ADODB): Использование объекта Новый COMОбъект("ADODB.Connection") для прямого выполнения SQL-запросов (работает только в среде Windows).

Посмотрим на пример серверной процедуры, создающей документ на основании полученного кода:


&НаСервереБезКонтекста
Процедура ОбработатьШтрихкодНаСервере(Знач Штрихкод)
    // 1. Получаем данные из сторонней СУБД (например, через внешний источник данных)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТаблицаСУБД.НомерЗаказа КАК НомерЗаказа,
        |   ТаблицаСУБД.Сумма КАК Сумма
        |ИЗ
        |   ВнешнийИсточникДанных.ВнешняяБД.Таблица.Заказы КАК ТаблицаСУБД
        |ГДЕ
        |   ТаблицаСУБД.Штрихкод = &Штрихкод";
    
    Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        // 2. Создаем и заполняем новый документ в 1С
        НовыйДокумент = Документы.ПоступлениеТоваров.СоздатьДокумент();
        НовыйДокумент.Дата = ТекущаяДатаСеанса();
        НовыйДокумент.Комментарий = "Создан по штрихкоду " + Штрихкод + " (Заказ №" + Строка(Выборка.НомерЗаказа) + ")";
        НовыйДокумент.СуммаДокумента = Выборка.Сумма;
        
        НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
КонецПроцедуры

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

← На главную