Как настроить обработку внешнего события от сканера штрихкодов и различать несколько устройств в 1С

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

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

Почему не срабатывает ВнешнееСобытие: основные причины

Если устройство успешно «пищит» и выдает код в тестовой утилите драйвера, но 1С «молчит», проанализируем состояние системы. Рассмотрим наиболее частые ошибки:

  1. Монопольный захват порта. Если у вас открыто окно теста драйвера или настроек оборудования, оно может захватывать COM-порт. В таком случае 1С не сможет получить доступ к данным. Закройте все сторонние утилиты перед проверкой в 1С.
  2. Отсутствие подписки на событие в форме. В управляемых формах внешнее событие пробрасывается только в активное окно. Проверьте, что в свойствах формы назначена процедура-обработчик ВнешнееСобытие.
  3. Состояние DataEventEnabled. Многие драйверы (например, АТОЛ или ScanOPOS) требуют ручного включения готовности к приему данных. После каждого успешного сканирования драйвер может «засыпать», и его нужно программно «будить», устанавливая свойство DataEventEnabled = 1.
  4. Порядок подключения. Как верно отмечено в обсуждении, сначала нужно программно подключить оборудование в контексте сеанса, и только после этого платформа начнет транслировать события в код.

Вариант 1: Прямое подключение внешней компоненты (без БПО)

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

В модуле управляемого приложения определим переменную и инициализируем её:


Перем ДрайверСканШК Экспорт;

&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    Попытка
        // Подключаем компоненту, например, АТОЛ
        Результат = ПодключитьВнешнююКомпоненту("AddIn.Scaner45");
        Если Результат Тогда
            ДрайверСканШК = Новый("AddIn.Scaner45");
            ДрайверСканШК.OldVersion = 0;
            ДрайверСканШК.AutoDisable = 1; // Автовыключение после получения данных
            ДрайверСканШК.DataEventEnabled = 1; // Включаем ожидание события
        КонецЕсли;
    Исключение
        Сообщить("Не удалось загрузить драйвер сканера!");
    КонецПопытки;
КонецПроцедуры

Затем в форме документа или справочника, где требуется ввод данных, мы перехватываем событие:


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

Вариант 2: Использование БПО (Библиотека подключаемого оборудования)

Для тиражных решений или сложных систем рекомендуется использовать БПО. Это избавляет от необходимости писать низкоуровневый код для каждой модели сканера. Разберем преимущества этого подхода:

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

Идентификация нескольких сканеров: как понять, кто «пикнул»?

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

1. Использование префиксов (Самый надежный способ).

Большинство современных сканеров поддерживают программирование префиксов на уровне «железа». Мы можем настроить сканер №1 так, чтобы он добавлял к коду символы S1_, а сканер №2 — S2_. Тогда в 1С достаточно проанализировать начало строки:


Если Лев(Данные, 3) = "S1_" Тогда
    // Данные от первого участка
    Код = Сред(Данные, 4);
ИначеЕсли Лев(Данные, 3) = "S2_" Тогда
    // Данные от второго участка
    Код = Сред(Данные, 4);
КонецЕсли;

2. Разные экземпляры объектов драйвера.

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

3. Идентификатор устройства в БПО.

В современных версиях БПО при обработке события через МенеджерОборудованияКлиент.ПолучитьДанныеСобытия возвращается структура, в которой есть поле Устройство. Это ссылка на элемент справочника «Подключаемое оборудование». Таким образом, вы можете однозначно определить, какой именно экземпляр сканера из справочника прислал данные.

Технические нюансы работы в терминальном режиме (RDP)

Проанализируем ситуацию, когда 1С запущена на сервере. В этом случае крайне важно:

  1. Пробросить (мапировать) локальные COM-порты пользователя в сессию RDP.
  2. Убедиться, что на сервере установлены драйверы для виртуальных COM-портов, если сканер работает в режиме эмуляции.
  3. В БПО использовать привязку оборудования к «Рабочему месту», которое должно быть уникальным для каждого сочетания «Компьютер + Пользователь ОС».

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

← На главную