При автоматизации рабочего места кассира (РМК) на базе конфигурации "1С:Управление торговлей" (особенно при использовании самописных обычных форм) специалисты часто сталкиваются со странным поведением нового торгового оборудования. Типичный сценарий: сканер отлично работает в текстовом редакторе Блокнот, без проблем считывает первые три штрихкода в программе 1С, но на четвертый раз часть символов пропадает, а на экране внезапно появляется модальное окно поиска по сумме. Давайте подробно разберем, почему возникает этот технический сбой, проанализируем физику процесса и рассмотрим несколько надежных способов решения проблемы.
Для начала выясним причину возникновения задержек. Когда сканер штрихкодов подключен к компьютеру в режиме эмуляции клавиатуры (Keyboard Wedge), операционная система воспринимает его как обычное устройство ввода. Как только луч сканера считывает штрихкод, устройство начинает отправлять последовательность символов в активное окно с чрезвычайно высокой скоростью — интервал между символами составляет микросекунды.
Если мы сканируем штрихкод в Блокнот, операционная система моментально отображает символы, поскольку текстовый редактор не выполняет никаких фоновых вычислений. В 1С ситуация складывается иначе. Давайте проанализируем цепочку событий при сканировании в табличную часть документа:
Теперь разберем, откуда берется окно поиска на четвертый раз. В обычных формах платформы 1С для табличных частей по умолчанию активирован механизм быстрого поиска по символам. Работает это следующим образом:
Когда фокус ввода (курсор) находится на табличном поле, и пользователь начинает вводить символы с клавиатуры, платформа автоматически открывает окно поиска внизу экрана по текущей активной колонке. Если после успешного добавления первых трех товаров фокус в табличной части автоматически сместился на колонку Сумма или Количество, то при четвертом сканировании происходит сбой. Первый символ штрихкода теряется из-за зависания интерфейса, а оставшаяся часть кода "печатается" напрямую в активную ячейку. Платформа распознает это как ручной ввод пользователя и мгновенно инициализирует стандартный поиск по сумме.
Если нет возможности перевести сканер в другой режим работы, мы можем решить проблему на физическом уровне самого устройства. Для этого необходимо настроить межсимвольную задержку (Inter-character delay).
Каждый сканер поставляется с инструкцией (руководством пользователя), в которой содержатся специальные настроечные штрихкоды. Нам необходимо найти раздел, отвечающий за чувствительность передачи данных или задержку ввода. Обычно производители рекомендуют установить задержку в диапазоне от 15 до 50 миллисекунд между отправкой каждого символа. Это дает платформе 1С необходимое время на обработку предыдущего символа и подготовку интерфейса к приему следующего, полностью исключая потерю данных.
Традиционный и весьма популярный способ обхода клавиатурных задержек в среде 1С — это использование стандартного диалогового окна "Ввод штрихкода", которое вызывается нажатием клавиши F7. Чтобы автоматизировать этот процесс и избавить кассира от необходимости каждый раз нажимать кнопку на клавиатуре, мы должны запрограммировать сам сканер.
Для реализации этого метода выполним следующие шаги:
F7.Enter (код ASCII 13 или Carriage Return).Рассмотрим, как теперь выглядит процесс сканирования: при считывании кода устройство сначала посылает в систему команду нажатия клавиши F7. Платформа 1С мгновенно открывает модальное окно "Ввод штрихкода". Фокус ввода жестко фиксируется в единственном поле этого окна. Затем сканер передает сам штрихкод, а завершающий суффикс Enter закрывает окно и инициирует обработку события добавления товара.
Важное предупреждение: этот способ имеет свои недостатки. На маломощных рабочих станциях или при работе через удаленный рабочий стол (RDP) окно поиска по F7 может открываться с задержкой. Если сканер начнет передавать штрихкод до того, как окно визуально отобразится на экране, символы снова будут утеряны.
Самым надежным и профессиональным решением является полный отказ от эмуляции клавиатуры и перевод сканера в режим виртуального COM-порта. В этом режиме данные передаются не посимвольно, а единым информационным пакетом напрямую в порт, где их перехватывает драйвер торгового оборудования 1С.
Рассмотрим пошагово, как выполнить такую настройку:
Давайте посмотрим, как работает этот механизм в коде обычного приложения. При получении данных из порта драйвер генерирует асинхронное внешнее событие, которое мы можем перехватить в модуле формы:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверим, что событие пришло именно от нашего сканера
Если Событие = "ПолученШтрихкод" Или Событие = "Barcode" Тогда
ПолученныйШтрихкод = СокрЛП(Данные);
// Вызываем функцию обработки штрихкода
ОбработатьСканирование(ПолученныйШтрихкод);
КонецЕсли;
КонецПроцедуры
В данном сценарии абсолютно неважно, какая колонка таблицы сейчас активна, открыты ли другие формы и насколько сильно загружен процессор компьютера. Пакет данных со штрихкодом гарантированно попадет в обработчик внешнего события без малейшей потери символов.
Также стоит упомянуть проблему демонстрационного режима драйверов. Некоторые сторонние разработчики поставляют коммерческие драйверы для интеграции торгового оборудования. Если такой драйвер не лицензирован, он может работать в ознакомительном режиме. Ограничения демо-режима часто проявляются в виде искусственных задержек, обрезания штрихкода до определенного количества символов или полной блокировки ввода после нескольких успешных операций.
Чтобы избежать подобных проблем, мы рекомендуем использовать стандартный сертифицированный драйвер от фирмы 1С — "1С:Сканеры штрихкода (NativeApi)". Данный драйвер является абсолютно бесплатным, стабильно работает как на обычных, так и на управляемых формах, поддерживает эмуляцию COM-портов и не имеет никаких лимитов на количество сканирований.