![]() |
![]() |
![]() |
|
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
|
подпишусь.
скоро придется на шарпе такое ваять. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |