Ситуация, когда сканер штрихкодов корректно считывает данные в блокнот или терминал (например, Putty), успешно проходит тесты в настройках торгового оборудования 1С, но при этом в самой форме «ВнешнееСобытие» не вызывается, является классической проблемой при настройке торгового оборудования. Особенно часто это встречается в конфигурациях на обычных формах, таких как Управление торговлей 10.3.
В данной статье мы разберем причины этой проблемы и пошагово рассмотрим способы её решения — от настройки самого «железа» до написания программного кода в модуле формы.
Для начала проанализируем ситуацию: почему в тесте 1С данные отображаются, а в вашей обработке — нет? Драйвер торгового оборудования генерирует событие в операционной системе, которое платформа 1С должна перехватить и передать в активную форму. Если форма «не знает», что ей нужно слушать это событие, или если драйвер не передает специальный сигнал завершения (суффикс), событие не будет обработано модулем.
Самая частая причина отсутствия события — отсутствие или неверная настройка суффикса. Суффикс — это управляющий символ, который сканер отправляет сразу после штрихкода. Для 1С критически важно, чтобы в конце строки приходил символ Возврат каретки (CR), который соответствует коду 13. Выясним, как это проверить и настроить:
13 (CR).Для модели Honeywell 1400g программирование осуществляется путем считывания специального штрихкода из инструкции. Найдите в мануале раздел «Add CR Suffix» (Добавить суффикс возврата каретки) и отсканируйте его. Это заставит сканер добавлять символ с кодом #13 в конце каждого считанного кода, что и является триггером для возникновения внешнего события в драйвере.
Если в типовых формах (например, в «Чеке ККМ») сканер работает, а в вашей новой обработке — нет, значит, проблема в инициализации оборудования в коде формы. Рассмотрим подробнее, как это реализовано в УТ 10.3 на обычных формах.
При открытии формы нам необходимо явно дать команду системе «захватить» сканер для этой формы. В модуле формы должны присутствовать вызовы процедур из глобальных модулей торгового оборудования. Проанализируем пример кода для подключения:
Процедура ПриОткрытии()
// Подключаем сканер штрихкода
Если ПолучитьСерверТО().ПодключитьОбъект(СканерШтрихКода, ИмяТипа, Параметры) Тогда
// Оборудование подключено успешно
Иначе
Сообщить("Не удалось подключить сканер штрихкода!");
КонецЕсли;
КонецПроцедуры
При закрытии формы крайне важно освободить порт, чтобы другие формы или приложения могли им воспользоваться:
Процедура ПриЗакрытии()
// Отключаем оборудование, чтобы освободить COM-порт
ПолучитьСерверТО().ОтключитьОбъект(СканерШтрихКода);
КонецПроцедуры
Обратите внимание, что без вызова метода ПодключитьОбъект платформа не будет направлять данные от драйвера в процедуру ВнешнееСобытие конкретной формы.
Существует еще одна хитрость, связанная с состоянием формы. Если фокус находится не на форме или система считает, что ввод в данный момент недоступен, событие может игнорироваться. Посмотрим на ситуацию с использованием методов проверки доступности. Попробуйте добавить в начало процедуры ВнешнееСобытие диагностическое сообщение:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Не ВводДоступен() Тогда
// Это может сигнализировать о том, что форма потеряла фокус
ЭтаФорма.Активизировать();
КонецЕсли;
// Далее идет стандартная обработка события
// ...
КонецПроцедуры
Иногда помогает принудительный вызов ЭтаФорма.Активизировать() в обработчике ПриОткрытии, чтобы гарантировать, что форма готова принимать сообщения от драйверов.
Проанализируем используемую компоненту. Если вы используете старый драйвер ScanOpos, попробуйте переключиться на 1С:Сканер штрихкода (NativeApi). Современные компоненты NativeApi работают более стабильно с очередью сообщений Windows и лучше обрабатывают прерывания от USB-COM портов.
При использовании NativeApi важно проверить:
Выясним причины на уровне операционной системы. Даже если Putty показывает данные, 1С более чувствительна к настройкам таймингов и управления потоком. Рассмотрим параметры COM-порта в Диспетчере устройств Windows:
Также стоит проверить параметры энергосбережения USB. В свойствах USB-концентратора, к которому подключен сканер, снимите галочку «Разрешить отключение этого устройства для экономии энергии». Это предотвратит ситуацию, когда сканер «засыпает» и первое сканирование после простоя уходит «в никуда».
Для того чтобы сканер Honeywell 1400g стабильно генерировал внешнее событие в 1С, необходимо соблюдение трех условий:
Используя эти рекомендации и проверяя настройки по шагам, вы сможете добиться корректной работы оборудования в любой самописной обработке или типовом документе.