Алгоритм расчета контрольного числа в ИНН
Сохранить в файлеОбсудить в форуме
Описание
Функция вычисляет контрольное число ИНН и возвращает ИНН с правильно заполненными разрядами. В качестве параметра передается проверяемый ИНН(включая контрольные разряды или без них), как 10-ти,так и 12-ти разрядный.
Для справки: структура ИНН
10-ти разрядный ИНН - NNNNXXXXXC
12-ти разрядный ИНН - NNNNXXXXXXCC
где: NNNN - номер налоговой инспекции
XXXXX, XXXXXX - порядковый номер налогоплательщика (номер записи в госреестре)
C - контрольное число в 10-ти разрядном ИНН
CC - контрольное число в 12-ти разрядном ИНН (фактически, идущие подряд две контрольные цифры)
Для справки: структура ИНН
10-ти разрядный ИНН - NNNNXXXXXC
12-ти разрядный ИНН - NNNNXXXXXXCC
где: NNNN - номер налоговой инспекции
XXXXX, XXXXXX - порядковый номер налогоплательщика (номер записи в госреестре)
C - контрольное число в 10-ти разрядном ИНН
CC - контрольное число в 12-ти разрядном ИНН (фактически, идущие подряд две контрольные цифры)
Текст примера
/* Специфические таблицы, определенные МНС РФ */ array _m10, _m1_12, _m2_12; /* Для 10-ти разрядного ИНН */ _m10( 0 )=0; _m10( 1 )=2; _m10( 2 )=4; _m10( 3 )=10; _m10( 4 )=3; _m10( 5 )=5; _m10( 6 )=9; _m10( 7 )=4; _m10( 8 )=6; _m10( 9 )=8; /* Для 1-й цифры 12-ти разрядного ИНН */ _m1_12( 0 )= 0; _m1_12( 1 )= 7; _m1_12( 2 )= 2; _m1_12( 3 )= 4; _m1_12( 4 )= 10; _m1_12( 5 )= 3; _m1_12( 6 )= 5; _m1_12( 7 )= 9; _m1_12( 8 )= 4; _m1_12( 9 )= 6; _m1_12( 10 )=8; /* Для 2-й цифры 12-ти разрядного ИНН */ _m2_12( 0 )= 0; _m2_12( 1 )= 3; _m2_12( 2 )= 7; _m2_12( 3 )= 2; _m2_12( 4 )= 4; _m2_12( 5 )= 10; _m2_12( 6 )= 3; _m2_12( 7 )= 5; _m2_12( 8 )= 9; _m2_12( 9 )= 4; _m2_12( 10 )=6; _m2_12( 11 )=8; macro getKeyINN( fINN ) var cINN:string; var i:integer, v:integer, s, lf, c=0, cc=0; fINN=trim( fINN ); lf=strlen( fINN ); cINN=``; if ( lf < 11 ) /* 10-разрядный ИНН */ i=1; while ( i < 10 ) if ( i <= lf ) s=substr( fINN, i, 1 ); else /* Если задано короткое ИНН - дополняем справа нулями */ s=`0`; end; v=int( s ); c=c+v*_m10( i ); cINN=cINN+s; i=i+1; end; v=c-11*int( c/11 ); v=v-10*int( v/10 ); s=string( v:1 ); cINN=cINN+s; else /* 12-разрядный ИНН */ i=1; while ( i < 11 ) if ( i <= lf ) s=substr( fINN, i, 1 ); else /* Если задано короткое ИНН - дополняем справа нулями */ s=`0`; end; v=int( s ); c=c+v*_m1_12( i ); cc=cc+v*_m2_12( i ); cINN=cINN+s; i=i+1; end; v=c-11*int( c/11 ); v=v-10*int( v/10 ); s=string( v:1 ); cINN=cINN+s; cc=cc+v*_m2_12( i ); v=cc-11*int( cc/11 ); v=v-10*int( v/10 ); s=string( v:1 ); cINN=cINN+s; end; return cINN; end;