При работе с товарами от поставщиков часто возникает ситуация, когда продукция промаркирована составными двухмерными кодами (QR-код или DataMatrix). В таком коде объединены основной штрихкод товара (например, стандартный 13-значный EAN-13) и дополнительная технологическая информация: дата производства, номер партии, код сортировки или упаковочные данные, отделенные пробелом.
Например, при сканировании сканер передает в систему строку вида: 2000013001061 3700011101013, где первые 13 символов — это штрихкод штучного товара, а остальная часть — переменные служебные данные. Если в базе 1С номенклатура зарегистрирована по коду 2000013001061, программа не сможет найти позицию и выдаст ошибку, либо ошибочно подберет упаковку, если для нее заведен полный штрихкод. Разберем, как правильно отсекать лишнюю информацию и почему стандартные попытки правок в коде часто не дают результата.
Типичная ошибка начинающих разработчиков — попытка обрезать входящую строку непосредственно в функции валидации штрихкода. Рассмотрим типовой фрагмент конфигурации:
Функция ПроверитьШтрихКод(ШтрихКод, ТипШтрихкода) Экспорт
ДлинаКода = СтрДлина(Штрихкод);
Если ДлинаКода = 0 Тогда
Возврат Ложь;
ИначеЕсли ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13 Тогда
Если (ДлинаКода <> 13) Или НЕ(ТолькоЦифры(Штрихкод))
Или КонтрольныйСимволEAN(Лев(Штрихкод, 12), 13) <> Прав(Штрихкод, 1) Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции
Попытка вставить в самое начало этой функции преобразование строки:
Штрихкод = СтрПолучитьСтроку(СтрЗаменить(Штрихкод, " ", Символы.ПС), 1);
не приводит к желаемому результату по двум причинам:
ПроверитьШтрихКод предназначена исключительно для синтаксической проверки формата переданного штрихкода. Она возвращает булево значение (Истина или Ложь). Даже если значение аргумента изменится внутри функции, во внешние процедуры обработки события сканирования оно не вернется, так как поиск номенклатуры выполняется в других модулях.Самый быстрый способ решения задачи, не требующий изменения программного кода конфигурации, — настройка суффикса отсечения в параметрах драйвера сканера штрихкодов.
Символ пробела в таблице ASCII имеет десятичный код 32. Если в настройках подключаемого оборудования (в параметрах драйвера сканера в 1С) указать суффикс 32:
32 (или добавим код 32 к существующему символу перевода строки 13).В этом случае драйвер сканера при получении строки будет считать пробел признаком конца передачи данных штрихкода и передаст в 1С только ту часть строки, которая предшествует пробелу — первые 13 цифр.
Важные ограничения и риски данного метода:
3700011101013 и выдаст сообщение об ошибке.Если требуется гарантированная обработка без побочных эффектов для других штрихкодов, необходимо модифицировать строку в точке получения данных от оборудования.
В конфигурациях на обычных формах (например, «Управление торговлей 10.3», «УПП 1.3») перехват выполняется либо во внешней обработке обслуживания оборудования (функция ОбработатьСобытиеСШК), либо в общем модуле РаботаСТорговымОборудованием в процедуре ОбработатьВнешнееСобытие.
Посмотрим на пример правильной обработки входящей строки:
Функция ПолучитьЧистыйШтрихкод(ВходящийШтрихкод)
ПозицияПробела = Найти(ВходящийШтрихкод, " ");
Если ПозицияПробела > 0 Тогда
Возврат Лев(ВходящийШтрихкод, ПозицияПробела - 1);
КонецЕсли;
Возврат ВходящийШтрихкод;
КонецФункции
Если используется внешняя обработка обслуживания драйвера, найдем функцию обработки события (например, ОбработатьСобытиеСШК) и изменим блок присвоения переменной ШК:
Функция ОбработатьСобытиеСШК(Объект, Событие, Данные, ШК, ТипШК) Экспорт
Результат = мНетОшибки;
// Получаем исходную строку данных от сканера
ВходныеДанные = СокрЛП(Данные);
// Если обнаружен пробел, отсекаем правую часть
ПозицияПробела = Найти(ВходныеДанные, " ");
Если ПозицияПробела > 0 Тогда
ШК = Лев(ВходныеДанные, ПозицияПробела - 1);
Иначе
ШК = ВходныеДанные;
КонецЕсли;
Объект.Драйвер.ПосылкаДанных = 0;
Если Объект.Параметры.Префикс <> 0 Тогда
Если Объект.Параметры.Префикс = Лев(ШК, 1) Тогда
ШК = Сред(ШК, 2);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
В конфигурациях на управляемых формах с БПО (Библиотекой подключаемого оборудования) аналогичную доработку рекомендуется реализовывать через расширение конфигурации в процедуре МенеджерОборудованияКлиентПереопределяемый или в модулях обработки данных сканера до передачи штрихкода в форму.
Наиболее надежный промышленный вариант — настройка самого сканера штрихкодов с помощью сервисных настроечных кодов из руководства пользователя (Programming Manual).
Практически все современные 2D-сканеры (Zebra/Symbol, Honeywell, Datalogic, Mertech, Mindeo) поддерживают режим Advanced Data Formatting (ADF). Мы можем запрограммировать сканер так, чтобы при считывании именно типа QR Code он:
При таком подходе сканер передает в операционную систему уже чистый 13-значный код EAN-13, что исключает любые доработки базы данных 1С и конфликты с другими операциями учета.