Расчет контрольной суммы для кода EAN-13, EAN-8
Проверка корректности ввода кода путем расчета контрольной суммы для кодов EAN-13, EAN-8
- Описание
- Подробнее
Описание
Возникла задача по выпуску дисконтных карт. База у нас самописная, а так как карты накопительные, ошибка при введении номера или считывании кода довольно критична. Приняли решение, что номер карты будет закодирован с контрольным числом по алгоритму EAN-8, а магнитный код по EAN-13. Пришлось разобраться, как считается контрольная сумма. Делюсь алгоритмом.
Алгоритм:
//1. Складываем цифры, стоящие на четных позициях, затем на нечетных позициях. Позиции считаются от контрольного числа, тоесть для 13 символов 1 -нечетный, для 8 первый четный
//2. Теперь складываем результат сложения цифр на четных позициях, помноженный на три и результат сложения цифр на нечетных позициях:
//3. Контрольное число представляет собой разницу между окончательной суммой и ближайшим к ней наибольшим числом, кратным десяти :
//4. Полученная в результате последняя семерка и соответствует контрольной цифре.
// Расчет контрольной цифры для кода EAN-8 идентичен рассмотренному выше для кода EAN-13.
Если НЕ СтрДлина(Код) = 13 и НЕ СтрДлина(Код) = 8 Тогда
Сообщить("Не верная длина кода!");
Возврат Ложь;
КонецЕсли;
Чис2=0;
ЧисЧетные = 0;
ЧисНечетные = 0;
Для ЧисХ=1 По СтрДлина(Код)-1 Цикл
Если (ЧисХ%2 = 0 и СтрДлина(Код) = 13) или
(НЕ ЧисХ%2 = 0 и СтрДлина(Код) = 8) Тогда
ЧисЧетные = ЧисЧетные + Число(Сред(Код, ЧисХ, 1));
Иначе
ЧисНечетные = ЧисНечетные + Число(Сред(Код, ЧисХ, 1));
КонецЕсли;
КонецЦикла;
Чис2 = (ЧисЧетные * 3) + ЧисНечетные;
БлижайшееКратное = Чис2;
Пока НЕ БлижайшееКратное%10 = 0 Цикл
БлижайшееКратное = БлижайшееКратное + 1;
КонецЦикла;
КонтрольноеЧисло = БлижайшееКратное - Чис2;
Если Число(Сред(Код,ЧисХ,1)) <> Число(Строка(КонтрольноеЧисло)) Тогда
Сообщить("Расчитанная контрольная сумма введённого шрихкода не совпадает с контрольной цифрой! Попробуйте ввести еще раз.");
Возврат Ложь;
КонецЕсли;
Возврат Истина;

