Имя: Пароль:
1C
 
v7: Алгоритм проверки валидности ИИН/БИН Казахстан (и ИНН в РФ)
0 1Сергей
 
13.04.10
07:53
Казахстанцы! Вы уже столкнулись с этими кодами?
Проверил ИИН у 4-х сотрудников, ни у одного не корректен.
Не могу понять. Вот тут подробно написано про генерацию ИИН и проверку на валидность:
http://ru.government.kz/documents/premlaw/06.2003/page23
Меня интересует именно проверка:
a12=(1*a1+3*a2+7*a3+9*а4+3*а5+1*а6+9*a7+7*a8+3*a9+9*a10
+1*a11) mod 10

// спи... позаимствовано из типовой :)
Функция глВалидностьИН(Значение) Экспорт
// Вычисление контрольного разряда (взято с типовой)
   
   Статус = 0;
   
   //Проверка на длину ИИН/БИН
   Если СтрДлина(СокрЛП(Значение))<12 Тогда
       Сообщить("Количество знаков в ИИН/БИН меньше 12!","!!!");
       
       // проверка на одиниковость всех цифр
   ИначеЕсли СтрЧислоВхождений(Значение, Лев(Значение,1))=12 Тогда
       Сообщить("Цифра " + Лев(Значение,1) + " повторяется 12 раз!","!!!");
       
       // проверяем ИИН/БИН на корректность
       // a12=(1*a1+3*a2+7*a3+9*а4+3*а5+1*а6+9*a7+7*a8+3*a9+9*a10+1*a11) mod 10,
   Иначе
       
       ПодстрокаИН11 = Лев(Значение,11);        // копируем первые 11 символов
       КонтрольноеЗначение = Прав(Значение,1);    // контрольная сумма ИИН/БИН
       
       СуммаРазрядов =1*Сред(Значение,1,1)+3*Сред(Значение,2,1)+7*Сред(Значение,3,1)+9*Сред(Значение,4,1)+3*Сред(Значение,5,1)+1*Сред(Значение,6,1)+9*Сред(Значение,7,1)+7*Сред(Значение,8,1)+3*Сред(Значение,9,1)+9*Сред(Значение,10,1)+1*Сред(Значение,11,1);
       ВычисленноеКонтрольноеЗначение = СуммаРазрядов - Цел(СуммаРазрядов/10)*10;
       
       Если ВычисленноеКонтрольноеЗначение = Число(КонтрольноеЗначение) Тогда
           Сообщить("Введенный ИИН/БИН корректен!");
           Статус = 1;
       Иначе
           Сообщить("Введенный ИИН/БИН некорректен!","!!!");
           Статус = 0;
       КонецЕсли;
   КонецЕсли;
   
   Возврат Статус;
КонецФункции // глВалидностьИН

Может, я чего-то не знаю? Проверил 4-х сотрудников. ИИН переписывал прямо с удостоверения. И ни у одного не правильно. Как так?
1 KishMish
 
13.04.10
08:11
с иин не пробывал. с бин вот были заморочки. так и не понял.
и еще, как они пишут?
вот это
СуммаРазрядов - Цел(СуммаРазрядов/10)*10;
проще написать
СуммаРазрядов%10
....
но может быть в этом проблема

До перерегистрации и замены ранее выданных документов, удостоверяющих личность, на документы нового образца (smart-карточки) при создании Государственных баз данных физических (юридических) лиц используется ID-код, впечатанный в документах, удостоверяющих личность гражданина, с алгоритмом расчета контрольного 12-го разряда по модулю 11 в два цикла.
главное тут "по модудулю 11"
как то так
2 1Сергей
 
13.04.10
08:15
(1) 1. Пробовал и %. Результат тот же.
2. А можно ссылку? И как это понять "по модулю 11 в два цикла"?
3 1Сергей
 
13.04.10
08:19
(2)+ 2. нашел. в моей же ссылке :) сорри

однако, всё равно не понятно. Буду копать
4 KishMish
 
13.04.10
08:22
по модулю 11 означает
СуммаРазрядов%11
в два цикла значит двжады. чтоб 100пуд получилась цифра, а не число
(например 21%11=10, а должна быть цифра 0-9)
я думаю так
(СуммаРазрядов%11)%11
5 1Сергей
 
13.04.10
08:24
(4) не... лажа
СуммаРазрядов % 11 % 11 % 11 % 11 % 11 % 11 = 10
6 KishMish
 
13.04.10
08:29
(5) мя, ступил
10%11=10
тада не знаю, если найдешь решение отпишись. чую, мне тоже самое грозит... )))
7 Рэйв
 
13.04.10
08:30
(0)ИИН с удостоверения?  Его там пишут чтоли?  Может ты номер удостоверения проверяешь?
8 1Сергей
 
13.04.10
08:31
(7) здасьте... Если на Вашем удостоверении нет ИИН, то срочно меняйте
9 KishMish
 
13.04.10
08:32
(7)ИИН давно ужо на удлич пишут. у меня даже штрихкод есть
10 Рэйв
 
13.04.10
08:32
(8)У меня нет. У меня отдельная красивая гербовая бумажка с финтифлюшками защиты.
11 KishMish
 
13.04.10
08:47
в два цикла может вот что
КонтрольаяСумма%11 = ab
КонечныйРезультат = a+b
в рк общение с госорганами часто напоминает "занимательную математику"
12 1Сергей
 
13.04.10
08:56
(11) попробую этот вариант
ЗЫ
на одном форуме советовали забить и не париться :)
13 skunk
 
13.04.10
09:08
(11)неправильный
14 1Сергей
 
13.04.10
09:09
(13) Может, ты знаешь где собака зарыта?
15 Name2006
 
13.04.10
09:11
(12) Забей и не парься.
16 skunk
 
13.04.10
09:23
(14)неа ... просто максимальное число от Число%11 может быть 10 ...
17 1Сергей
 
13.04.10
09:24
(16) это то понятно. Вот этот ребус видимо не сможет расшифровать, даже тот, кто его написал: "по модулю 11 в два цикла"
18 skunk
 
13.04.10
09:30
а в какой программе проверяет корректно?
19 aka AMIGO
 
13.04.10
09:30
сможете посмотреть вот тут?
http://www.anton-pribora.ru/articles/php/php-javascript-inn/
20 aka AMIGO
 
13.04.10
09:34
+19 в яндексе много чего по "ИНН проверка на валидность".. глаза разбегаются :)
21 1Сергей
 
13.04.10
09:37
(20) не путай российский иНн с казахстанским иИн
22 aka AMIGO
 
13.04.10
09:37
(21) виноват.. :(
23 skunk
 
13.04.10
09:41
(21)знаешь в какой программе он проверяет корректно?
24 1Сергей
 
13.04.10
09:45
(23) неа. нигде не проверяет, насколько я знаю
25 OFF
 
13.04.10
09:46
(23) из 41 проверенного БИНа по данной формуле корректными оказались только 12, в то же время они не корректны при проверке в минюсте.
26 aka AMIGO
 
13.04.10
09:47
вот казахский сайт, а вдруг есть про валидность/проверку:
http://www.balans.kz/search.php
27 OFF
 
13.04.10
09:48
+(25) об этом говорилось на партнерском 14.07.2009, в формуле ниче не изменилось кроме очепятки "1*Сред(Значение,111,1);"
28 1Сергей
 
13.04.10
09:48
(26) смотрел я там, вот:
http://www.balans.kz/topic17993.html?print=yes
там как раз и посоветовали забить...
29 1Сергей
 
13.04.10
09:50
(27) Кстати, один из ИИН при такой ошибке срабатывает нормально
30 aka AMIGO
 
13.04.10
09:59
вот еще нашел, по-моему, свежая:
http://www.gotdotnet.ru/blogs/kidinfo/7516/
31 skunk
 
13.04.10
10:02
(30)это вроде то, что нужно ... осталось только понять как определить когда проверять по модулю 11 в два цикла
32 1Сергей
 
13.04.10
10:02
(27) А... Так это Вы и посоветовали? :)
(30) о, спасибо! Курю
33 1Сергей
 
13.04.10
10:16
Вроде работает
34 1Сергей
 
13.04.10
10:19
Вот что получилось:

Функция глВалидностьИН(Значение) Экспорт
// Вычисление контрольного разряда (взято с типовой)
   
   Статус = 0;
   
   //Проверка на длину ИИН/БИН
   Если СтрДлина(СокрЛП(Значение))<12 Тогда
       Сообщить("Количество знаков в ИИН/БИН меньше 12!","!!!");
       
       // проверка на одиниковость всех цифр
   ИначеЕсли СтрЧислоВхождений(Значение, Лев(Значение,1))=12 Тогда
       Сообщить("Цифра " + Лев(Значение,1) + " повторяется 12 раз!","!!!");
       
       // проверяем ИИН/БИН на корректность
       // a12=(1*a1+3*a2+7*a3+9*а4+3*а5+1*а6+9*a7+7*a8+3*a9+9*a10+1*a11) mod 10,
   Иначе
       
       ПодстрокаИН11 = Лев(Значение,11);        // копируем первые 11 символов
       КонтрольноеЗначение = Число(Сред(Значение,12,1));
       
       СуммаРазрядов =    1*Сред(ПодстрокаИН11,1,1)+
                       2*Сред(ПодстрокаИН11,2,1)+
                       3*Сред(ПодстрокаИН11,3,1)+
                       4*Сред(ПодстрокаИН11,4,1)+
                       5*Сред(ПодстрокаИН11,5,1)+
                       6*Сред(ПодстрокаИН11,6,1)+
                       7*Сред(ПодстрокаИН11,7,1)+
                       8*Сред(ПодстрокаИН11,8,1)+
                       9*Сред(ПодстрокаИН11,9,1)+
                       10*Сред(ПодстрокаИН11,10,1)+
                       11*Сред(ПодстрокаИН11,11,1);
       ВычисленноеКонтрольноеЗначение = СуммаРазрядов % 11;
       
       Если ВычисленноеКонтрольноеЗначение = 10 Тогда
           СуммаРазрядов =    3*Сред(ПодстрокаИН11,1,1)+
                           4*Сред(ПодстрокаИН11,2,1)+
                           5*Сред(ПодстрокаИН11,3,1)+
                           6*Сред(ПодстрокаИН11,4,1)+
                           7*Сред(ПодстрокаИН11,5,1)+
                           8*Сред(ПодстрокаИН11,6,1)+
                           9*Сред(ПодстрокаИН11,7,1)+
                           10*Сред(ПодстрокаИН11,8,1)+
                           11*Сред(ПодстрокаИН11,9,1)+
                           1*Сред(ПодстрокаИН11,10,1)+
                           2*Сред(ПодстрокаИН11,11,1);
       КонецЕсли;
       
       Если ВычисленноеКонтрольноеЗначение = КонтрольноеЗначение Тогда
           Сообщить("Введенный ИИН/БИН корректен!");
           Статус = 1;
       Иначе
           Сообщить("Введенный ИИН/БИН некорректен!","!!!");
           Статус = 0;
       КонецЕсли;
   КонецЕсли;
   
   Возврат Статус;
КонецФункции // глВалидностьИН
35 1Сергей
 
13.04.10
10:20
Одно не понятно - "Если полученное число также равно 10, то данный ИИН не используется". Это как понимать?
36 1Сергей
 
13.04.10
10:21
(34) ошибочка.

       Если ВычисленноеКонтрольноеЗначение = 10 Тогда
           СуммаРазрядов =    3*Сред(ПодстрокаИН11,1,1)+
                           4*Сред(ПодстрокаИН11,2,1)+
                           5*Сред(ПодстрокаИН11,3,1)+
                           6*Сред(ПодстрокаИН11,4,1)+
                           7*Сред(ПодстрокаИН11,5,1)+
                           8*Сред(ПодстрокаИН11,6,1)+
                           9*Сред(ПодстрокаИН11,7,1)+
                           10*Сред(ПодстрокаИН11,8,1)+
                           11*Сред(ПодстрокаИН11,9,1)+
                           1*Сред(ПодстрокаИН11,10,1)+
                           2*Сред(ПодстрокаИН11,11,1);
           ВычисленноеКонтрольноеЗначение = СуммаРазрядов % 11;
       КонецЕсли;
37 skunk
 
13.04.10
10:30
если и в ту и в другую сторону получишь число 10, то что-то напарил в первых 11 цифрах
38 1Сергей
 
13.04.10
10:34
(37) ок. Моя функция скажет что некорректный в таком случае
39 aka AMIGO
 
13.04.10
11:23
Приведу функцию для проверки валидности ИНН в РФ, пусть будет до кучи..:

Функция Валид(ИНН)
   
   ИНН = СокрЛП(ИНН);
   
   Если СтрДлина(ИНН)=10 Тогда
       КонтрольнаяСтрока = Прав(ИНН,1);
       СуммаРазрядов =    
       2*Сред(ИНН,1,1)+
       4*Сред(ИНН,2,1)+
       10*Сред(ИНН,3,1)+
       3*Сред(ИНН,4,1)+
       5*Сред(ИНН,5,1)+
       9*Сред(ИНН,6,1)+
       4*Сред(ИНН,7,1)+
       6*Сред(ИНН,8,1)+
       8*Сред(ИНН,9,1);
       
       ВычисленноеКонтрольноеЗначение = ""+(СуммаРазрядов % 11) % 10;
       Если ВычисленноеКонтрольноеЗначение <> КонтрольнаяСтрока Тогда
           Возврат "Ошибка в ИНН!";
       КонецЕсли;
       
   ИначеЕсли СтрДлина(ИНН)=12 Тогда
       КонтрольнаяСтрока = Прав(ИНН,2);
       СуммаРазрядов =    
       7*Сред(ИНН,1,1)+
       2*Сред(ИНН,2,1)+
       4*Сред(ИНН,3,1)+
       10*Сред(ИНН,4,1)+
       3*Сред(ИНН,5,1)+
       5*Сред(ИНН,6,1)+
       9*Сред(ИНН,7,1)+
       4*Сред(ИНН,8,1)+
       6*Сред(ИНН,9,1)+
       8*Сред(ИНН,10,1);
       
       СуммаРазрядов1 = (СуммаРазрядов % 11) % 10;
       
       СуммаРазрядов2 =    
       3*Сред(ИНН,1,1)+
       7*Сред(ИНН,2,1)+
       2*Сред(ИНН,3,1)+
       4*Сред(ИНН,4,1)+
       10*Сред(ИНН,5,1)+
       3*Сред(ИНН,6,1)+
       5*Сред(ИНН,7,1)+
       9*Сред(ИНН,8,1)+
       4*Сред(ИНН,9,1)+
       6*Сред(ИНН,10,1)+
       8*СуммаРазрядов1;
       
       ВычисленноеКонтрольноеЗначение = ""+СуммаРазрядов1+(СуммаРазрядов2 % 11) % 10;
       Если ВычисленноеКонтрольноеЗначение <> КонтрольнаяСтрока Тогда
           Возврат "Ошибка в ИНН!";
       КонецЕсли;
   Иначе
       Возврат "Ошибочная длина ИНН!";
   КонецЕсли;
   
КонецФункции
40 aka AMIGO
 
13.04.10
11:31
+39 Веса разрядов ИНН взяты из функции, описанной в
http://www.anton-pribora.ru/articles/php/php-javascript-inn/

<script type="text/javascript">
// Функция для проверки правильности ИНН
function is_valid_inn( $inn )
{
   if ( preg_match('/\D/', $inn) ) return false;
   
   $inn = (string) $inn;
   $len = strlen($inn);
   
   if ( $len === 10 )
   {
       return $inn[9] === (string) (((
           2*$inn[0] + 4*$inn[1] + 10*$inn[2] +
           3*$inn[3] + 5*$inn[4] +  9*$inn[5] +
           4*$inn[6] + 6*$inn[7] +  8*$inn[8]
       ) % 11) % 10);
   }
   elseif ( $len === 12 )
   {
       $num10 = (string) (((
            7*$inn[0] + 2*$inn[1] + 4*$inn[2] +
           10*$inn[3] + 3*$inn[4] + 5*$inn[5] +
            9*$inn[6] + 4*$inn[7] + 6*$inn[8] +
            8*$inn[9]
       ) % 11) % 10);
       
       $num11 = (string) (((
           3*$inn[0] +  7*$inn[1] + 2*$inn[2] +
           4*$inn[3] + 10*$inn[4] + 3*$inn[5] +
           5*$inn[6] +  9*$inn[7] + 4*$inn[8] +
           6*$inn[9] +  8*$inn[10]
       ) % 11) % 10);
       
       return $inn[11] === $num11 && $inn[10] === $num10;
   }
   
   return false;
}
?>
41 BOZKURT
 
13.04.10
11:43
подпишусь.
скоро придется на шарпе такое ваять.
AdBlock убивает бесплатный контент. 1Сергей