Как исправить проблему, когда сканер режет QR/Data Matrix код блока табачной продукции в 1С 7.7?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Мы рассмотрим распространенную проблему, с которой сталкиваются пользователи 1С 7.7 при работе со сканерами штрихкодов и маркированной продукцией, в частности, табачных блоков. Суть проблемы заключается в том, что сканер в режиме эмуляции клавиатуры некорректно считывает Data Matrix коды блоков, передавая в 1С только их последнюю часть, в то время как коды пачек считываются без ошибок. При этом в текстовый документ сканер может корректно передавать полный код. Разберем эту ситуацию подробно и предложим эффективные решения.

Причиной такого поведения является особенность структурированных Data Matrix кодов для маркировки (часто называемых GS1 DataMatrix), которые используются для табачной продукции. Эти коды содержат специальный управляющий символ GS (Group Separator, ASCII 29), который служит разделителем между полями данных переменной длины (например, между серийным номером и ключом проверки). Когда сканер работает в режиме эмуляции клавиатуры (HID), операционная система или само приложение 1С могут неправильно интерпретировать или вовсе отбрасывать этот непечатаемый символ GS, часто воспринимая его как символ возврата каретки (CR). Это приводит к тому, что код "разбивается" на несколько фрагментов, и в 1С попадает только последний из них.

Выясним, почему же коды пачек считываются корректно, а блоки — нет. Обычно коды на пачках могут быть либо обычными QR-кодами, либо Data Matrix кодами без сложной структуры GS1, либо Data Matrix кодами с другим набором символов, которые не вызывают проблем с интерпретацией в режиме клавиатуры. Коды блоков же, как правило, содержат тот самый символ GS, который и является камнем преткновения.

Основное решение: Переключение сканера в режим эмуляции COM-порта

Наиболее надежное и рекомендованное решение для работы с маркированной продукцией в 1С 7.7 (и не только) — это перевод сканера штрихкодов в режим эмуляции COM-порта (Virtual COM Port, VCP).

  1. Почему это работает:

    В режиме эмуляции COM-порта сканер воспринимается операционной системой как устройство, подключенное к последовательному порту RS-232, даже если физического COM-порта нет, используя специальный драйвер. Данные в этом режиме передаются напрямую в приложение, минуя буфер клавиатуры и обработку операционной системой, что исключает потерю данных и некорректную интерпретацию управляющих символов, таких как GS (ASCII 29). Это гарантирует, что 1С получит полный и неискаженный код Data Matrix.

    При работе в режиме COM-порта, язык ввода клавиатуры также не влияет на передаваемые данные, что позволяет корректно считывать штрихкоды, содержащие символы различных алфавитов.

  2. Как это сделать:

    Мы должны перевести сканер в режим VCP. Обычно это выполняется путем сканирования специальных управляющих штрихкодов из руководства пользователя сканера. Например, для сканеров Honeywell, нужно найти в инструкции штрихкод с названием "USB Virtual COM" или аналогичный. После сканирования этого кода, вам потребуется установить соответствующий драйвер (часто поставляемый с сканером или доступный на сайте производителя, например, Atol для своей компоненты). После установки драйвера сканер будет виден в системе как виртуальный COM-порт (например, COM3, COM4 и т.д.).

    Далее в вашей самописной конфигурации 1С 7.7, или в настройках торгового оборудования, вы указываете этот номер COM-порта для подключения сканера. Обычно для этого используется внешняя компонента, например, от АТОЛ.

  3. Преимущества решения:
    • Надежность: Корректная передача всех символов штрихкода, включая GS, без потерь и искажений.
    • Независимость от раскладки: Язык клавиатуры не влияет на считывание.
    • Эффективность: Не требует постоянного удержания курсора в поле ввода.
  4. Подходящие модели сканеров:

    Многие современные сканеры прекрасно работают в режиме COM-порта. Среди них:

    • Honeywell 1450G, 1470g, 1472g
    • Zebra/Symbol DS2208, DS4308, DS4208
    • Datalogic QD2430
    • Voyager 1450g
    • MAGELLAN 3200VS (по отзывам, может быть менее надежным)

    Оригинальный автор подтвердил, что его сканер Honeywell 1450G заработал корректно после переключения в режим COM-порта.

Обход проблемы монопольного доступа к COM-порту для нескольких баз

Переход на режим эмуляции COM-порта, хотя и решает основную проблему с некорректным считыванием, может создать новую трудность для пользователей, работающих одновременно с несколькими экземплярами 1С или несколькими базами. Стандартно, один экземпляр программы монопольно захватывает COM-порт, и второй экземпляр получает сообщение "Невозможно получить монопольный доступ к устройству!".

Рассмотрим несколько подходов к решению этой задачи:

  1. Использование COM-сплиттеров (COM Splitter):

    Для таких случаев существуют специальные программы, называемые COM-сплиттерами или Virtual Serial Port Driver. Эти утилиты позволяют создать несколько виртуальных COM-портов, которые все "слушают" один физический (или виртуальный) COM-порт сканера. Затем каждый экземпляр 1С может быть настроен на работу со своим уникальным виртуальным COM-портом.

    Примеры таких программ включают Virtual Serial Port Driver PRO, Free Serial Port Splitter. Они могут перенаправлять данные с одного физического порта на несколько виртуальных, иногда даже с возможностью переключения данных между портами в зависимости от активного окна.

    Необходимо учитывать, что настройка таких программ может быть нетривиальной, и иногда могут возникать свои "подводные камни", как упоминал один из участников обсуждения. Мы рекомендуем тщательно изучить документацию выбранного COM-сплиттера и провести всестороннее тестирование.

  2. Альтернативное оборудование:

    В некоторых случаях, если нет жесткой привязки к конкретному сканеру, можно рассмотреть модели сканеров, которые изначально могут работать с несколькими подключениями или имеют более гибкие сетевые интерфейсы, если это применимо к вашей инфраструктуре.

Настройка сканера в режиме эмуляции клавиатуры (альтернативные, менее эффективные методы)

Хотя переход на COM-порт является предпочтительным решением, мы также рассмотрим альтернативные подходы, если по каким-либо причинам режим эмуляции COM-порта не может быть использован.

  1. Проблема символа GS в HID-режиме:

    Основная сложность заключается в том, что сканер в режиме эмуляции клавиатуры воспринимает символ GS (ASCII 29) как возврат каретки (CR) или другой непечатаемый символ, что приводит к обрезке кода. Некоторые сканеры (например, Mertech) могут быть настроены на передачу символа GS в HID-режиме через Alt-коды (например, как функциональную клавишу F8). Для этого требуется специальная настройка сканера путем сканирования управляющих штрихкодов из инструкции.

    Мы должны понимать, что такая настройка индивидуальна для каждой модели сканера и не всегда возможна.

  2. Игнорирование непечатаемых символов в сканере:

    Один из участников темы пытался настроить сканер (Honeywell 1450G) через его мануал на игнорирование непечатаемых символов. Это, возможно, решило проблему "резки" штрихкода в 1С, но создало новую: фискальный регистратор не смог распознать такой "очищенный" код для передачи в систему "Честный Знак". Это критически важно, поскольку для корректной передачи данных о маркированной продукции символ GS должен присутствовать в коде.

    Таким образом, игнорирование или удаление GS на уровне сканера или до передачи в "Честный Знак" неприемлемо для соблюдения требований маркировки.

  3. Пост-обработка штрихкода в 1С:

    Мы можем настроить 1С на удаление непечатаемых символов из полученного штрихкода, если сканер работает в режиме клавиатуры и передает "мусор". Для этого в обработке внешнего события 1С мы можем добавить код, который очищает полученную строку от управляющих символов. Например:

    
    Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
        Если Источник = "СканерШК" Тогда
            ШтрихКод = СтрЗаменить(Данные, Символ(29), ""); // Удаляем символ GS
            ШтрихКод = СтрЗаменить(ШтрихКод, Символ(13), ""); // Удаляем CR
            // Можно добавить удаление других непечатаемых символов
            // ...
            Сообщить("Получен очищенный штрихкод: " + ШтрихКод);
            // Далее используем очищенный ШтрихКод
        КонецЕсли;
    КонецПроцедуры
    

    Однако, как и в предыдущем случае, удаление символа GS приведет к тому, что код не будет соответствовать формату GS1 DataMatrix и не будет принят системой "Честный Знак". Этот метод применим только для штрихкодов, которые не требуют наличия символа GS для дальнейшей обработки или передачи в государственные системы.

  4. Настройка таймаута сканера:

    Некоторые участники форума предлагали увеличить таймаут в настройках драйвера сканера (например, до 30-80 мс). Иногда это может помочь при неполном считывании длинных штрихкодов, если проблема связана со скоростью передачи данных или буферизацией. Однако это не является системным решением для проблемы с символом GS и, как показал опыт автора темы, не решило проблему полностью.

Рекомендации по настройке и проверке

Для обеспечения корректной работы со сканерами и маркированной продукцией, особенно в контексте 1С 7.7 и системы "Честный Знак", мы рекомендуем следовать следующим шагам:

  1. Активация работы с GS1:

    Мы должны убедиться, что в настройках сканера включена передача символа GS1 (FNC1) и активирована работа с GS1 DataMatrix. В инструкциях к сканеру ищите настройки типа "Enable GS1 mode", "GS1 DataBar", "FNC1 handling". Без этих настроек сканер может не распознавать или некорректно передавать структурированные Data Matrix коды.

  2. Проверка в текстовом редакторе:

    Мы всегда рекомендуем проверять корректность считывания GS-символов с помощью текстовых редакторов, которые могут отображать скрытые символы. Например, в Notepad++ вы можете включить опцию "Показать все символы" (View -> Show Symbol -> Show All Characters). Отсканируйте проблемный Data Matrix код в такой редактор и убедитесь, что символ GS (который обычно отображается как GS или похожий на квадратик/стрелку) присутствует и находится в правильных местах. Это поможет нам диагностировать, где именно происходит потеря символа – на уровне сканера, ОС или приложения 1С.

  3. Обновление прошивки и драйверов:

    Мы всегда должны следить за актуальностью прошивки сканера и драйверов для 1С (особенно если используются внешние компоненты, такие как драйверы АТОЛ). Производители регулярно выпускают обновления, исправляющие ошибки и улучшающие совместимость.

  4. Тестирование в "Честном Знаке":

    Для быстрой проверки работоспособности сканера с кодами маркировки мы можем использовать мобильное приложение "Честный ЗНАК.Бизнес" (или любое другое, способное валидировать коды маркировки). Если сканер корректно считывает код в этом приложении, значит, проблема, скорее всего, находится на стороне 1С или ее интеграции.

  5. Настройки 1С 7.7 для символа GS:

    При работе с маркировкой табачной продукции в 1С 7.7, если вы используете компоненту для работы со сканером, мы должны проверить и, при необходимости, изменить значение для реквизита "Символ GS" в настройках компоненты. Часто по умолчанию оно может быть установлено в "NONE". Нам нужно установить его на клавишу, которой сканер будет передавать символ GS (обычно это #29). Если вы используете собственный код для обработки внешних событий, убедитесь, что он правильно интерпретирует символ GS.

В итоге, проблема с "резкой" Data Matrix кодов блоков табачной продукции в 1С 7.7, возникающая в режиме эмуляции клавиатуры, является распространенной и хорошо изученной. Наиболее эффективным и надежным способом ее решения является перевод сканера в режим эмуляции COM-порта, что обеспечивает корректную передачу всех служебных символов, необходимых для работы с маркированной продукцией.

← На главную