Фактопедия

Как работает штрихкод

Штрихкод - это обычное число, записанное полосами разной ширины, а название и цена товара хранятся в базе магазина, а не в самих полосках.

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

Что зашифровано в тринадцати цифрах

Самый привычный нам формат называется EAN-13. Число в нём делится на четыре части.

Первые две или три цифры - префикс организации, которая выдала предприятию его код. Диапазон 460-469 закреплён за российским отделением, 400-440 за немецким, 30-37 за французским. Дальше идёт код самого предприятия, за ним код конкретного товара внутри ассортимента этого предприятия, и последняя цифра - контрольная.

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

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

Как цифра превращается в полосы

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

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

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

Правая половина кода кодируется зеркально левой: там, где слева тёмное, справа светлое. Благодаря этому сканеру всё равно, в какую сторону проехал луч. Прочитав первую половину, он по типу узоров понимает, что код перевёрнут, и просто переворачивает результат.

Контрольная цифра: арифметика, которая ловит ошибку

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

Возьмём номер, который начинается на 460123456789. Складываем: 4 плюс 6 умножить на 3, плюс 0, плюс 1 умножить на 3, и так до конца. Получается 117. До ближайшего десятка не хватает трёх, значит контрольная цифра равна трём, а полный номер - 4601234567893.

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

Как сканер читает полосы

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

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

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

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

Почему в коде нет цены

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

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

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

Откуда взялись полосы

Патент на маркировку, читаемую автоматически, получили в США в 1952 году. Первый вариант выглядел не полосами, а концентрическими окружностями, похожими на мишень: авторы рассудили, что круг можно считать с любой стороны. Идея пролежала без дела почти двадцать лет, пока не подешевели лазеры и электроника.

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

Американский формат содержал двенадцать цифр, европейский добавил тринадцатую, чтобы хватило кодов всему миру. Со временем кассы научили читать оба, и теперь это по сути одна система с разной длиной номера.

Двумерные коды и в чём их отличие

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

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

Почему код иногда не читается

Причин немного, и все они про геометрию, а не про электронику. Упаковка смялась, и полосы растянулись неравномерно - пропорции поплыли. На глянце появился блик, и участок кода стал для приёмника одинаково белым. Этикетку напечатали слишком мелко, и краска слиплась в сплошное пятно. Свободную зону по краю закрыли ценником.

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