Как убрать символ табуляции из QR-кода при сканировании в 1С:УТ 11.4?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В практической работе часто возникают нестандартные ситуации. Рассмотрим одну из них: поставщик предоставил партию товара с QR-кодами, в которые ошибочно закодирован служебный символ — символ табуляции (с кодом 182). При сканировании такого кода в 1С стандартный механизм обработки данных воспринимает этот символ как разделитель и разрывает единый штрихкод на несколько частей. В результате в обработчик события попадает уже искаженная, урезанная информация, что делает дальнейшую работу невозможной.

Проблема заключается в том, что стандартная функция МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр) использует служебные символы, включая табуляцию, для разделения потока данных на отдельные штрихкоды. Простая замена символа в процедуре ОбработкаОповещения не сработает, так как на этот уровень данные приходят уже разделенными и частично потерянными.

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

Решение 1: Настройка сканера или его драйвера (рекомендуемый способ)

Это наиболее правильный и надежный метод. Его суть — исправить данные на самом первом этапе, еще до того, как они попадут в 1С. Если сканер будет передавать уже очищенную строку, то никаких доработок в конфигурации не потребуется, и стандартные механизмы 1С отработают корректно.

  1. Изучение документации и утилит производителя.

    Большинство профессиональных сканеров (например, Zebra, Honeywell, Datalogic) поставляются со специальными утилитами для настройки. Необходимо найти в документации к вашей модели раздел, посвященный обработке данных, правилам сканирования или форматированию. Часто такие утилиты позволяют создавать сложные правила, включая поиск и замену определенных символов в отсканированной строке.

  2. Настройка правил замены символов.

    В настройках сканера или его драйвера ищите опции, связанные с префиксами, суффиксами или заменой символов (часто называется "Symbol replacement", "Data formatting" или похоже). Ваша задача — создать правило, которое будет находить символ с ASCII-кодом 182 и заменять его на пустую строку (т.е. удалять). Если удаление невозможно, можно заменить его на безобидный символ, который не является разделителем, например, пробел.

  3. Проверка режима работы сканера.

    Сканеры могут работать в разных режимах, чаще всего это эмуляция клавиатуры (Keyboard Wedge) и эмуляция COM-порта (Serial Port Emulation). Режим эмуляции COM-порта, как правило, предоставляет гораздо больше возможностей для тонкой настройки потока данных через драйвер. Если ваш сканер работает в режиме клавиатуры, возможно, стоит рассмотреть его переключение в режим COM-порта для получения доступа к расширенным настройкам.

Преимущество этого подхода: решение не зависит от конфигурации 1С. Оно будет работать в любой базе, не требует внесения изменений в код и не рискует сломаться при обновлении конфигурации. Кроме того, это устраняет первопричину проблемы, а не борется с ее последствиями.

Решение 2: Программная доработка в 1С

Этот путь следует выбирать, если настройка сканера невозможна или слишком рискованна (например, когда в компании используется множество разных моделей сканеров и изменение настроек одного может повлиять на другие). Задача программиста — перехватить «сырые» данные от сканера до того, как их обработает стандартный механизм БПО (Библиотеки подключаемого оборудования).

Подход А: Модификация общего модуля или формы обработки события

Нужно найти место в конфигурации, где происходит первоначальный прием данных от драйвера оборудования. Стандартная процедура ОбработкаОповещения в форме — это уже конечная точка. Нам нужен более низкий уровень.

Алгоритм действий:

  1. Используйте отладчик. Поставьте точку останова в процедуре ОбработкаОповещения в форме документа, где происходит сканирование. Когда отладчик остановится, откройте стек вызовов. Двигаясь по стеку вызовов вверх, вы сможете найти процедуры и функции, которые вызывались до этого. Ваша цель — найти место в общих модулях (например, МенеджерОборудованияКлиент или похожих), где впервые появляется параметр с данными от сканера.
  2. Найдите точку для вмешательства. Ищите процедуру, которая непосредственно получает событие от внешней компоненты. Именно в этой процедуре, до вызова дальнейших обработчиков, нужно вставить код очистки.
  3. Внесите изменения. После того как вы нашли нужное место, добавьте строку для замены некорректного символа. Скорее всего, это будет выглядеть так:
    
    // Предположим, переменная "ДанныеСобытия" или "Параметр" содержит строку от сканера
    ДанныеСобытия = СтрЗаменить(ДанныеСобытия, Символ(182), ""); // Заменяем символ табуляции на пустую строку
    

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

Подход Б: Программная «склейка» данных

Этот метод является более сложным и, по сути, «костылем», но может сработать, если сканер из-за символа-разделителя отправляет данные несколькими порциями. Логика такова: мы собираем все поступающие «куски» в течение очень короткого времени и объединяем их.

Как это реализовать:

  1. В форме, где происходит сканирование, заведите переменную для временного хранения фрагментов штрихкода, например, БуферДанныхСканера (тип Массив).
  2. В обработчике ОбработкаОповещения не вызывайте сразу стандартную логику, а добавляйте пришедший Параметр в массив БуферДанныхСканера.
  3. Используйте обработчик ожидания. После получения первой части данных подключайте обработчик ожидания с очень коротким интервалом (например, 0.1 секунды) и однократным выполнением.
    
    // В процедуре ОбработкаОповещения
    &НаКлиенте
    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
        Если ИмяСобытия = "ScanData" Тогда
            // Если буфер еще пуст, это первая порция данных
            Если БуферДанныхСканера.Количество() = 0 Тогда
                ПодключитьОбработчикОжидания("СобратьШтрихкод", 0.1, Истина);
            КонецЕсли;
    
            БуферДанныхСканера.Добавить(Параметр);
        Иначе
            // Стандартная обработка других оповещений
        КонецЕсли;
    КонецПроцедуры
    
  4. В процедуре обработчика ожидания СобратьШтрихкод вы «склеиваете» все части из буфера, очищаете от символа табуляции и передаете на дальнейшую обработку.
    
    &НаКлиенте
    Процедура СобратьШтрихкод()
        // Объединяем все части, которые успели прийти
        ПолныйШтрихкод = "";
        Для Каждого Часть Из БуферДанныхСканера Цикл
            ПолныйШтрихкод = ПолныйШтрихкод + Часть;
        КонецЦикла;
    
        // Очищаем буфер для следующего сканирования
        БуферДанныхСканера.Очистить();
        
        // Выполняем замену (на всякий случай, если символ остался)
        ПолныйШтрихкод = СтрЗаменить(ПолныйШтрихкод, Символ(182), "");
    
        // Теперь вызываем стандартную обработку с уже собранным штрихкодом
        // Например, через вызов экспортной процедуры общего модуля
        МенеджерОборудованияУТКлиент.ОбработатьДанныеСканера(ПолныйШтрихкод);
    КонецПроцедуры
    

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

Выводы

Проблема с некорректными символами в штрихкодах, хоть и редкая, но вполне решаемая. Проанализировав ситуацию, мы можем выделить два основных пути:

  1. На уровне оборудования: самый правильный и стабильный способ — настроить сканер так, чтобы он сам удалял "плохой" символ. Это решает проблему в корне.
  2. На уровне 1С: если оборудование трогать нельзя, необходимо дорабатывать конфигурацию через расширение, перехватывая данные на самом низком уровне, доступном программисту, и очищая их до передачи в стандартные механизмы БПО.

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

← На главную