Как контрольная цифра замечает опечатку в номере

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

Как контрольная цифра замечает опечатку в номере

Дальше вы проверите официальный пример GS1 вручную, увидите, почему одна неверная цифра не проходит проверку и найдёте перестановку, которую тот же алгоритм спокойно пропустит.

В статье вы узнаете:

Что хранится под полосками

Под обычным товарным штрихкодом EAN-13 напечатан номер из 13 цифр. В системе GS1 такой идентификатор товара называется GTIN-13, от английского Global Trade Item Number. Полосы дают сканеру машиночитаемую версию номера, а цифры снизу позволяют прочитать его человеку.

Последняя, тринадцатая цифра является контрольной. Она не обозначает страну, цену или вид товара. Её задача проще: проверить, согласуются ли цифры номера друг с другом по известному алгоритму. GS1 относит EAN-13 к распространённым товарным штрихкодам и описывает контрольную цифру как часть, которая проверяет целостность структуры номера.

Возьмём пример GS1:

6291041500213

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

Как получить контрольную цифру

Алгоритм GTIN-13 чередует веса 1 и 3. Вес показывает, во сколько раз нужно увеличить цифру перед сложением. Если считать слева, первую цифру умножают на 1, вторую на 3, третью снова на 1 и так далее до двенадцатой.

Сначала сложим цифры на местах с весом 1:

6 + 9 + 0 + 1 + 0 + 2 = 18

Теперь сложим цифры на местах с весом 3 и умножим сумму на 3:

(2 + 1 + 4 + 5 + 0 + 1) × 3 = 13 × 3 = 39

Общая взвешенная сумма равна 18 + 39 = 57. До ближайшего большего десятка не хватает трёх:

60 − 57 = 3

Это и есть контрольная цифра. Если добавить её к сумме, получится 60, число без остатка делится на 10. Когда взвешенная сумма уже оканчивается нулём, контрольная цифра тоже равна 0: переходить к следующему десятку не нужно. Официальная инструкция GS1 использует тот же порядок действий: чередовать веса, сложить результаты и дополнить сумму до ближайшего числа, которое делится на 10 и не меньше самой суммы [GS1, How to calculate a check digit manually]. Актуальная общая спецификация GS1 26.0 закрепляет этот алгоритм для числовых идентификаторов GS1 фиксированной длины, которым нужна контрольная цифра.

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

Почему одна заменённая цифра выдаёт ошибку

Представим, что в пятой позиции вместо 0 напечатали 1:

6291141500213

Эта позиция имеет вес 1, поэтому прежняя сумма 57 превращается в 58. С оставленной контрольной цифрой 3 получается 61. При делении на 10 остаток равен 1, значит, номер не проходит проверку. Для первых двенадцати цифр теперь требовалась бы контрольная цифра 2.

Так работает любая одиночная замена в GTIN-13. Если не учитывать знак, разница между двумя разными цифрами составляет от 1 до 9. Вес 1 сохраняет эту разницу, а вес 3 превращает её в 3, 6, 9, 12, 15, 18, 21, 24 или 27. Ни одно из этих чисел не оканчивается нулём. Поэтому одна изменённая цифра не может оставить прежний остаток при делении на 10.

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

Зачем цифрам разные веса

Можно было бы просто сложить все цифры и проверить последнюю. Это ловило бы часть замен, но любая перестановка оставалась бы невидимой. От перемены мест слагаемых сумма не меняется: 5 + 0 и 0 + 5 дают один результат.

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

Слово «большинство» здесь важно. В официальном примере рядом стоят 5 и 0. Искусственно поменяем их местами:

6291041050213

До перестановки вклад этой пары равнялся 5 × 3 + 0 × 1 = 15. После перестановки он равен 0 × 3 + 5 × 1 = 5. Сумма уменьшилась ровно на 10, поэтому остаток не изменился. Новый набор цифр математически проходит проверку: общая сумма вместе с последней тройкой равна 50.

Такая слепая зона возникает у соседних цифр, которые различаются на 5: 0 и 5, 1 и 6, 2 и 7, 3 и 8, 4 и 9. Их перестановка между позициями с весами 1 и 3 меняет сумму на 10, поэтому остаток при делении на 10 остаётся прежним.

Что ещё может пройти проверку

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

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

Правильный остаток также не означает, что товар существует. Любой человек может подобрать последовательность цифр с верной контрольной. GS1 отдельно предлагает сервис Verified by GS1, который обращается к реестру и проверяет, был ли идентификатор выдан, какой организации он принадлежит и есть ли сведения о товаре [GS1, How do I check if a GTIN is valid?].

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

Один принцип, разные номера

Контрольные цифры есть и у других идентификаторов. Например, современный ISBN книги состоит из 13 цифр, а последняя математически проверяет остальные. Международное агентство ISBN указывает для ISBN-13 тот же принцип: взвешенная сумма с чередующимися весами 1 и 3 должна делиться на 10 без остатка.

Не путайте контрольную цифру с цифровым корнем. Цифровой корень получают повторным сложением цифр и используют для быстрой проверки по остатку от деления на 9. В GTIN-13 позиции имеют разные веса, а итог проверяют делением на 10.

Из этого не следует, что любой длинный номер можно проверить способом GTIN-13. У каждого стандарта свои длина, допустимые символы, направление счёта и веса. Сначала нужно узнать тип идентификатора, затем применять его правило.

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

Есть что добавить?

Напишите своё мнение, комментарий или предложение.