gifts2017

Расчет контрольной суммы для кода EAN-13, EAN-8

Опубликовал Борис Котляр (bborisko) в раздел Программирование - Практика программирования

Проверка корректности ввода кода путем расчета контрольной суммы для кодов 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)) <> Число(Строка(КонтрольноеЧисло)) Тогда
		Сообщить("Расчитанная контрольная сумма введённого шрихкода не совпадает с контрольной цифрой! Попробуйте ввести еще раз.");
		Возврат Ложь;
	КонецЕсли;
	Возврат Истина;

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Роман Ложкин (webester) 27.08.16 07:20
Можно было открыть УТ и взять оттуда :) их там (проверок и расчетов), на любой вкус.
2. Vladimir Polyakov (spectre1978) 27.08.16 11:04
Во времена ТиС семерки это все свободно лежало в глобальнике и искалось по тексту "глКонтрольныйСимволEAN". И ограничение на 8 или 13 символов - искусственное, алгоритм без особенных проблем адаптируется к любому количеству цифр, что мне один раз и пришлось проделать. Вопрос только в том, что чем больше цифр, тем больше вероятность неоднократной ошибки и получения из-за этого проверочной цифры, которая сойдется с исходной, хотя код неверен.
3. Борис Котляр (bborisko) 27.08.16 12:26
(1) webester, Наверно стоило поискать в типовой, но зато изучил как считается, а так бы просто скопипастил.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа