В среде разработчиков 1С нередко возникает дискуссия о целесообразности хранения 13-го символа штрихкода формата EAN-13. Поскольку последний символ является контрольной суммой, вычисляемой по строгому алгоритму на основе предыдущих 12 цифр, кажется логичным «сэкономить» место в базе данных и вычислять его только при необходимости (например, при печати этикетки). Однако, как показывает практика и детальный технический анализ, такое решение является классическим примером преждевременной оптимизации, которая порождает множество проблем.
В этой статье мы подробно разберем, почему хранение полного 13-значного штрихкода является золотым стандартом и какие риски несет отказ от «незначащего» символа.
Рассмотрим ситуацию с точки зрения СУБД. Штрихкод — это поле, по которому чаще всего выполняется поиск (индексируемое поле). Когда сканер считывает штрихкод с товара, он передает в систему все 13 цифр. Если в вашей базе данных хранится только 12 символов, у вас есть два пути для выполнения поиска, и оба они ведут к деградации производительности:
Вывод: Хранение эталонного 13-значного значения позволяет выполнять поиск по прямому соответствию, используя всю мощь индексов SQL.
Проанализируем ситуацию с точки зрения взаимодействия систем. Штрихкод — это ключ обмена. Если ваша система хранит 12 знаков, а внешняя (маркетплейс, поставщик, ТСД) — 13, то при любой интеграции программисту придется помнить об этой особенности.
Как отмечают опытные разработчики, такие «оптимизации» заставляют постоянно держать в голове: «Здесь мы добавляем символ для печати, здесь отрезаем для поиска, а тут пришел ответ от API, нужно проверить длину». Это увеличивает вероятность ошибок в коде и усложняет отладку. Работа с данными в том виде, в котором они существуют в реальности (на физическом носителе), — залог чистого и понятного кода.
Штрихкод EAN-13 является частью глобальной системы GTIN (Global Trade Item Number). Согласно стандартам GS1, идентификатор товара должен рассматриваться как единая неизменяемая строка. Более того:
GTIN-14, где значащими являются 13 цифр, а 14-я — контрольная.UPC-A содержит 12 цифр. Если вы храните 12 цифр от EAN-13, вы создаете риск коллизии с кодами UPC-A, так как система не сможет однозначно определить тип кода без ведущих нулей или понимания контекста.Современные сканеры и принтеры этикеток заточены под работу со стандартными форматами. Многие драйверы оборудования (особенно в 1С) ожидают на вход строку стандартной длины. Передача «обрезанного» кода может привести к ошибкам в низкоуровневых библиотеках или к некорректной печати, если алгоритм расчета контрольной суммы в прошивке принтера минимально разойдется с вашим программным алгоритмом (что случается при использовании специфических кодировок).
Если вам все же необходимо вычислить 13-й символ (например, при генерации внутреннего штрихкода), рассмотрим классический алгоритм для 1С. Разберем по шагам функцию, которая принимает 12 цифр и возвращает полный EAN-13:
Функция СгенерироватьEAN13(БазоваяЧасть12Цифр) Экспорт
Четные = 0;
Нечетные = 0;
// Проходим по всем 12 цифрам
Для Индекс = 1 По 12 Цикл
Цифра = Число(Сред(БазоваяЧасть12Цифр, Индекс, 1));
// В EAN-13 четные позиции (2, 4, 6...) имеют вес 3
Если Индекс % 2 = 0 Тогда
Четные = Четные + Цифра;
Иначе
Нечетные = Нечетные + Цифра;
КонецЕсли;
КонецЦикла;
// Вычисляем взвешенную сумму
Сумма = Четные * 3 + Нечетные;
// Находим остаток от деления на 10
Остаток = Сумма % 10;
// Контрольная цифра — это дополнение остатка до 10
КонтрольнаяЦифра = ?(Остаток = 0, 0, 10 - Остаток);
Возврат БазоваяЧасть12Цифр + Строка(КонтрольнаяЦифра);
КонецФункции
Эта функция наглядно демонстрирует, что хотя расчет и прост, выполнять его миллионы раз при каждом поиске или отображении списка товаров — нерационально с точки зрения использования ресурсов процессора.
Контрольный символ предназначен в первую очередь для защиты от ошибок. При ручном вводе штрихкода оператором наличие 13-го символа позволяет системе мгновенно проверить валидность кода, не обращаясь к базе данных. Если мы не храним 13-й символ, мы лишаем систему возможности быстрой верификации «на входе», так как любой введенный 12-значный номер будет считаться «условно правильным» до момента генерации его хвоста.
Подведем итог. Экономия 1 байта (или 2 байт в случае Unicode) на одну запись в современной архитектуре 1С не имеет никакого практического смысла. Объем дискового пространства стоит дешевле, чем время программиста на написание «костылей» для обработки обрезанных строк, и значительно дешевле, чем потеря производительности из-за неоптимальных запросов к базе данных.
Рекомендация: Всегда храните штрихкод целиком. Это обеспечит высокую скорость поиска, совместимость с любым оборудованием и упростит интеграцию с внешними системами идентификации товаров.