При внедрении системы маркировки владельцы систем на базе 1С 7.7 часто сталкиваются со специфической проблемой: при сканировании кода DataMatrix в блокнот данные приходят полностью, но внутри 1С код оказывается «обрезанным» или неполным. Особенно остро эта проблема проявляется при работе через удаленный рабочий стол (RDP) и использовании сканера в режиме эмуляции клавиатуры (USB-HID). Рассмотрим подробнее причины этого явления и разберем по шагам все доступные методы решения.
Для начала проанализируем ситуацию с технической точки зрения. Код DataMatrix, используемый для маркировки товаров («Честный ЗНАК»), содержит гораздо больше информации, чем привычный EAN-13. Если в EAN всего 13 цифр, то в DataMatrix может быть более 80 символов, включая служебные знаки. Когда сканер работает в режиме «в разрыв клавиатуры», он имитирует нажатие клавиш со скоростью, превышающей человеческие возможности.
Протокол RDP передает нажатия клавиш пакетами. При высокой скорости ввода и большом объеме данных в одном коде пакеты могут группироваться или, наоборот, теряться из-за задержек сети (latency). 1С 7.7, используя драйвер ScanOPOS.dll, ожидает определенные тайминги между символами. Если поток данных прерывается или «заикается», 1С считает, что ввод завершен, и инициирует событие ОбработкаВнешнегоСобытия, не дождавшись окончания всей строки. В результате мы видим в программе только часть кода.
Как отмечают специалисты, использование режима эмуляции клавиатуры для маркировки в терминальных сессиях — это путь, полный ошибок. Рассмотрим, как перевести сканер (на примере Honeywell 1450g) в режим Virtual COM Port.
Преимущество: Данные передаются не через поток нажатий клавиш, а как единый массив байтов. Драйвер ScanOPOS.dll корректно принимает всю строку целиком, исключая потерю символов.
Если по каким-то причинам переход на COM-порт невозможен, попробуем заставить RDP «успевать» за сканером. Для этого нужно замедлить передачу данных самим сканером. Проанализируем, как это работает: сканер будет вставлять микропаузу после каждого отправленного символа.
Для сканеров Honeywell 1450g найдите в инструкции раздел «Intercharacter Delay». Рекомендуется установить значение от 20 до 50 миллисекунд. Это существенно замедлит «визуальное» появление штрихкода на экране, но позволит протоколу RDP гарантированно доставить каждый символ до сервера без потерь. Посмотрим на алгоритм действий:
Проанализируем ситуацию, когда стандартная ОбработкаВнешнегоСобытия работает некорректно. Как вариант, можно использовать «костыль», который часто оказывается самым живучим в среде 1С 7.7. Вместо того чтобы полагаться на драйвер сканера, мы можем считывать данные напрямую в активное поле ввода.
Для этого в форме документа или обработки создается текстовое поле. Пользователь устанавливает туда курсор и сканирует код. Поскольку поле ввода Windows (Edit control) нативно обрабатывает поток клавиатуры лучше, чем внешнее событие 1С, код часто залетает целиком.
Посмотрим на пример кода для обработки такого ввода в модуле формы:
Процедура ПриСканированииВПоле()
// Предположим, переменная ТекстКода связана с полем ввода на форме
Если ПустаяСтрока(ТекстКода) = 0 Тогда
// Вызываем функцию разбора DataMatrix
ОбработатьМаркировку(ТекстКода);
// Очищаем поле для следующего сканирования
ТекстКода = "";
КонецЕсли;
КонецПроцедуры
Основное неудобство этого метода заключается в необходимости держать фокус на поле ввода или открывать специальное модальное окно перед сканированием.
DataMatrix коды содержат невидимый символ GS (ASCII 29), который отделяет идентификаторы применения (AI). В режиме клавиатуры сканеры часто либо пропускают его, либо заменяют на странные комбинации клавиш. Рассмотрим, как это влияет на 1С 7.7.
Если ваш программный код в 1С ожидает символ GS для корректного разбора (например, чтобы отделить серийный номер от ключа проверки), а сканер его не передает, код будет считаться «неверным» или «обрезанным» по первому разделителю. Рекомендуем перенастроить сканер так, чтобы он заменял символ GS на печатный символ, например, на «|» (вертикальная черта) или «#» (решетка). Это делается через настройку префиксов/суффиксов или через таблицу замены символов (Data Formatting) в утилите Honeywell EZConfig.
Стандартный ScanOPOS.dll имеет жесткие ограничения по длине принимаемой строки и таймаутам. В профессиональной среде для 1С 7.7 часто рекомендуют использовать старые версии драйверов от АТОЛ (например, версию 6.5.3, которая была бесплатной и корректно работала с терминальными сессиями). Они позволяют более гибко настроить чувствительность и префиксы, что критически важно для длинных строк DataMatrix.
Рассмотрим порядок настройки альтернативного драйвера:
regsvr32.Подводя итог, можно сказать, что для стабильной работы 1С 7.7 с маркировкой в терминальной сессии, лучшим решением остается использование виртуального COM-порта в сочетании с качественным драйвером. Это исключает влияние раскладки клавиатуры и сетевых задержек RDP на целостность данных.