Часто при подключении торгового оборудования программисты и системные администраторы сталкиваются с неочевидной проблемой: сканер штрихкодов успешно проходит тест в настройках подключаемого оборудования 1С, но в рабочем месте кассира (РМК) или документах продаж ничего не происходит. В отладчике при этом не удается поймать прерывание, так как процедура ВнешнееСобытие попросту не вызывается. Давайте подробно разберем эту ситуацию на примере конфигурации «1С:Управление торговлей 11» (УТ 11) с использованием драйвера NativeApi в режиме эмуляции клавиатуры.
Когда мы подключаем сканер в режиме эмуляции клавиатуры (Keyboard Wedge), операционная система компьютера распознает его не как специфическое устройство, а просто как еще одну стандартную клавиатуру. При считывании штрихкода сканер посимвольно «набирает» цифры или буквы в любое активное текстовое поле, с такой же скоростью, с какой это делал бы очень быстрый пользователь.
Чтобы платформа 1С не просто вводила этот текст в открытые поля формы, а сгенерировала полноценное системное прерывание — внешнее событие, драйверу оборудования необходимо перехватить этот быстрый поток символов. Именно здесь кроется главная ошибка большинства настроек.
Для корректного перехвата драйверу («1С:Сканеры штрихкода (NativeApi)» или аналогичному) нужны строгие маркеры начала и конца передачи данных. Без них драйвер не поймет, что печатает именно сканер, а не пользователь нажал несколько кнопок подряд. Выясним, как настроить эти границы.
Чтобы внешнее событие гарантированно срабатывало, в настройках сканера (как физического устройства, путем сканирования специальных служебных штрихкодов из инструкции) и в параметрах драйвера в 1С должны быть синхронно настроены префикс и суффикс.
13 (CR - Carriage Return). Как только драйвер встречает этот символ после серии быстро введенных знаков, он понимает, что сканирование завершено.150 (F7). Префикс дает команду драйверу: «внимание, сейчас начнется поток данных от сканера, перехвати его и не выводи на экран».Проанализируем алгоритм работы драйвера: как только он фиксирует префикс, он блокирует стандартный клавиатурный ввод в активное поле 1С. Далее он собирает все поступающие символы в буфер, пока не встретит суффикс. После получения суффикса, собранная строка передается в платформу 1С, и именно в этот момент генерируется ВнешнееСобытие. Если префиксы и суффиксы не заданы или не совпадают в оборудовании и программе, событие не формируется, и мы видим просто вставку цифр в текстовое поле без вызова процедур обработки.
В конфигурациях на управляемых формах (УТ 11, Розница 2.3/3.0, ERP, КА) архитектура работы с периферией инкапсулирована в БПО (Библиотеку подключаемого оборудования). Событие от драйвера всегда приходит на сторону клиента в директиве компиляции &НаКлиенте.
Если вы хотите отследить момент сканирования в отладчике, рассмотрим основные точки останова, которые вам понадобятся:
ОбработкаВнешнегоСобытия(Источник, Событие, Данные) в Модуле управляемого приложения.ОбработкаВнешнегоСобытия или ОбработкаОповещения непосредственно в модуле формы документа продаж или РМК.ПодключаемоеОборудованиеУниверсальныйДрайверКлиент или МенеджерОборудованияКлиент. Через них проходит маршрутизация данных от драйвера к конкретной форме.Важно: пока суффиксы не настроены, ставить точки останова в этих процедурах бесполезно — платформа просто не вызовет их, так как нет команды от драйвера.
Рассмотрим еще один критически важный нюанс, который напрямую связан с выбором режима работы сканера. Если вы работаете с маркированным товаром («Честный ЗНАК»), вам приходится сканировать двумерные штрихкоды DataMatrix.
Внутри стандартизированных кодов DataMatrix содержатся специальные служебные, непечатные символы-разделители. Самый важный из них — символ GS (Group Separator, код ASCII 29). Он отделяет разные блоки данных (GTIN, серийный номер, криптохвост) друг от друга.
Специфика режима «разрыв клавиатуры» заключается в том, что драйвер клавиатуры в ОС Windows при имитации ввода часто «проглатывает», искажает или теряет непечатные символы. В итоге 1С получает сплошную строку, в которой блоки данных склеены между собой. Проанализируем последствия: разные версии конфигураций могут использовать различные алгоритмы парсинга поврежденной строки, из-за чего в одной программе марка распознается, а в другой обрезается неправильно.
Практический совет: чтобы гарантированно избежать потерь спецсимвола GS и обеспечить стабильную работу с маркированной продукцией, настоятельно рекомендуется переводить сканеры штрихкодов в режим эмуляции COM-порта (USB-COM). В этом режиме данные передаются напрямую в порт в исходном, неискаженном виде, минуя буфер клавиатуры операционной системы. Это решает проблему как с потерей разделителей, так и с обязательной настройкой префиксов.