Проверка правильности указания ИНН, номера страхового свидетельства ПФ, ОКПО, а также расчётного и корреспондентского счетов с помощью БИКа банка
Целью данной статья является написание функций про проверки правильности указания ИНН, номера страхового свидетельства ПФ, а также расчётного и корреспондентского счетов с помощью БИКа банка. Областью применения данных функций могут служить системы электронного документооборота Вашей организации.
Проверка правильности указания ИНН:
Для 10-ти и для 12-ти значного ИНН существуют разные алгоритмы проверки правильности указания ИНН.
Для 10-ти значного ИНН алгоритм проверки выглядит следующим образом:
1. Вычисляется контрольная сумма со следующими весовыми коэффициентами: (2,4,10,3,5,9,4,6,8,0)
2. Вычисляется контрольное число как остаток от деления контрольной суммы на 11
3. Если контрольное число больше 9, то контрольное число вычисляется как остаток от деления контрольного числа на 10
4. Контрольное число проверяется с десятым знаком ИНН. В случае их равенства ИНН считается правильным.
Для 12-ти значного ИНН алгоритм проверки выглядит следующим образом:
1. Вычисляется контрольная сумма по 11-ти знакам со следующими весовыми коэффициентами: (7,2,4,10,3,5,9,4,6,8,0)
2. Вычисляется контрольное число(1) как остаток от деления контрольной суммы на 11
3. Если контрольное число(1) больше 9, то контрольное число(1) вычисляется как остаток от деления контрольного числа(1) на 10
4. Вычисляется контрольная сумма по 12-ти знакам со следующими весовыми коэффициентами: (3,7,2,4,10,3,5,9,4,6,8,0).
5. Вычисляется контрольное число(2) как остаток от деления контрольной суммы на 11
6. Если контрольное число(2) больше 9, то контрольное число(2) вычисляется как остаток от деления контрольного числа(2) на 10
7. Контрольное число(1) проверяется с одиннадцатым знаком ИНН и контрольное число(2) проверяется с двенадцатым знаком ИНН. В случае их равенства ИНН считается правильным.
Проверка правильности указания номера страхования свидетельства ПФ:
Алгоритм проверки номера свидетельства страхования ПФ:
1. Вычисляется контрольная сумма по первым 9-ти цифрам со следующими весовыми коэффициентами: (9,8,7,6,5,4,3,2,1).
2. Вычисляется контрольное число как остаток от деления контрольной суммы на 101
3. Контрольное число сравнивается с двумя последними цифрами номера страхования свидетельства ПФ. В случае их равенства номер страхования свидетельства ПФ считается правильным.
Проверка правильности указания ОКПО:
Алгоритм проверки ОКПО:
1. Вычисляется контрольная сумма по 7-и цифрам со следующими весовыми коэффициентами: (1,2,3,4,5,6,7).
2. Вычисляется контрольное число(1) как остаток от деления контрольной суммы на 11.
3. Вычисляется контрольная сумма по 7-и цифрам со следующими весовыми коэффициентами: (3,4,5,6,7,8,9).
4. Вычисляется контрольное число(2) как остаток от деления контрольной суммы на 11. Если остаток от деления равен 10-ти, то контрольному числу(2) присваивается ноль.
5. Если контрольное число(1) больше девяти, то восьмой знак ОКПО сравнивается с контрольным числом(2), иначе восьмой знак ОКПО сравнивается с контрольным числом(1). В случае их равенства ОКПО считается правильным.
Проверка правильности указания корреспондентского счёта:
Алгоритм проверки корреспондентского счёта с помощью БИКа банка:
1. Для проверки контрольной суммы перед корреспондентским счётом добавляются “0” и два знака БИКа банка, начиная с пятого знака.
2. Вычисляется контрольная сумма со следующими весовыми коэффициентами: (7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1)
3. Вычисляется контрольное число как остаток от деления контрольной суммы на 10
4. Контрольное число сравнивается с нулём. В случае их равенства корреспондентский счёт считается правильным.
Проверка правильности указания расчётного счёта:
Алгоритм проверки расчётного счёта с помощью БИКа банка:
1. Для проверки контрольной суммы перед расчётным счётом добавляются три последние цифры БИКа банка.
2. Вычисляется контрольная сумма со следующими весовыми коэффициентами: (7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1)
3. Вычисляется контрольное число как остаток от деления контрольной суммы на 10
4. Контрольное число сравнивается с нулём. В случае их равенства расчётного счёт считается правильным.
Приступим к написанию наших функций:
1. Проверка правильности указания 10-ти значного ИНН:
function CheckINN_10(const Value:String):Boolean;
const INNMask: array [1..10] of byte = (2,4,10,3,5,9,4,6,8,0); // весовые коэффициенты
var C,I,Summa:Integer;
begin
Result:=False;
Summa:=0;
for I:=1 to 10 do
begin
if not (Value[I] in [‘0’..’9′]) then
exit;
Summa:=Summa+(StrToInt(Value[I])*INNMask[I]); // вычисляем контрольную сумму
end;
C:=Summa mod 11; // вычисляем контрольное число как остаток от деления контрольной суммы на 11
if C>9 then // если контрольное число больше девяти вычисляем остаток от деления на 10
C:= C mod 10;
Result:=(C=StrToInt(Value[10])); // проверяем соответствие контрольного числа десятому знаку ИНН
end;
2. Проверка правильности указания 12-ти значного ИНН:
function CheckINN_12(const Value:String):Boolean;
const INNMask: array [1..12] of byte = (3,7,2,4,10,3,5,9,4,6,8,0); // весовые коэффициенты
var C_11,C_12,I,Summa:Integer;
begin
Result:=False;
Summa:=0;
for I:=1 to 11 do
begin
if not (Value[I] in [‘0’..’9′]) then
exit;
Inc(Summa,StrToInt(Value[I])*INNMask[I+1]); // вычисляем контрольную сумму по 11-ти знакам
end;
C_11:=Summa mod 11; // вычисляем контрольное число(1)
if C_11>9 then
C_11:=C_11 mod 10;
if (C_11<>StrToInt(Value[11])) then // проверяем соответствие контрольного числа(1) одиннадцатому знаку ИНН
exit;
Summa:=0;
for I:=1 to 12 do
begin
if not (Value[I] in [‘0’..’9′]) then
exit;
Inc(Summa,StrToInt(Value[I])*INNMask[I]); // вычисляем контрольную сумму по 12-ти знакам
end;
C_12:=Summa mod 11; // вычисляем контрольное число(2)
if C_12>9 then
C_12:=C_12 mod 10;
Result:=(C_12=StrToInt(Value[12])); // проверяем соответствие контрольного числа(2) двенадцатому знаку ИНН
end;
3. Проверка правильности указания ИНН:
function CheckINN(const Value:String):Boolean;
begin
Result:=((Length(Value)=10) and CheckINN_10(Value)) or
((Length(Value)=12) and CheckINN_12(Value));
end;
4. Проверка правильности указания номера страхового свидетельства ПФ:
function CheckPFNumber(const Value:String):Boolean;
var I,Summa:Integer;
begin
Result:=False;
if Length(Value)<>11 then
exit;
for I:=1 to 11 do
if not (Value[I] in [‘0’..’9′]) then
exit;
Summa:=0;
for I:=1 to 9 do
Inc(Summa,StrToInt(Value[I])*(10-I)); // вычисляем контрольную сумму
Result:=StrToInt(Copy(Value,10,2))=(Summa mod 101); // проверяем остаток от деления контрольной суммы на 101 с двумя последними числам
end;
5. Проверка правильности указания ОКПО:
function CheckOKPO(const Value:String):Boolean;
var I,Summa,Summa2:Integer;
begin
Result:=False;
if Length(Value)<>8 then
exit;
for I:=1 to 8 do
if not (Value[I] in [‘0’..’9′]) then
exit;
Summa:=0;
Summa2:=0;
for I:=1 to 7 do
begin
Inc(Summa,StrToInt(Value[I])*I); // вычисляем контрольную сумму(1)
Inc(Summa2,StrToInt(Value[I])*(I+2)); // вычисляем контрольную сумму(2)
end;
C:=Summa mod 11; // вычисляем контрольное число(1)
if C>9 then
begin
C:=Summa2 mod 11; // вычисляем контрольное число(2)
if C=10 then
C:=0;
end;
Result:=(C=StrToInt(Value[8])); // проверяем соответствие контрольного числа восьмому знаку ОКПО
end;
6. Проверка правильности указания банковского счёта:
function CheckSchet(const Value:String):Boolean;
const SchetMask: array [1..23] of byte = (7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1); // весовые коэффициенты
var I,Summa:Integer;
begin
Result:=False;
Summa:=0;
for I:=1 to 23 do
begin
if not (Value[I] in [‘0’..’9′]) then
exit;
Summa:=Summa+(StrToInt(Value[I])*SchetMask[I]) mod 10; // вычисляем контрольную сумму
end;
Result:=(Summa mod 10 = 0); // проверяем остаток от деления контрольной суммы на 10 с нулём
end;
7. Проверка правильности указания корреспондентского счёта:
function CheckKS(const Value,BIK:String):Boolean;
begin
Result:=(Length(Value)=20) and CheckSchet(‘0’+Copy(BIK,5,2)+Value);
end;
8. Проверка правильности указания расчётного счёта:
function CheckRS(const Value,BIK:String):Boolean;
begin
Result:=(Length(Value)=20) and CheckSchet(Copy(BIK,Length(BIK)-2,3)+Value);
end;
По материалам сайта 4632.ru
Ну что сказать. Как на меня, то блог просто супер! И посты интересные.