Меню

Контрольная цифра EAN UPC в штрихкодах

Контрольная цифра EAN UPC вычисляется из остальных знаков по чередующимся весам и служит для защиты от ошибок сканирования. Разбираем, чем отличаются два распространённых вида кодов, что означает префикс и чего он не означает, почему пройденная проверка не говорит о подлинности товара и как искать причину сбоя при массовом сканировании.

Опубликовано

  • тестовые данные
  • штрихкоды
  • проверка номеров

Контрольная цифра EAN UPC нужна ровно для одной задачи: заметить, что при печати, сканировании или ручном переписывании знак потерялся, добавился или заменился. Ниже разберём, как устроен последний знак товарного кода, чем отличаются два распространённых вида, откуда берётся идея чередующихся весов, что на самом деле сообщает префикс кода, почему пройденная проверка не связана с подлинностью товара и как искать причину сбоя, когда строк много.

Откуда берётся последний знак товарного кода?

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

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

Важная особенность: проверка не требует никакой базы данных и никакого сетевого обращения. Это арифметика над знаками, и выполняется она мгновенно в самом сканере или в приёмнике. Полная аналогия с другими системами нумерации разобрана в обзоре алгоритмов контрольной цифры, где то же семейство правил показано с общих позиций.

Чем отличаются два распространённых вида кодов?

В обиходе встречаются коды разной длины, и это создаёт первую практическую сложность. Правило вычисления у них общее по идее, но не совпадает по деталям: позиции знаков нумеруются по-разному, а значит, по-разному расставляются веса.

Свойство Короткий код Длинный код
Разрядность меньше знаков больше знаков
Точка отсчёта весов от последнего содержательного знака от последнего содержательного знака
Что меняется при смене длины наборы весов на чётных и нечётных позициях то же, но проверка строже к сдвигу
Возможность перепутать высокая высокая

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

Отсюда первое требование к любой проверке: сначала определить вид кода, и только потом считать. Определение не должно опираться на догадку о содержимом — оно опирается на длину и на контекст, в котором код пришёл.

Как устроен приём с чередующимися весами?

Идея алгоритма проста и знакома по множеству систем нумерации, только с другими параметрами. Знаки содержательной части умножаются на веса, произведения складываются, сумма берётся по модулю, а из остатка получают недостающий знак.

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

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

Есть и вторая деталь, из-за которой реализации расходятся между собой: точку отсчёта весов берут от конца строки, а не от начала. Причина в том, что последний знак — контрольный, и правило должно быть определено так, чтобы его значение не зависело от того, сколько знаков стоит слева. Если отсчитывать от начала, картина весов сдвинется при любом изменении длины, и правило перестанет работать.

Что говорит префикс кода?

Начало товарного кода распределяется между странами и организациями, и это порождает устойчивое заблуждение: считается, что первые цифры обозначают страну производства. Это не так.

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

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

Третье: диапазоны распределяются на нескольких уровнях — от международного до локального, и внутри одного диапазона встречаются поддиапазоны, закреплённые за конкретным владельцем. Перераспределение диапазонов случается, и тогда у одного товара может оказаться два разных кода. Оба при этом настоящие, и это не ошибка данных.

Значит ли пройденная проверка, что товар можно продать?

Нет, и разница тут принципиальная. Пройденная проверка контрольного знака означает только, что строка знаков согласована сама с собой. Она ничего не говорит о том, зарегистрирован ли такой товар, известен ли он каталогу, разрешён ли он к продаже в конкретной стране и соответствует ли упаковка заявленному содержимому.

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

Отсюда практическая рекомендация для интерфейсов: не связывайте результат проверки знака со статусом товара. Даже формулировка «код корректен» рискует быть понятой как «товар легален», поэтому лучше говорить о самой строке, а не о товаре.

Как искать причину сбоя при массовом сканировании

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

  1. Проверьте длину строки. Потерянный или лишний знак — самая частая причина несогласованности, и она видна сразу.
  2. Пересчитайте контрольный знак заново. Расхождение подтверждает ошибку считывания, а не ошибку правила, если правило применено к правильному виду кода.
  3. Сверьте вид кода. Если строка могла быть короткой или длинной, попробуйте обе трактовки: иногда именно путаница в виде даёт ложный сбой.
  4. Посмотрите на источник. Строки, пришедшие подряд из одного места, чаще всего содержат систематическую проблему — смазанную метку, блик или неверный профиль сканера.

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

Что делать дальше

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

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

Читать дальше

Статьи: Проверка ИНН