Самые распространенные типы штрих-кода — EAN13, EAN8, CODE39.
Как получить тип штрих-кода в 1С 8.3, зная только сам штрих-код, я расскажу ниже.
Данные функции содержатся в общем модуле РаботаСТорговымОборудованием управления торговлей версии 10.3.
Определение типа штрих-кода EAN8
Функция ТипШтрихкодаEAN8ТО(Штрихкод) Экспорт
Результат = Ложь; Сумма = 0; Коэффициент = 3;
Если СтрДлина(Штрихкод) = 8 Тогда Индекс = Неопределено; Для Индекс = 1 По 7 Цикл КодСимв = КодСимвола(Штрихкод, Индекс); Если КодСимв 57 Тогда Возврат Результат; КонецЕсли; Сумма = Сумма + Коэффициент * (КодСимв — 48); Коэффициент = 4 — Коэффициент; КонецЦикла; Сумма = (10 — Сумма % 10) % 10; Результат = (КодСимвола(Штрихкод, 8) = Сумма + 48); КонецЕсли;
Функция для получения контрольного числа в 1С EUN13:
Функция КонтрольныйСимволEAN13ТО(Штрихкод) Экспорт
Результат = «»; Сумма = 0; Коэффициент = 1;
Индекс = Неопределено; Для Индекс = 1 По 12 Цикл КодСимв = КодСимвола(Штрихкод, Индекс); Сумма = Сумма + Коэффициент * (КодСимв — 48); Коэффициент = 4 — Коэффициент; КонецЦикла; Сумма = (10 — Сумма % 10) % 10; Результат = Символ(Сумма + 48);
Определение типа штрих-кода EAN13
Функция ТипШтрихкодаEAN13ТО(Штрихкод) Экспорт
Результат = (СтрДлина(Штрихкод) = 13 И КонтрольныйСимволEAN13ТО(Штрихкод) = Прав(Штрихкод, 1));
Определение типа штрих-кода CODE39
Функция ТипШтрихкодаCODE39ТО(Штрихкод) Экспорт
Результат = Ложь; Длина = СтрДлина(Штрихкод); Индекс = Неопределено;
Если Длина > 0 Тогда Результат = Истина; Для Индекс = 1 По Длина Цикл КодСимв = КодСимвола(Штрихкод, Индекс); Если (КодСимв <> 32) И (КодСимв 37) И (КодСимв <> 43) И (КодСимв 57) И (КодСимв 90) Тогда
Результат = Ложь; Прервать;
КонецЕсли; КонецЦикла; КонецЕсли;
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Данный раздел содержит общие сведения, касающиеся штрихкодирования, нюансы, связанные с формированием изображения штрихкодов, а также методику штрихкодирования товаров на предприятии.
Формат EAN13
Формат EAN13 является расширением формата UPC-A. Данный формат позволяет кодировать 12 символов (цифры от 0 до 9), к которым добавляется справа контрольная (тринадцатая) цифра, значение которой однозначно расчитывается в соответствии с кодируемой последовательностью. Значение штрихкода UPC-A соответствует значению штрихкода EAN-13, у которого первый символ 0.
Кодируемая при помощи этого алгоритма последовательность символов, обычно, представляет уникальный международный номер товара EAN13/UCC, который является уникальным в международном масштабе.
Формат EAN8
Формат EAN8 является расширением формата UPC-E и представляет сокращённую форму EAN13. Данный формат позволяет кодировать 7 символов (цифры от 0 до 9), к которым добавляется справа контрольная (восьмая) цифра, значение которой однозначно расчитывается в соответствии с кодируемой последовательностью. Значение штрихкода UPC-E соответствует значению штрихкода EAN-8, у которого первый символ 0.
Формат Code 39
Существует также расширение Code 39, которое, по сути, представляет набор правил, по которым символы, не входящие в список допустимых для данного формата, кодируются при помощи последовательностей допустимых символов. Стандартное расширение дополняет список допустимых символов строчными буквами латиницы.
Формат Code 93
Формат Code 93 (также называется «USS-93») позволяет кодировать такую же последовательность символов, как и расширение Code 39, но при этом изображение штрихкода получается заметно меньше. К недостаткам формата можно отнести отсутствие возможности упаковки кодируемой информации.
Формат Industrial 2 of 5
Формат Interleaved 2 of 5
Формат Codabar
Формат Codabar (также называется «Ames code», «USD-4», «NW-7», «2 of 7 code») позволяет кодировать цепочку символов (цифры, некоторые знаки пунктуации) произвольной длины + один из 4 возможных (A, B, C, D) префиксов и один из 4 возможных суффиксов (также A, B, C и D).
К недостаткам данного алгоритма следует отнести отсутствие возможности упаковки кодируемой цепочки символов.
Формат Code 128
Формат Code 128 является форматом высокой плотности, позволяет кодировать цепочку символов (первые 128 символов ASCII-таблицы) произвольной длины. Формат поддерживает упаковку данных.
Формат EAN128
Формат RSS 14
Формат RSS 14 является, как и Code 128, форматом высокой плотности и позволяет кодировать цепочку символов (первые 128 символов таблицы ASCII) произвольной длины. При кодировании осуществляется упаковка кодируемой последовательности символов. К недостаткам можно отнести то, что штрихкоды данного типа поддерживаются ограниченным набором сканеров.
Формат Code 16k
Формат Code 16k является двумерным, штрихкод представляет последовательность одномерных штрихкодов (формат которых подобен Code 128), расположенных друг над другом, что позволяет увеличить плотность кодирования. К недостаткам алгоритма можно отнести то, то данный формат поддерживается ограниченным набором сканеров штрихкода.
Формат PDF-417
Формат PDF-417 является одним из самых распространённых двумерных форматов штрихкодирования. Данный формат позволяет кодировать последовательность символов кодовой страницы CP437, поддерживает ряд методов упаковки данных, а также параметризуемый алгоритм восстановления информации в случае повреждения изображения штрихкода.
Формирование изображения штрихкода
Необходимо отметить, что для корректного считывания изображения штрихкода сканерами, требуется, чтобы был достаточный контраст между тёмными и светлыми элементами штрихкода. В связи с этим существует ограничение на сочетания цветов элементов штрихкода.
Нормально считываются сканером следующие сочетания цветов:
Считываются при определённых условиях:
Не считываются при определённых условиях:
Также следует обратить внимание, что изображение штрихкода, в общем случае, нельзя масштабировать, т.к. при этом могут нарушиться соотношения ширины штрихов и пробелов штрихкода. Масштабирование, обычно, допускается в сторону увеличения изображения в целое число раз (этим, в частности, объясняется «скачкообразное» изменение размеров штрихкода при использовании элемента управления «1С:Печать штрихкодов»).
Методика штрихкодирования
При штрихкодировании товаров на предприятии, в первую очередь, следует уделить внимание уникальности используемых значений штрихкодов. В большинстве случаев в торговых точках осуществляется продажа товаров, на упаковки которых уже нанесён корректный штрихкод EAN13 или EAN8. При этом в случае, если существует необходимость задать штрихкоды для других товаров, применяется следующая методика: товарам назначается штрихкод EAN13, уникальный в пределах предприятия, значение которого начинается с цифры «2». При этом гарантируется, что ни для какого из товаров, на заводской упаковке которого содержится изображение штрихкода EAN13, не будет совпадения с присваиваемым самостоятельно штрихкодом (первая цифра «2» указывает на то, что используется «внутренний» штрихкод предприятия, уникальность которого должна обеспечиваться на предприятии самостоятельно).
Большинство весов, осуществляющих этикетирование весового товара при помощи EAN13, формируют штрихкод следующего формата:
Дополнительно Более подробно с описанием штрихкодов, их структурой и областью применения можно ознакомиться в подразделе «Штрихкоды» данного раздела.
Виды штрих-кодов, описание линейных и двумерных форматов. Как определить тип по изображению?
В современном мире во всех основных экономических сферах – торговле, промышленности, логистике и других, где необходим эффективный автоматизированный учёт товаров и материалов, применяют различные виды штрих-кодов. Подбор подходящего штрихового кодирования для конкретного случая использования и технического оборудования для его нанесения является важным этапом организации торговых и производственных взаимодействий.
Дорогие читатели! Наши статьи рассказывают о типовых способах решения юридических вопросов, но каждый случай носит уникальный характер.
Классификация видов
Штрих-код представляет собой графическую информацию в виде чередования черных и белых полос, которая наносится на поверхность, упаковку или маркировку товара.
Наибольшее применение штриховые коды получили:
Существует два основных вида штрих-кодов.
Линейные, или одномерные (1D)
Это графические изображения из сочетания черных и белых элементов виде линий разной толщины, обычно читаемые в горизонтальном направлении, которые содержат закодированную по определённым стандартам текстовую или числовую информацию.
Характерные черты:
Двумерные (2D)
Это графическое изображение в виде квадрата (иногда прямоугольника), состоящего из матрицы квадратных элементов, которое содержит вертикально и горизонтально расположенную закодированную информацию.
Отличительные особенности:
Форматы линейных и их характеристика
Существует несколько наиболее распространённых форматов линейных штриховых кодов, каждый из которых более подробно рассмотрен ниже.
EAN-13
European Article Number (EAN) – штрих-код европейского стандарта, введённый в действие странами Европы в 1977 году, аналогичный по назначению и структуре коду UPC.
Структура EAN-13 кода обычно содержит:
В некоторых случаях EAN код может быть дополнен добавочным товарным идентификатором (из 2-5 цифр), который печатается справа от основного изображения.
У этого кода есть разновидность EAN-8, включающая 8 носителей информации. Обычно применяется для кодировки маленьких партий или малогабаритных товаров. Меньший размер штрих-кода способствует более оперативному считыванию данных.
Universal Product Code (UPC) – это один из самых ранних штриховых кодов, принятый в 1973 году в США и являющийся американским стандартом универсального товарного кода.
Его состав включает 12 цифр:
Состоит из двух групп цифр – левой и правой, по шесть символов в каждой. Каждая цифра в группе кодируется четырьмя штрихами – двумя темными и двумя белыми. Отличительная особенность UPC-кода в симметричности правой и левой его сторон, а также в фотографически негативном начертании правой цифровой группы относительно левой.
Код UPC преобразуется в EAN-13 добавлением нуля перед составляющими его двенадцатью цифрами.
CODE 39
Это штрихкодовое обозначение переменной длины, в котором могут быть зашифрованы большие латинские буквы, цифры и некоторые символы. В отличие от кода EAN-13, он не содержит фиксированного числа символов и не требует обязательного применения контрольной цифры.
CODE 128
Увеличенный вариант штрихового кодирования, который содержит большое количество цифровых и буквенных символов, объединённых в разные группы. Отличается компактностью, достигаемой при помощи записи двух цифр в один штрихкодовой шаблон.
Обычно в его состав входят такие зашифрованные данные:
Interlesved 2 of 5 (ITF)
Вид штрих-кода, который содержит числовую информацию, зашифрованную на основе ширины штрихов и промежутков. Узнаваем по контурной толстой рамке на рисунке, которая помогает улучшить распознавание кода сканером, даже под большим углом. Содержит чётное число цифр, в случае нечётного их количества впереди добавляется ноль. Был разработан в 1995 году в США.
Форматы двумерных и их характеристика
Самыми распространенными видами двумерных штриховых кодов являются: QR-code, Data Matrix и Aztec Code.
QR-код
Наиболее универсальный вид штрих-кода, легко узнаваемый по присутствию квадратов в трёх углах графического рисунка – верхнем правом, нижнем левом и верхнем левом, а также нечетным количеством начерченных столбцов. Отличительной его особенностью служит возможность сканирования при помощи мобильных устройств.
Этот вид штрихового кодирования может содержать практически любые зашифрованные текстовые и числовые данные, в том числе персонифицированного и рекламного характера. Он обладает алгоритмами автоматической коррекции ошибок при возможных повреждениях кода или сканировании в сложных условиях.
Предлагаем посмотреть видео что такое QR-код, как он появился и для чего используется:
Data Matrix
Разновидность штрих-кода, выбранная в качестве основной для российской системы маркировки товаров. Его графическое изображение напоминает QR-код, но здесь отсутствуют характерные для последнего квадраты, зато имеются две отличительные непрерывные перпендикулярные чёрные полосы по левой боковой и нижней части рисунка.
Основное отличие Data Matrix заключается в компактном размере и чётном количестве изображенных столбцов. Возможности этого кода очень схожи с QR-кодированием, с хорошим уровнем защиты от ошибок. Согласно распоряжению правительства РФ (от 28 апреля 2018 г. N 792-р), в 2019 году обязательная маркировка новейшей версией штрих-кода Data Matrix ECC200 требуется для:
Aztec Code
Один из самых эффективных видов штрихового кодирования по возможностям корректировки возникающих ошибок. Графическое изображение отличается от двух предыдущих видов наличием в самом центре элемента в виде вложенных друг в друга квадратов.
Все три основные вида двумерных штрих-кодов, в целом, очень схожи между собой. Это позволяет считать их взаимозаменяемыми, и в случаях невозможности применения какого-либо из них (например, при отсутствии совместимости с используемым сканером), разрешено перейти на альтернативную разновидность кодирования.
Как определить тип по изображению?
Графическое изображение различных видов штриховых кодов отличается некоторыми элементами, что помогает распознать их. Линейные виды кодирования информации обозначаются чередующимися чёрными штрихами разной толщины (в зависимости от видовых особенностей кода) и белыми промежутками, с определённым набором символов под ними.
Видовые отличия изображений одномерных штрих-кодов:
Двумерные коды состоят из квадратно-пиксельных графических рисунков с отличительными особенностями для каждого вида:
О том, из чего состоят штрих-коды и как их расшифровать, говорится в другом материале.
Штрих-кодирование товаров помогает создавать правильную организацию их оптовых и розничных поставок, обеспечивать контроль за сроками реализации и удобство процесса продажи и учёта товарных изделий. Кроме того, применение кодов снижает риск возможных ошибок, что позволяет ускорить производственный оборот и увеличить прибыль компании.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Со штрихкодами современный человек сталкивается каждый день, даже не задумываясь об этом. Когда мы покупаем в супермаркете продукты, их коды считываются именно с помощью штрихкода. Также посылки, товары на складах, и прочее и прочее. Однако, мало кто знает, как же реально это работает.
Как устроен баркод, и что закодировано на этой картинке?
Попробуем разобраться, заодно напишем декодер таких кодов.
Введение
Использование штрихкодов имеет давнюю историю. Первые попытки автоматизации начинались еще в 50х, патент на устройство считывания кодов был получен в 1952г. Инженер, занимавшийся сортировкой вагонов на железной дороге, захотел упростить процесс. Идея была очевидной — кодировать номер с помощью полос и считывать их с помощью фотоэлементов. В 1962г коды стали официально использоваться для идентификации вагонов на американской железной дороге (система KarTrak), в 1968 прожектор заменили лазерным лучом, что позволило повысить точность и уменьшить размер считывателя. В 1973г появился формат «универсального кода продукта» (Universal Product Code), и в 1974 с использованием сканера кодов был продан первый продукт (жевательная резинка Wrigley’s — это же США;) в супермаркете. В 1984 треть магазинов использовали штриходы, в России же они начали использоваться примерно с 90х годов.
Разных кодов под разные задачи сейчас используется довольно много, к примеру, последовательность «12345678» может быть представлена такими способами (и это еще не все):
Приступим к побитовому разбору. Далее, все ниженаписанное будет относиться к виду «Code-128» — просто потому, что его формат довольно простой и понятный. Желающие поэкспериментировать с другими видами, могут открыть онлайн-генератор и посмотреть самостоятельно.
На первый взгляд штрихкод кажется просто беспорядочной последовательностью линий, на самом деле, его структура четко фиксирована:
1 — Пустое место, нужное для четкого определения начала кода 2 — Стартовый символ. Для Code-128 возможны 3 варианта (называемых А, В и С): 11010000100, 11010010000 или 11010011100, им соответствуют разные кодовые таблицы (подробнее в Википедии). 3 — Собственно код, содержащий нужные нам данные 4 — Контрольная сумма 5 — Стоп символ. Для Code-128 это 1100011101011. 6(1) — Пустое место.
Теперь о том, как кодируются биты. Тут все очень просто — если взять ширину самой тонкой линии за «1», то линия двойной ширины даст код «11», тройная «111», и так далее. Пустое место будет «0» или «00» или «000» по тому же самому принципу. Желающие могут сравнить стартовый код на картинке, чтобы убедиться что правило выполняется.
Теперь можно начинать программировать.
Получаем битовую последовательность
В принципе, это самая сложная часть, и разумеется, алгоритмически ее можно реализовать по-разному. Не уверен, что приведенный ниже алгоритм оптимальный, но для учебного примера его вполне достаточно.
Для начала загрузим изображение, растянем его по ширине, возьмем из середины изображения горизонтальную линию, преобразуем ее в ч/б и загрузим в виде массива.
На штрихкоде черному соответствует «1», а в RGB наоборот, 0, так что массив нужно инвертировать. Заодно вычислим среднее значение.
Запускаем программу, чтобы убедиться, что баркод загружен корректно:
Теперь нужно определить ширину одного «бита». Для этого мы выделим начало стартовой последовательности «1101», записывая моменты перехода графика через среднюю линию.
Мы записываем только переходы через середину, так что код «1101» будет записан как «101», но нам этого достаточно чтобы узнать его ширину в пикселах.
Теперь собственно декодирование. Находим очередной переход через середину, и определяем число бит, попавших в интервал. Поскольку совпадение не абсолютное (код может быть слегка изогнут или растянут), используем округление.
Не уверен что это оптимальный вариант, возможно, есть способ лучше, желающие могут написать в комментариях.
Если все было сделано правильно, то мы получаем на выходе примерно такую последовательность:
Здесь никаких сложностей в принципе, нет. Символы в Code-128 кодируются 11-битным кодом, который имеет 3 разновидности (А, В и С) и может хранить либо разные кодировки символов, либо цифры от 00 до 99.
В нашем случае, начало последовательности 11010010000, что соответствует «Code B». Было жутко влом вбивать вручную все коды из Википедии, поэтому таблица была просто скопирована из браузера и ее парсинг был тоже сделан на Python (hint: на продакшене так делать не надо).
Теперь осталось самое простое. Разбиваем нашу битовую последовательность на 11-символьные блоки:
Наконец, формируем строку и выводим ее на экран:
Ответ на то, что закодировано в таблице, приводить не буду, пусть это будет домашним заданием для читателей (использование готовых программ для смартфонов будет считаться читерством:).
В коде также не реализована проверка CRC, желающие могут сделать это самостоятельно.
Разумеется, алгоритм неидеален, и был написан за полчаса. Для более профессиональных целей есть готовые библиотеки, например pyzbar. Код с использованием такой библиотеки займет всего 4 строчки:
(предварительно нужно установить библиотеку, введя команду «pip install pyzbar»)
Дополнение: о подсчете CRC написал в комментариях пользователь vinograd19:
Интересна история контрольной цифры. Она возникла эволюционно. Контрольная цифра нужна для того, чтобы избежать неправильного декодирования. Если штрихкод был 1234, а его распознали как 7234, то нужна валидация, которая предупредит замену 1 на 7. Валидация может быть неточная, чтобы хотя бы в 90% невалидные номера определялись заранее.
1-й подход: Давайте просто возьмем сумму. Чтобы в остатке от деления на 10 был 0. Ну то есть первые 12 символов несут информационную нагрузку, а последняя цифры подбирается так, чтобы сумма цифр делилась на 10. Декодируем последовательность, если сумма не делится на десять — значит декодировали с багом и нужно сделать это еще раз. Например, код 1234 — валидный. 1+2+3+4 = 10. Код 1216 — тоже валидный, а вот 1218 — нет.
Это позволяет избежать проблем с автоматикой. Однако в момент создания штрихкодов был фоллбек в виде набивания номер на клавишах. И там есть плохой кейс: если поменять порядок следования двух цифр, то контрольная сумма не меняется, и это плохо. То есть если штрихкод 1234 был вбит как 2134, контрольная сумма сойдется, а вот номер мы вбили неправильный. Оказывается, неправильный порядок цифр — это распространенный кейс, если стучать по клавишам быстро.
2-й подход. Хорошо, давайте сумму сделаем чуть сложнее. Чтобы цифры на четных местах учитывались дважды. Тогда при изменении порядка, сумма точно не сойдется к нужной. Например код 2364 валидный (2 + 3+3 + 6 + 4+4 = 20), а код 3264 — невалидный (3+ 2+2 + 6 + 4+4 = 19). Но тут оказался еще один плохой пример вбития. Некоторые клавиатуры такие, что десять цифр располагаются в два ряда. первый ряд 12345 и под ним второй второй ряд 67890. Если вместо клавишы «1» нажать правее клавишу «2», то контрольная сумма предупредит неправильный ввод. А вот если вместо клавишу «1» нажать ниже клавишу «6» — то может не предупредить. Ведь 6=1+5, и в случае когда эта цифра стоит на четном месте при вычислении контрольной суммы, мы имеем 2*6 = 2*1 + 2*5. То есть контрольная сумму увеличилась ровно на 10, поэтому ее последняя цифра не изменилась. Например контрольные суммы кодв 2134 и 2634 одинаковые. Та же ошибка будет, если мы вместо 2 нажмем 7, вместо 3 нажмем 8 и тд.
3-й подход. Ок, давайте что ли возьмем опять сумму, только цифры, стоящие на четных местах будем учитывать… трижды. То есть код 1234565 — валидный, потому как 1 + 2*3 + 3 + 4*3 + 5 + 6*3 +5 = 50.
Описанный способ стал стандартом вычисления контрольной суммы EAN13 за небольшими правками: число цифр стало фиксированным и равно 13, где 13-ая — это та самая контрольная цифра. Цифры на нечетных местах считаются трижды, на четных — один раз.
Заключение
Как можно видеть, даже такая простая вещь как штрихкод, имеет в себе немало интересного. Кстати, еще один лайфхак для тех, кто дочитал до сюда — текст под штрихкодом (если он есть) полностью дублирует его содержание. Это сделано для того, чтобы в случае нечитабельности кода, оператор мог ввести его вручную. Так что узнать содержимое штрихкода обычно просто — достаточно посмотреть на текст под ним.
Как подсказали в комментариях, наиболее популярным в торговле является код EAN-13, битовое кодирование там такое же, а структуру символов желающие могут посмотреть самостоятельно.
Если у читателей не пропал интерес, отдельно можно рассмотреть QR-коды.