Как подключить беспроводной сканер Mertech CL-2310 P2D к 1С и настроить обработку внешнего события

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

Подключение беспроводного торгового оборудования к самописным конфигурациям 1С часто вызывает трудности у разработчиков. Основная проблема заключается в том, что даже при корректной установке драйверов 1С может «не видеть» данные, поступающие от устройства. В этой статье мы подробно разберем, как подключить сканер Mertech CL-2310 P2D, используя режим эмуляции COM-порта, проанализируем программный код для работы с компонентой Scanopos и выясним, почему может не срабатывать стандартное ВнешнееСобытие.

Механика работы сканера в режиме COM-порта

Прежде чем переходить к написанию кода, давайте разберем, как физически и логически данные попадают из сканера в 1С. Модель Mertech CL-2310 является беспроводной и передает данные на базовую станцию (или через Bluetooth), которая подключается к компьютеру. Если вы планируете использовать устройство с мобильными терминалами, вам может быть полезно руководство про подключение сканера Bluetooth в режиме SPP на Android. Для работы через интерфейс RS-232 (или его эмуляцию через USB) на ПК устройство должно быть переведено в соответствующий режим. Это критически важный шаг, так как по умолчанию большинство сканеров работают в режиме эмуляции клавиатуры (HID), где данные просто «печатаются» в активное поле ввода, не вызывая обработчик внешнего события.

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

Программная реализация подключения в 1С

Рассмотрим пример кода для инициализации сканера штрихкодов в самописной конфигурации. Для работы мы будем использовать классическую компоненту AddIn.Scanner (Scanopos). Несмотря на её почтенный возраст, она до сих пор успешно применяется для решения задач в простых конфигурациях на обычных формах.


var obj;

Procedure Open_Form()
    try 
        // Программный идентификатор старой компоненты Scanopos
        ПрогИД = "AddIn.Scanner";
        // Пытаемся подключить компоненту в систему
        ПодключитьВнешнююКомпоненту(ПрогИД);
        // Создаем экземпляр объекта
        obj = Новый (ПрогИД);
    except
        Сообщить("Ошибка при загрузке внешней компоненты сканера штрихкода!");
        Возврат;
    endtry;

    if Connect() = 0 then
        Сообщить("Сбой физического подключения сканера к порту");
    endif;
endProcedure

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


Function Connect() 
    // Открываем логическое устройство
    if obj.Open("Сканер штрихкода") <> 0 then
        return 0;    
    endif;

    // Настраиваем параметры COM-соединения
    obj.DataBits = 8;
    obj.Port = 5; // Укажите номер порта из диспетчера устройств
    obj.Speed = 115200;
    obj.StopBits = 0; // 0 соответствует 1 стоповому биту
    
    // Определяем символ завершения сообщения (Suffix)
    // 13 - это код символа CR (Возврат каретки)
    obj.StopChar = 13;
    
    // Имя события, которое будет передано в процедуру ВнешнееСобытие
    obj.EventName = "GetBareCode";

    // Пытаемся захватить устройство (монопольный режим)
    if obj.Claim(1) <> 0 then
        Disconnect();
        return 0;    
    endif;    

    // Активируем устройство и включаем генерацию событий
    obj.DeviceEnabled = 1;
    obj.DataEventEnabled = 1; 
    obj.DecodeData = 1; // Указываем компоненте самостоятельно декодировать данные
    
    // Очищаем буферы
    obj.ClearInput();
    obj.ClearOutput();

    if obj.DeviceEnabled <> 1 then
        Disconnect();
        return 0;
    endif;

    return 1;    
endFunction

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

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

1. Отсутствие суффикса в настройках сканера.
Это самая частая причина. Внешняя компонента 1С ожидает специальный управляющий символ (обычно CR с кодом 13 или LF с кодом 10), который сигнализирует о завершении передачи пакета данных. Если сканер настроен на передачу только «голого» штрихкода, компонента будет бесконечно ждать окончания строки, и событие в 1С не возникнет. Для решения этой проблемы необходимо отсканировать из мануала Mertech штрихкод "Add Suffix CR+LF".

2. Конфликт версий и разрядности.
Старая компонента Scanopos является 32-битной. Если вы используете 64-битный клиент 1С, она просто не сможет загрузиться. В этом случае необходимо либо переходить на 32-битный клиент, либо использовать современный NativeApi драйвер.

3. Неверная привязка обработчика в форме.
Убедитесь, что в свойствах формы в поле «Внешнее событие» действительно выбрана соответствующая процедура. Проверьте правильность параметров: Источник, Событие, Данные. Пример обработки полученных данных:


Procedure GetBareCode(Источник, Событие, Данные)
    // Проверяем, что событие пришло именно от нашего сканера
    Если Событие = "GetBareCode" Тогда
        Сообщить("Получен штрихкод: " + Данные);
        // Здесь можно вызвать поиск товара в справочнике
    КонецЕсли;
endProcedure

Современный подход: Использование NativeApi драйверов

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

Посмотрим на пример подключения через современный драйвер 1С:


// Загрузка компоненты из макета или из файла
Если Не ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверСканера", "InputDevice", ТипВнешнейКомпоненты.Native) Тогда
    УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверСканера");
    ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверСканера", "InputDevice", ТипВнешнейКомпоненты.Native);
Конецесли;

глСканер = Новый("AddIn.InputDevice.InputDevice");
// Настройка параметров через универсальный метод
глСканер.УстановитьПараметр("Port", 0); // 0 для USB-HID или номер порта для COM
глСканер.УстановитьПараметр("Suffix", 13);
глСканер.УстановитьПараметр("Timeout", 60);
глСканер.Подключить("СканерШтрихкода");

Особенности работы с Mertech CL-2310 P2D и маркировкой

Поскольку Mertech CL-2310 P2D — это 2D-сканер, его часто используют для работы с системой «Честный ЗНАК» (для этого пригодится готовое решение для работы с маркировкой Честный Знак). В современных условиях критически важно правильно реализовать разрешительный режим на кассах для онлайн-проверки марок. Проанализируем нюансы, которые могут возникнуть при сканировании Data Matrix:

Подводя итог, можно сказать: для стабильной работы Mertech CL-2310 в 1С важно обеспечить наличие суффикса в самом устройстве и корректно настроить параметры внешней компоненты. Если вы проектируете новую систему, настоятельно рекомендуем отказаться от Scanopos в пользу современных драйверов NativeApi, входящих в состав типовых конфигураций 1С.

← На главную