Почему не срабатывает процедура ВнешнееСобытие при сканировании штрихкода в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При подключении сканеров штрихкодов к конфигурациям на обычных формах (например, «1С:Управление торговлей 10.3») разработчики и системные администраторы нередко сталкиваются со следующей ситуацией: сканер успешно переведен в режим эмуляции COM-порта, драйвер установлен, встроенный тест оборудования в параметрах 1С видит считанный код, однако при открытии рабочего документа или справочника процедура ВнешнееСобытие не вызывается. Разберем по шагам причины такого поведения платформы и внешних компонент, а также рассмотрим практические способы решения этой проблемы.

Причина 1. Ограничение драйверов и выбор номера COM-порта

Проанализируем распространенную техническую особенность старых внешних компонент (включая классическую ScanOPOS.dll и смежные драйверы торгового оборудования). Ранние версии компонент некорректно обрабатывали порты с номерами выше COM4 (а иногда и выше COM3), если имя порта передавалось драйверу в стандартном виде. Даже если в мастере настроек оборудования порт опрашивался успешно, при передаче управления обработчикам событий рабочая форма не могла корректно зарегистрировать прослушивание порта.

Для исправления ситуации выполним переназначение номера порта в операционной системе:

  1. Откроем Диспетчер устройств Windows и перейдем в ветку Порты (COM и LPT).
  2. Найдем виртуальный COM-порт сканера (например, Honeywell/Metrologic USB Serial Port).
  3. Откроем его свойства, перейдем на вкладку Параметры порта и нажмем кнопку Дополнительно.
  4. В поле Номер COM-порта принудительно выберем минимальный свободный номер — COM1 или COM2. Если они заняты устаревшими системными ресурсами, освободим их или назначим COM3.
  5. Сохраним изменения и выставим точно такой же номер порта в настройках торгового оборудования в самой 1С.

Причина 2. Несовпадение суффиксов и префиксов передачи данных

Рассмотрим следующую частую проблему: драйвер торгового оборудования 1С ожидает конкретный завершающий символ (суффикс), по которому внешняя компонента определяет окончание считывания штрихкода. Если сканер передает последовательность CR (код 13) и LF (код 10), а в конфигурации 1С задан только суффикс CR или суффиксы отключены вовсе, генерации внешнего события не произойдет.

Выполним проверку и синхронизацию настроек:

  1. Проверим текущие настройки суффикса в таблице торгового оборудования 1С. Для стандартной эмуляции COM-порта суффиксом чаще всего выступает символ перевода каретки (код 13).
  2. Сверим параметры сканера: с помощью настроечной таблицы штрихкодов из руководства к устройству убедимся, что суффикс LF отключен, либо добавим код 10 в список суффиксов драйвера в 1С.
  3. Обратим внимание на таймаут между символами: если в 1С задано значение 75 мс, а сканер работает с задержкой 50 мс, приведем параметры к единому стабильному интервалу (рекомендуется от 50 до 100 мс).

Причина 3. Программное подключение торгового оборудования к форме

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

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


Процедура ПриОткрытии()
    // Подключаем форму к обработке событий торгового оборудования
    ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);
КонецПроцедуры

Процедура ПриЗакрытии()
    // Обязательно отключаем клиента для освобождения порта
    ПолучитьСерверТО().ОтключитьКлиента(ЭтаФорма);
КонецПроцедуры

Кроме того, типовой механизм торгового оборудования выполняет опрос формы на предмет поддерживаемых типов устройств. Если в модуле формы отсутствует функция ПоддерживаетсяВидТО, система проигнорирует регистрацию слушателя событий:


Функция ПоддерживаетсяВидТО(Вид) Экспорт
    Возврат Вид = Перечисления.ВидыТорговогоОборудования.СканерШтрихКода;
КонецФункции

Причина 4. Привязка события в палитре свойств формы

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

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

Процедура ВнешнееСобытие(Источник, Событие, Данные)
    // Проверяем тип события и обрабатываем штрихкод
    Если Не РаботаСТорговымОборудованием.ПроверитьСобытиеТО(Источник, Событие, Данные) Тогда
        Возврат;
    КонецЕсли;

    ОбработатьШтрихкод(Данные);
КонецПроцедуры

Альтернативные способы подключения устройства

Если специфика виртуального COM-порта вызывает сбои или не удается настроить работу через внешнюю компоненту, рассмотрим альтернативные варианты подключения:

  1. Режим эмуляции клавиатуры (USB HID) с префиксом: переведем сканер в стандартный клавиатурный режим по инструкции производителя и запрограммируем префикс клавиши F7 вместе с суффиксом Enter. В этом случае при чтении штрихкода 1С автоматически будет вызывать стандартное диалоговое окно поиска по штрихкоду без необходимости использования COM-порта.
  2. Использование драйвера клавиатурного перехвата: подключим сканер как USB-клавиатуру, но установим драйвер 1С с поддержкой перехвата ввода (Keyboard Hook). Драйвер анализирует скорость поступления символов, распознает считывание штрихкода и генерирует штатное ВнешнееСобытие.
← На главную