Как обрезать составной QR-код при сканировании в 1С и оставить только EAN-13?

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

При работе с товарами от поставщиков часто возникает ситуация, когда продукция промаркирована составными двухмерными кодами (QR-код или DataMatrix). В таком коде объединены основной штрихкод товара (например, стандартный 13-значный EAN-13) и дополнительная технологическая информация: дата производства, номер партии, код сортировки или упаковочные данные, отделенные пробелом.

Например, при сканировании сканер передает в систему строку вида: 2000013001061 3700011101013, где первые 13 символов — это штрихкод штучного товара, а остальная часть — переменные служебные данные. Если в базе 1С номенклатура зарегистрирована по коду 2000013001061, программа не сможет найти позицию и выдаст ошибку, либо ошибочно подберет упаковку, если для нее заведен полный штрихкод. Разберем, как правильно отсекать лишнюю информацию и почему стандартные попытки правок в коде часто не дают результата.

Почему не работает редактирование функции ПроверитьШтрихКод

Типичная ошибка начинающих разработчиков — попытка обрезать входящую строку непосредственно в функции валидации штрихкода. Рассмотрим типовой фрагмент конфигурации:


Функция ПроверитьШтрихКод(ШтрихКод, ТипШтрихкода) Экспорт
    ДлинаКода = СтрДлина(Штрихкод);
    Если ДлинаКода = 0 Тогда
        Возврат Ложь;
    ИначеЕсли ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13 Тогда
        Если (ДлинаКода <> 13) Или НЕ(ТолькоЦифры(Штрихкод))
            Или КонтрольныйСимволEAN(Лев(Штрихкод, 12), 13) <> Прав(Штрихкод, 1) Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;
    Возврат Истина;
КонецФункции

Попытка вставить в самое начало этой функции преобразование строки:

Штрихкод = СтрПолучитьСтроку(СтрЗаменить(Штрихкод, " ", Символы.ПС), 1);

не приводит к желаемому результату по двум причинам:

  1. Назначение функции: ПроверитьШтрихКод предназначена исключительно для синтаксической проверки формата переданного штрихкода. Она возвращает булево значение (Истина или Ложь). Даже если значение аргумента изменится внутри функции, во внешние процедуры обработки события сканирования оно не вернется, так как поиск номенклатуры выполняется в других модулях.
  2. Точка вызова: событие от сканера попадает в обработчик формы документа или внешнюю компоненту задолго до того, как система дойдет до валидации штрихкода. Соответственно, номенклатура ищется по исходной длинной строке.

Решение 1. Настройка суффикса в параметрах торгового оборудования (ASCII 32)

Самый быстрый способ решения задачи, не требующий изменения программного кода конфигурации, — настройка суффикса отсечения в параметрах драйвера сканера штрихкодов.

Символ пробела в таблице ASCII имеет десятичный код 32. Если в настройках подключаемого оборудования (в параметрах драйвера сканера в 1С) указать суффикс 32:

  1. Перейдем в меню настройки торгового оборудования: Сервис — Торговое оборудование — Подключение и настройка торгового оборудования (или соответствующий раздел в настройках подключаемого оборудования).
  2. Откроем форму параметров подключенного сканера штрихкодов.
  3. В поле Суффикс зададим значение 32 (или добавим код 32 к существующему символу перевода строки 13).

В этом случае драйвер сканера при получении строки будет считать пробел признаком конца передачи данных штрихкода и передаст в 1С только ту часть строки, которая предшествует пробелу — первые 13 цифр.

Важные ограничения и риски данного метода:

  1. Повторное событие («хвост» штрихкода): если сканер работает через COM-порт, драйвер может воспринять символы после пробела как следующий отдельный штрихкод. В результате 1С сначала добавит нужный товар, а затем сразу попытается найти товар со штрихкодом 3700011101013 и выдаст сообщение об ошибке.
  2. Влияние на маркировку: если на этом же рабочем месте сканируются коды маркировки «Честный Знак» или другие составные DataMatrix/QR-коды, содержащие пробелы в служебных полях, они также будут преждевременно разорваны.

Решение 2. Программная обрезка штрихкода в месте приема внешнего события

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

В конфигурациях на обычных формах (например, «Управление торговлей 10.3», «УПП 1.3») перехват выполняется либо во внешней обработке обслуживания оборудования (функция ОбработатьСобытиеСШК), либо в общем модуле РаботаСТорговымОборудованием в процедуре ОбработатьВнешнееСобытие.

Посмотрим на пример правильной обработки входящей строки:


Функция ПолучитьЧистыйШтрихкод(ВходящийШтрихкод)
    ПозицияПробела = Найти(ВходящийШтрихкод, " ");
    Если ПозицияПробела > 0 Тогда
        Возврат Лев(ВходящийШтрихкод, ПозицияПробела - 1);
    КонецЕсли;
    Возврат ВходящийШтрихкод;
КонецФункции

Если используется внешняя обработка обслуживания драйвера, найдем функцию обработки события (например, ОбработатьСобытиеСШК) и изменим блок присвоения переменной ШК:


Функция ОбработатьСобытиеСШК(Объект, Событие, Данные, ШК, ТипШК) Экспорт
    Результат = мНетОшибки;
    
    // Получаем исходную строку данных от сканера
    ВходныеДанные = СокрЛП(Данные);
    
    // Если обнаружен пробел, отсекаем правую часть
    ПозицияПробела = Найти(ВходныеДанные, " ");
    Если ПозицияПробела > 0 Тогда
        ШК = Лев(ВходныеДанные, ПозицияПробела - 1);
    Иначе
        ШК = ВходныеДанные;
    КонецЕсли;
    
    Объект.Драйвер.ПосылкаДанных = 0;
    
    Если Объект.Параметры.Префикс <> 0 Тогда
        Если Объект.Параметры.Префикс = Лев(ШК, 1) Тогда
            ШК = Сред(ШК, 2);
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

В конфигурациях на управляемых формах с БПО (Библиотекой подключаемого оборудования) аналогичную доработку рекомендуется реализовывать через расширение конфигурации в процедуре МенеджерОборудованияКлиентПереопределяемый или в модулях обработки данных сканера до передачи штрихкода в форму.

Решение 3. Аппаратная фильтрация на сканере (ADF)

Наиболее надежный промышленный вариант — настройка самого сканера штрихкодов с помощью сервисных настроечных кодов из руководства пользователя (Programming Manual).

Практически все современные 2D-сканеры (Zebra/Symbol, Honeywell, Datalogic, Mertech, Mindeo) поддерживают режим Advanced Data Formatting (ADF). Мы можем запрограммировать сканер так, чтобы при считывании именно типа QR Code он:

  1. Отправлял только первые 13 символов.
  2. Либо останавливал передачу данных на первом встреченном символе пробела.

При таком подходе сканер передает в операционную систему уже чистый 13-значный код EAN-13, что исключает любые доработки базы данных 1С и конфликты с другими операциями учета.

← На главную