При обмене электронными накладными с поставщиками нередко возникает ситуация: в документе передается усеченный штрихкод из 7–8 цифр, а на физической упаковке нанесен полный 13-значный штрихкод стандарта EAN-13. При попытке сосканировать товар сканером система не может найти позицию в базе данных. Выясним причину такого поведения программы и разберем варианты решения задачи.
Штрихкоды, начинающиеся с префиксов диапазона 20–29 (например, 22), по международным стандартам GS1 выделены для внутренней маркировки весовой и штучной фасованной продукции. В таких кодах зашифрован не только сам товар, но и переменные параметры каждой упаковки.
Рассмотрим типовую структуру весового кода формата EAN-13:
22).Поставщик не знает заранее вес каждой конкретной упаковки, отправляемой клиенту, поэтому в файлах электронных накладных указывает только базовую часть: префикс и артикул/код (те самые 7–8 знаков вида 22020151). Если записать эти неполные данные в регистр напрямую, сканер штрихкода при чтении физической этикетки выдаст все 13 цифр и не найдет соответствия.
Тип EAN-8 в данном случае неприменим, так как у стандарта EAN-8 собственное контрольное число, рассчитываемое по первым 7 знакам. Попытка записать 7–8 знаков как EAN-8 приведет к ошибке формата или невозможности считать код стандартным сканером.
Самый правильный и надежный путь в типовых конфигурациях — приводить входящий неполный штрихкод к стандартному шаблону весового товара 1С. В типовых решениях (УТ, УТП, ERP, Комплексная автоматизация) весовые товары хранятся в регистре сведений Штрихкоды (или ШтрихкодыНоменклатуры) с нулевым блоком веса.
Разберем алгоритм по шагам:
22).22020151 дополняется четырьмя нулями: 220201510000.2202015100000) в регистр сведений Штрихкоды.22) и длину кода номенклатуры.Посмотрим на пример функции расчета контрольного символа EAN-13 на встроенном языке 1С:
Функция РассчитатьКонтрольныйСимволEAN13(Код12) Экспорт
ЧетСумма = 0;
НечетСумма = 0;
Для НомерСимвола = 1 По 12 Цикл
Символ = Число(Сред(Код12, НомерСимвола, 1));
Если НомерСимвола % 2 = 0 Тогда
ЧетСумма = ЧетСумма + Символ;
Иначе
НечетСумма = НечетСумма + Символ;
КонецЕсли;
КонецЦикла;
Итого = НечетСумма + ЧетСумма * 3;
Остаток = Итого % 10;
Если Остаток = 0 Тогда
Возврат 0;
Иначе
Возврат 10 - Остаток;
КонецЕсли;
КонецФункции
Когда кладовщик сканирует упаковку, типовой обработчик торгового оборудования 1С определяет префикс 22, извлекает вес для заполнения количества в строке документа, обнуляет блок веса в коде, пересчитывает контрольный символ и находит нужную позицию по нормализованному шаблону.
Если длина значащей части у поставщика плавает (в одних позициях 7 знаков, а в других 8) или используются разные префиксы, типовая фиксированная настройка параметров учета не сможет корректно разобрать весь поток штрихкодов. В этом случае настраиваем поиск по подстроке в обработке внешнего события от торгового оборудования.
Проанализируем пример поискового запроса, который можно использовать в модуле формы или в процедуре ОбработатьШтрихкод:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2
| Штрихкоды.Владелец КАК Номенклатура,
| Штрихкоды.ХарактеристикаНоменклатуры КАК Характеристика,
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| &СчитанныйШтрихкод ПОДОБНО Штрихкоды.Штрихкод + ""%""";
Запрос.УстановитьПараметр("СчитанныйШтрихкод", СчитанныйШК);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 1 Тогда
Выборка.Следующий();
НоменклатураНайденная = Выборка.Номенклатура;
ИначеЕсли Выборка.Количество() > 1 Тогда
// Если по префиксу нашлось несколько позиций, открываем окно уточнения пользователю
Предупреждение("По начальным цифрам штрихкода найдено несколько товаров!");
КонецЕсли;
Такой подход позволяет хранить в регистре именно те 7 или 8 знаков, которые передал поставщик. Оператор ПОДОБНО сравнивает полученные 13 знаков со строкой из базы: если 13-значный код начинается на символы из регистра, номенклатура считается идентифицированной.
Если модификация обработчиков штрихкодов нежелательна, используем штатную подсистему соответствий номенклатуры контрагентов:
НоменклатураКонтрагентов.Большинство современных 2D- и лазерных сканеров поддерживают технологию расширенного форматирования данных (ADF / Advanced Data Formatting). В памяти сканера можно задать правило:
22.Важное ограничение: при аппаратной обрезке сканер передает только код номенклатуры, и 1С не сможет автоматически получить вес товара из упаковки — количество в документе придется проставлять вручную.