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

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

Ситуация, когда сканер штрихкодов корректно считывает данные в блокнот или терминал (например, Putty), успешно проходит тесты в настройках торгового оборудования 1С, но при этом в самой форме «ВнешнееСобытие» не вызывается, является классической проблемой при настройке торгового оборудования. Особенно часто это встречается в конфигурациях на обычных формах, таких как Управление торговлей 10.3.

В данной статье мы разберем причины этой проблемы и пошагово рассмотрим способы её решения — от настройки самого «железа» до написания программного кода в модуле формы.

Разберем механизм работы «Внешнего события»

Для начала проанализируем ситуацию: почему в тесте 1С данные отображаются, а в вашей обработке — нет? Драйвер торгового оборудования генерирует событие в операционной системе, которое платформа 1С должна перехватить и передать в активную форму. Если форма «не знает», что ей нужно слушать это событие, или если драйвер не передает специальный сигнал завершения (суффикс), событие не будет обработано модулем.

Шаг 1: Проверка настройки суффикса сканера

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

  1. Откройте настройки торгового оборудования в 1С.
  2. Перейдите в параметры вашего сканера.
  3. Убедитесь, что в поле «Суффикс» указано значение 13 (CR).
  4. Если в тесте сканера вы видите, что штрихкод выводится, но после него нет переноса строки или специальной пометки 'CR', необходимо запрограммировать сам сканер.

Для модели Honeywell 1400g программирование осуществляется путем считывания специального штрихкода из инструкции. Найдите в мануале раздел «Add CR Suffix» (Добавить суффикс возврата каретки) и отсканируйте его. Это заставит сканер добавлять символ с кодом #13 в конце каждого считанного кода, что и является триггером для возникновения внешнего события в драйвере.

Шаг 2: Программное подключение оборудования в форме

Если в типовых формах (например, в «Чеке ККМ») сканер работает, а в вашей новой обработке — нет, значит, проблема в инициализации оборудования в коде формы. Рассмотрим подробнее, как это реализовано в УТ 10.3 на обычных формах.

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


Процедура ПриОткрытии()
    // Подключаем сканер штрихкода
    Если ПолучитьСерверТО().ПодключитьОбъект(СканерШтрихКода, ИмяТипа, Параметры) Тогда
        // Оборудование подключено успешно
    Иначе
        Сообщить("Не удалось подключить сканер штрихкода!");
    КонецЕсли;
КонецПроцедуры

При закрытии формы крайне важно освободить порт, чтобы другие формы или приложения могли им воспользоваться:


Процедура ПриЗакрытии()
    // Отключаем оборудование, чтобы освободить COM-порт
    ПолучитьСерверТО().ОтключитьОбъект(СканерШтрихКода);
КонецПроцедуры

Обратите внимание, что без вызова метода ПодключитьОбъект платформа не будет направлять данные от драйвера в процедуру ВнешнееСобытие конкретной формы.

Шаг 3: Проверка доступности ввода и фокуса формы

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


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

    // Далее идет стандартная обработка события
    // ...
КонецПроцедуры

Иногда помогает принудительный вызов ЭтаФорма.Активизировать() в обработчике ПриОткрытии, чтобы гарантировать, что форма готова принимать сообщения от драйверов.

Шаг 4: Выбор компоненты (NativeApi vs ScanOpos)

Проанализируем используемую компоненту. Если вы используете старый драйвер ScanOpos, попробуйте переключиться на 1С:Сканер штрихкода (NativeApi). Современные компоненты NativeApi работают более стабильно с очередью сообщений Windows и лучше обрабатывают прерывания от USB-COM портов.

При использовании NativeApi важно проверить:

Шаг 5: Нюансы системных настроек порта

Выясним причины на уровне операционной системы. Даже если Putty показывает данные, 1С более чувствительна к настройкам таймингов и управления потоком. Рассмотрим параметры COM-порта в Диспетчере устройств Windows:

  1. Найдите ваш Honeywell 1400g в разделе «Порты (COM и LPT)».
  2. Зайдите в «Свойства» -> «Параметры порта».
  3. Установите «Управление потоком» в значение Нет (None).
  4. Убедитесь, что скорость (бит в секунду) совпадает с той, что указана в настройках 1С (обычно 9600).

Также стоит проверить параметры энергосбережения USB. В свойствах USB-концентратора, к которому подключен сканер, снимите галочку «Разрешить отключение этого устройства для экономии энергии». Это предотвратит ситуацию, когда сканер «засыпает» и первое сканирование после простоя уходит «в никуда».

Подведем итоги

Для того чтобы сканер Honeywell 1400g стабильно генерировал внешнее событие в 1С, необходимо соблюдение трех условий:

  1. Сканер физически настроен на передачу суффикса #13 (CR).
  2. В коде формы 1С прописана инициализация (подключение) объекта торгового оборудования.
  3. COM-порт захвачен компонентой монопольно, и форма является активной в момент сканирования.

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

← На главную