НОВОСТИ
Закончено опубликование всех проектов за 2009 и начало 2010 года. Маленький юбилей - общее количество проектов "перешагнуло" 90. Хотя каждый проект уникален в своем решении, качестве и подходе. И рассматривать "массу", не очень верный путь.
архив новостей
02.04.2010
СТАТЬИ - Проверка РНН на корректность (13.03.2004)

ПРОВЕРКА РНН НА КОРРЕКТНОСТЬ

ЛИТОШЕНКО Олег

Коротко:В данной статье рассказывается о методесоставления РНН, и описывается проверка"на верность" РНН. В статье естьпример функции для проверки РНН.

Проверка РНН происходит по алгоритму похожему на CRC. Согласно банковским форматам. Цитирую:
----
Структура РНН.
РНН (Регистрационный Номер Налогоплательщика) представляет собой 12-ти разрядное число.

Алгоритм вычисления контрольного разряда РНН

* Каждому разряду РНН (счет сверху вниз), исключая последний 12-й разряд, присваивается вес от 1 до 10 (т.е. вес не может иметь значение больше 10). 11-й разряд имеет вес равный 1.
Пример 1.
РНН: 6 0 0 4 0 0 0 0 0 0 9
Вес: 1 2 3 4 5 6 7 8 9 10 1

Определяется сумма произведений значений каждого разряда на его вес

* Полученная сумма делится на 11 и выделяется целая часть.
C=S/11
* Определяется разница между суммой произведений и целочисленным вхождением по модулю 11 в эту сумму.
K=S-C*11
* Если полученная разница меньше 10, то она является значением контрольного разряда. В противном случае, расчет повторяется, начиная с веса 2. Если результат при 10 циклах повторения расчета всегда имеет значение больше или равно 10, то данное число для РНН исключается.

Пример: Вычислить контрольный разряд для РНН 60040000009К
РНН: 6 0 0 4 0 0 0 0 0 0 9
Вес: 1 2 3 4 5 6 7 8 9 10 1

S=(6*1)+(0*2)+(0*3)+(4*4)+(0*5)+(0*6)+(0*7)+(0*8)+(0*9)+(0*10)+(9*1)=31
C=31/11=2
K=31-(2*11)=9
РНН:600400000099
----

Дополнение

1. Разъясняем, что при вычислении контрольного разряда РНН в случае, если после первого прохода контрольное число получается больше 10, расчет повторяется, но каждому разряду вес присваивается, начиная с 2. Для третьего прохода соответственно с 3 и т.д.

Пример: Вычислить контрольную сумму разряда для РНН 60050000742К
Проход №1
РНН: 6 0 0 5 0 0 0 0 7 4 2
Вес: 1 2 3 4 5 6 7 8 9 10 1

S1=(6*1)+(0*2)+(0*3)+(5*4)+(0*5)+(0*6)+(0*7)+(0*8)+(7*9)+(4*10)+(2*1)=131
C1=131/11=11
K1= 131-(11*11)=10
Проход №2
РНН: 6 0 0 5 0 0 0 0 7 4 2
Вес: 2 3 4 5 6 7 8 9 10 1 2

S1=(6*2)+(0*3)+(0*4)+(5*5)+(0*6)+(0*7)+(0*8)+(0*9)+(7*10)+(4*1)+(2*2)=115
C1=115/11=10
K1= 115-(10*11)=5

РНН: 600500007425

2. Значение всех разрядов РНН не должно быть одинаковым. То есть числа не допускаются как РНН
Пример: 111111111111, 333333333333 и т.д.
---

Функция проверки РНН на Pascal. Данная функция проверки была применена в программе формирования пенсионных отчислений Visual ГЦВП Pro, начиная с версии 1.1.1.112. Программу можно слить с www.lio.kz
---
// Функция проверяет правильность введенного РНН по контрольной сумме
// -----------------
// Параметры:
// rnn:string - РНН
// Выходные параметры:
// boolean - если истина тогда РНН верный, иначе не верный
// -----------------
// Комментарий:
// -----------------
// Дата создания: 23.11.2003
function TestRNN(rnn:String):boolean;
const
// маска чек суммы
mask:array[1..10,1..11]of byte=
((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1),
(2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2),
(3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3),
(4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4),
(5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5),
(6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6),
(7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7),
(8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8),
(9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9),
(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
var
    I: integer;
    Ar: array[1..12]of byte;
    c1: integer;
    c: integer;
    k: integer;
begin
  Result:=false;
  if Length(rnn)<>12 then exit;
  try
    // заполнение массива
    for i:=1 to 12 do
      ar[i]:=StrToInt(rnn[i]);

    // перебег по маске
    for i:=1 to 10 do
    begin
    // подсчет
      c:=(ar[1]*mask[i,1])+
           (ar[2]*mask[i,2])+
           (ar[3]*mask[i,3])+
           (ar[4]*mask[i,4])+
           (ar[5]*mask[i,5])+
           (ar[6]*mask[i,6])+
           (ar[7]*mask[i,7])+
           (ar[8]*mask[i,8])+
           (ar[9]*mask[i,9])+
           (ar[10]*mask[i,10])+
           (ar[11]*mask[i,11]);
      c1:=c div 11;
      k:=c-c1*11;
      if k<10 then
      begin
        Result:=ar[12]=k;
        break;
      end;
    end;
  except
  end;
end;
---

Имя: Абдуллатипов Алик
e-mail: 7998523@mail.ru 

Процедура проверки на корректность РНН наFoxpro:

---
function checkrnn
parameters rnn
if len(alltrim(rnn))<>12
   return .f.
endif
if inlist(rnn,'111111111111','222222222222','333333333333','444444444444',;
  '555555555555','666666666666','777777777777','888888888888',;
  '999999999999','000000000000')
  return .f.
endif
dimension rnn1[12]
private i,j,sum,koef,k
for i=1 to 12
   rnn1[i]=val(substr(rnn,i,1))
endfor
for i=0 to 9
  sum=0
  for j=1 to 11
     koef=i+j
     if koef>10
       koef=koef-10
     endif
     sum=sum+koef*rnn1[j]
   endfor
   k=sum-int(sum/11)*11
   if k<10
      if k=rnn1[12]
         return .t.
      else
         return .f.
      endif
   endif
endfor
return .f.
---

безсогласия автора публикация, распространениезапрещена

© Разработка ТОО "LiO Programs" 1999-2010
1-1 1-2
2-1
тел: +7 7252 558115
сот: +7 701 3528510, +7 700 4503956
web: www.lio.kz, www.hlp.kz
email: lio@lio.kz