В процессе автоматизации кассовых узлов часто приходится сталкиваться с нестандартным поведением торгового оборудования. Типичная неприятная ситуация: при начале формирования нового чека и первом сканировании штрихкода в чек неожиданно подставляется позиция, пробитая в предыдущем чеке несколько минут назад. При этом ошибка может проявляться непостоянно, создавая сложности для кассиров и расхождения в учете. Разберем причины такого поведения оборудования и программного обеспечения, а также рассмотрим комплекс мер для устранения неисправности.
Анализ причин зависания и выталкивания штрихкодов
Рассмотрим механику возникновения ошибки. В большинстве случаев сканер подключается по физическому интерфейсу USB, но для работы с торговым ПО 1С эмулирует виртуальный COM-порт (Virtual COM / USB-VCOM). Проблема дублирования или задержки передачи скан-кода обычно связана со следующими факторами:
Аппаратная буферизация в драйвере виртуального COM-порта (FIFO). Если во время завершения предыдущего чека (например, в момент фискализации или отображения модального диалога оплаты) кассир случайно или преждевременно подносит товар к сканеру, скан-код поступает в буфер операционной системы. Так как программа в этот момент занята и не опрашивает порт, данные остаются в буфере FIFO и считываются драйвером торгового оборудования только при открытии формы нового чека.
Ошибки внутренней микропрограммы (прошивки) устройства. В некоторых сканерах ранних ревизий модуль эмуляции USB-VCOM некорректно удерживает считанный пакет во внутреннем контроллере до момента следующего оптического считывания (эффект выталкивания старого пакета новым).
Несоответствие настроек управления потоком данных (Flow Control / Handshaking). Если параметры аппаратного или программного контроля (RTS/CTS, DTR/DSR, XON/XOFF) на стороне сканера не согласованы с настройками порта в диспетчере устройств Windows, линия передачи блокируется до смены состояния сигналов.
Особенности обработки внешних событий в платформе 1С:Предприятие 7.7. В платформе 1С 7.7 процедура ОбработкаВнешнегоСобытия не срабатывает при открытых модальных окнах или выполнении длительных расчетов. Сигналы драйвера складываются в системную очередь и доставляются в документ только после возврата фокуса.
Шаг 1. Настройка параметров виртуального COM-порта в Windows
Проанализируем базовые системные настройки порта, которые позволяют предотвратить зависание байтов в буфере операционной системы:
Откроем Диспетчер устройств Windows и перейдем в ветку Порты (COM и LPT).
Найдем виртуальный COM-порт используемого сканера, вызовем его свойства и откроем вкладку Параметры порта.
Нажмем кнопку Дополнительно (Advanced).
Снизим или полностью отключим использование аппаратных буферов FIFO. Если полное отключение невозможно, установим ползунок буфера приема (Receive Buffer) на минимальное значение (1 байт).
Параметр времени ожидания отклика (Latency Timer) переведем на минимальный уровень — 1–2 мс.
В основном окне параметров порта установим значение параметра Управление потоком (Flow Control) в положение Нет (None).
Шаг 2. Обновление прошивки и диагностика оборудования
Выясним, кроется ли проблема в самом сканере. Для этого выполним следующие действия:
Подключим сканер к тестовому компьютеру и воспользуемся фирменной сервисной утилитой производителя (например, для устройств Datalogic используется утилита Datalogic Aladdin).
Проверим наличие обновлений микропрограммы (Firmware) сканера. Если доступна свежая версия ПО, выполним прошивку устройства.
Протестируем считывание штрихкодов в нейтральное приложение (текстовый редактор или электронную таблицу), исключив влияние драйверов торгового оборудования 1С. Если повторы данных воспроизводятся даже без участия 1С, оборудование имеет аппаратный дефект или системную ошибку контроллера и подлежит замене по гарантии.
Шаг 3. Программная очистка и контроль буфера при смене чека
Если конфигурация кассового узла доступна для доработки, разберем программные способы предотвращения попадания старых данных в новый документ. При закрытии или создании чека полезно принудительно очищать переменные хранения считанного кода и перезапускать опрос устройства.
Посмотрим на пример логики в модуле формы кассового чека, где перед началом обслуживания нового покупателя выполняется программный сброс параметров и переинициализация сканера через драйвер:
Процедура ПриОткрытии()
// Очищаем переменные хранения последнего считанного штрихкода
ТекущийШК = "";
БуферСканера = "";
// Если используется внешняя компонента драйвера торгового оборудования
// Выполняем принудительный сброс устройства для очистки очереди порта
Попытка
Если ОбъектДрайвера.УстройствоВключено = 1 Тогда
ОбъектДрайвера.УстройствоВключено = 0;
ОбъектДрайвера.УстройствоВключено = 1;
КонецЕсли;
Исключение
// Обработка исключения при недоступности драйвера
КонецПопытки;
КонецПроцедуры
Шаг 4. Альтернативные варианты подключения
Если проблема сохраняется в режиме виртуального COM-порта, рассмотрим альтернативные методы сопряжения сканера с кассовой программой:
Перевод сканера в режим эмуляции клавиатуры (HID POS / Keyboard Wedge). Переключим устройство настроечным штрихкодом в клавиатурный режим, настроим префикс (например, функциональную клавишу F7) и суффикс (CR/LF). В этом режиме сканер передает данные напрямую через скан-коды клавиатуры, минуя буферизацию COM-портов операционной системы.
Использование специализированных внешних компонент. Заменим устаревший драйвер на актуальную компоненту (например, 1CScanOPOS или специализированные библиотеки прямого чтения COM-портов), которые поддерживают низкоуровневую команду сброса очереди входящих байтов (PurgeComm) перед началом чтения данных.