• 21015
  • 10
  • 5
Нравится блог?
Подписывайтесь!

ИИН. Алгоритм расчета и проверки

В моих проектах часто необходимо вносить данные по клиентам, которые обязательно сопровождаются внесением данных ИИН. Долгое время я собирал данные о том, что такое ИИН и как проверять правильность его ввода. На просторах интернета уже есть несколько постов с необходимой информацией, но, к сожалению, часто бывает, что информация неверная, или не подкреплена никакими официальными источниками.

Сегодня мы с вами попытаемся разобраться в этом вопросе с точки зрения Казахстанского законодательства, а также набросаем простой скрипт проверки ИИН на Javascript.

ИИН - индивидуальный идентификационный номер. Это понятие очень схоже с другой аббревиатурой: БИН - бизнес идентификационный номер. Мы будем рассматривать оба понятия.

Мы не будем вдаваться в подробности о том, когда началось зарождение идеи ИИН/БИН, а сразу перейдем к первому важному в этом вопросе постановлению.

Постановление Правительства Республики Казахстан от 11 июня 2003 года №565 "Об утверждении Программы перехода на единый номер физического (юридического) лица (идентификационный номер (бизнес-идентификационный номер) в целях создания Национальных реестров Республики Казахстан"

Здесь нас интересуют подразделы 2, 3, 4 раздела 5.

2. Структура ИИН (БИН)
За основу структуры ИИН предлагается взять двенадцатизначный идентификационный код гражданина, используемый в настоящее время Министерством внутренних дел Республики Казахстан. По информации Министерства внутренних дел похожие структуры кода применяются в Дании, Финляндии, Японии, Германии, США, Франции, Кувейте, Малайзии, Мальте, Ботсване, Кипре, Египте, Латвии, Литве, Эстонии, Белоруссии и других странах. В Казахстане данный код используется с 1997 года.
Преимущество этого кода заключается в его хорошей запоминаемости и информативности для физических лиц, поскольку в структуре действующего идентификационного кода гражданина присутствуют в определенной комбинации известные гражданину сведения, такие как дата, месяц и год рождения, а также пол и век физического лица.
При разработке структуры БИН предлагается использовать двенадцатиразрядный код, контрольный разряд которого будет рассчитываться аналогично расчету контрольного разряда ИИН.
В структуре ИИН (БИН) предлагается использовать только цифровые значения. Структура представляет собой характеристику последовательности цифр слева направо. Для удобства описания несколько разрядов, имеющих сходную и (или) одинаковую характеристику, могут быть объединены в один фасет.

3. Алгоритм генерирования ИИН
Предлагается следующий алгоритм генерирования ИИН:
1) первый фасет - содержит 6 разрядов (с а1 по а6) и характеризует год (две последние цифры), месяц и дату рождения физического лица;
2) второй фасет - содержит 1 (а7) разряд и характеризует пол физического лица и век его рождения. Причем при определении значения разряда для мужчин используются нечетные цифры, а для женщин - четные цифры.
Конкретные значения данного разряда выглядят следующим образом:
1 - для мужчин, родившихся в 19 веке;
2 - для женщин, родившихся в 19 веке;
3 - для мужчин, родившихся в 20 веке;
4 - для женщин, родившихся в 20 веке;
5 - для мужчин, родившихся в 21 веке;
6 - для женщин, родившихся в 21 веке.
Следовательно, в данном разряде имеются резервные значения 7, 8, 9 и 0;
3) третий фасет - содержит 4 разряда (с а8 по а11) и характеризует порядковый номер регистрации в системе. По данным Агентства по статистике Республики Казахстан максимальное количество родившихся в один день (начиная с 1999 года) - 1229 человек, поэтому 4 знака для порядкового номера регистрации вполне достаточно. Порядковый номер регистрации проставляется сплошной нумерацией в рамках одной группы (года рождения);
4) четвертый фасет - содержит 1 разряд (а12) и является контрольным разрядом ИИН. Алгоритм расчета контрольного разряда ИИН приведен в параграфе 5 главы 5 Программы.

Индивидуальные предприниматели, осуществляющие свою деятельность в форме личного предпринимательства (далее - ИП(Л)), будут использовать ИИН, который был присвоен физическому лицу при рождении.

4. Алгоритм генерирования БИН
Предлагается следующий алгоритм генерирования БИН:
1) первый фасет - содержит 4 разряда (с а1 по а4) и характеризует год (две последние цифры) и месяц регистрации юридического лица или индивидуального предпринимателя, осуществляющего деятельность на основе совместного предпринимательства (далее - ЮЛ или ИП(С));
2) второй фасет - содержит 1 разряд (а5) и характеризует тип ЮЛ или ИП(С). Кроме того, алгоритм задания значения данного разряда также используется для исключения возможности совпадения БИН с ИИН.
Поскольку в структуре ИИН а5 (пятый разряд) означает первую цифру даты рождения, то, учитывая, что дата рождения может начинаться только с 0, 1, 2 или 3 (например, 01, 11, 21, 31), обязательным условием в генерировании в структуре БИН а5 (пятого разряда) будет исключение использования цифр 0, 1, 2 и 3.
Предлагается использовать следующие конкретные значения данного разряда:
4 - для юридических лиц-резидентов;
5 - для юридических лиц-нерезидентов;
6 - для индивидуальных предпринимателей, осуществляющих деятельность на основе совместного предпринимательства.
Следовательно, в данном разряде имеются резервные значения 7, 8 и 9;
3) третий фасет - содержит 1 разряд (а6) и характеризует специальный признак, являющийся дополнительной детализацией разряда а5:
0 - признак головного подразделения ЮЛ или ИП(С);
1 - признак филиала ЮЛ или ИП(С);
2 - признак представительства ЮЛ или ИП(С);
3 - признак иного обособленного структурного подразделения ЮЛ или ИП(С);
4 - признак крестьянского (фермерского) хозяйства, осуществляющего деятельность на основе совместного предпринимательства;
4) четвертый фасет - содержит 5 разрядов (с а7 по а11) и характеризует порядковый номер регистрации в системе ЮЛ или ИП(С), а также их структурных подразделений;
5) пятый фасет - содержит 1 разряд (а12) и является контрольным разрядом БИН. Алгоритм расчета контрольного разряда БИН приведен в параграфе 5 главы 5 Программы и аналогичен расчету контрольного разряда ИИН.

Мы не стали брать из этого постановления подраздел 5 раздела 5, где приводится алгоритм проверки контрольного разряда (a12), потому что он был изменен в другом постановлении.

Постановление Правительства Республики Казахстан от 30 апреля 2007 года № 352 "О внесении изменений и дополнений в некоторые решения Правительства Республики Казахстан"

Здесь нас интересует часть пункта 11 - алгоритм расчета значения контрольного разряда:

подраздел 5 изложить в следующей редакции:
«5. Алгоритм расчета значения контрольного разряда
В целях осуществления контроля и снижения ошибок клавиатурного ввода в составе ИИН (БИН) предусматривается наличие контрольного 12-го разряда, при расчете которого будет использоваться следующий алгоритм в два цикла:
а12=(а1*b1+а2*b2+а3*b3+а4*b4+а5*b5+а6*b6+а7*b7+а8*b8+а9*b9+a10*b10+a11*b11) mod 11,
где: ai - значение i-гo разряда;
bi - вес i-гo разряда.
разряд ИИН: 1 2 3 4 5 6 7 8 9 10 11
вес разряда: 1 2 3 4 5 6 7 8 9 10 11.
1. Если полученное число равно 10, то расчет контрольного разряда производится с другой последовательностью весов:
разряд ИИН: 1 2 3 4 5 6 7  8   9   10 11
вес разряда: 3 4 5 6 7 8 9 10 11  1    2.
2. Если полученное число также равно 10, то данный ИИН не используется.
3. Если полученное число имеет значение от 0 до 9, то данное число берется в качестве контрольного разряда.».

В итоге у нас вполне достойное понимание того, что такое ИИН, и как можно проверить правильность его ввода.

Привожу пример алгоритма на javascript, который позволит проверить правильность ввода ИИН:

   
Валидация ИИН/БИН
  1. function iinCheck(iin, clientType, birthDate, sex, isResident) {
  2. //clientType: 1 - Физ. лицо (ИИН), 2 - Юр. лицо (БИН)
  3. //birthDate: дата рождения (в формате Javascript Date)
  4. //sex: true - м, false - ж
  5. //isResident: true - резидент, false: нерезидент (true: по умолчанию)
  6. isResident = isResident || true;
  7. if(!iin) return false;
  8. if(iin.length!=12) return false;
  9. if(!(/[0-9]{12}/.test(iin))) return false;
  10. switch(clientType){
  11. case 1:
  12. //Физ. лицо
  13. //Проверяем первый фасет на совпадение с датой рождения ГГММДД
  14. if(iin.substring(0, 6)!=(
  15. "" +
  16. (birthDate.getYear()) +
  17. ((birthDate.getMonth()+1)<10?"0":"")+
  18. (birthDate.getMonth()+1)+
  19. (birthDate.getDate()<10?"0":"")+
  20. birthDate.getDate())) return false;
  21. //Проверяем пол и век рождения
  22. var s = parseInt(iin.substring(6, 7));
  23. if(((s%2)==1)!=sex) return false;
  24. if(
  25. birthDate.getFullYear()<(1800+parseInt(s/2)*100)
  26. || birthDate.getFullYear()>(1900+parseInt(s/2)*100)) return false;
  27. break;
  28. case 2:
  29. //Юр. лицо
  30. //Проверяем корректность даты (насколько это возможно)
  31. var m = parseInt(iin.substring(2, 4));
  32. if(m>12) return false;
  33. //Проверяем признак резидентства
  34. var r = parseInt(iin.substring(4, 5));
  35. if(r<4 || r>6 || (r==4 && !isResident) || (r==5 && isResident)) return false;
  36. break;
  37. }
  38. //Проверяем контрольный разряд
  39. var b1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
  40. var b2 = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2 ];
  41. var a = [];
  42. var controll = 0;
  43. for(var i=0; i<12; i++){
  44. a[i] = parseInt(iin.substring(i, i+1));
  45. if(i<11) controll += a[i]*b1[i];
  46. }
  47. controll = controll % 11;
  48. if(controll==10) {
  49. alert("s");
  50. controll = 0;
  51. for(var i=0; i<11; i++)
  52. controll += a[i]*b2[i];
  53. controll = controll % 11;
  54. }
  55. if(controll!=a[11]) return false;
  56. return true;
  57. }
 
Михаил Май goldenalfer
3 февраля 2011, 13:23
21021

Загрузка...
Loading...

Комментарии

Благодарю за публикацию! Великолепная иллюстарция, а главное очень понятно!
Код на PHP (только проверка на контрольный разряд), в виде валидатора для Yii:
public function checkIinBin($attribute, $params)
{
$b1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
$b2 = array(3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2);
$a = array();
$controll = 0;
for ($i = 0; $i < 12; $i++) {
$a[$i] = substr($this->$attribute, $i, 1);
if ($i < 11) $controll += $a[$i] * $b1[$i];
}
$controll = $controll % 11;
if ($controll == 10) {
$controll = 0;
for ($i = 0; $i < 11; $i++)
$controll += $a[$i] * $b2[$i];
$controll = $controll % 11;
}
if ($controll != $a[11]) {
$this->addError($attribute, $params['message'] ? $params['message'] : 'Неверный контрольный разряд');
}
}
Нашел такой иин 999777444111?
Как это возможно? Ошибка людей? Или изменили алгоритм?
Скорее всего ошиблись, когда выдавали. Первое время, когда ИИН только ввели, ошибок было много. Сейчас постепенно их исправляют.
Kavin
1
0
На всякий случай - актуальные ссылки на документацию:
Постановление Правительства Республики Казахстан от 11 июня 2003 года N 565 "Об утверждении Программы перехода на единый номер физического (юридического) лица (индивидуальный идентификационный номер (бизнес-идентификационный номер) в целях создания Национальных реестров идентификационных номеров Республики Казахстан"
adilet.zan.kz

Постановление Правительства Республики Казахстан от 30 апреля 2007 года N 352 "О внесении изменений и дополнений в некоторые решения Правительства Республики Казахстан", п.11
adilet.zan.kz
Спасибо, исправил ссылки в статье на Ваши
Расширил валидатор для yii
u87bqJE15ph1QuQ1YA3L4PW9c5Tlmh.png
/**
* Валидатор индивидуального идентификационного номера (ИИН) физического
* лица либо индивидуального предпринимателя Казахстана
* @param $attribute
* @param $params параметры
* $params['message'] = array(
* 'match' => 'если не 12 цифр',
* 'month' => 'позиция 3-4 не может быть больше 12',
* 'day' => 'позиция 5-6 не может быть больше 31',
* 'sex' => 'позиция 7 должна быть от 1 до 6',
* 'control' => 'контрольное число не совпадает',
* )
* @return void
*/
public function checkIin($attribute, $params)
{
if (preg_match('/^[\d]{12}$/', $this->$attribute) == 0){ // на общий формат
$this->addError($attribute, isset($params['message']['match']) ?
$params['message']['match'] : 'ИИН не корректен');
} else if ((int)substr($this->$attribute, 2, 2) > 12){ // месяц не может быть больше 12
$this->addError($attribute, isset($params['message']['month']) ?
$params['message']['month'] : 'ИИН не корректен (позиция 3-4 не может быть больше 12)');
} elseif ((int)substr($this->$attribute, 4, 2) > 31){ // день не может быть больше 31
$this->addError($attribute, isset($params['message']['day']) ?
$params['message']['day'] : 'ИИН не корректен (позиция 5-6 не может быть больше 31)');
}elseif ((int)substr($this->$attribute, 6, 1) > 6 || (int)substr($this->$attribute, 6, 1) < 1){ // день не может быть больше 31
$this->addError($attribute, isset($params['message']['sex']) ?
$params['message']['sex'] : 'ИИН не корректен (позиция 7 должна быть от 1 до 6)');
} else { //проверяем на контрольное число
$b1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
$b2 = array(3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2);
$summ = 0; $iin = array();
for ($i = 0; $i <= 10; $i++) {
$iin[$i] = (int)substr($this->$attribute, $i, 1);
$summ += $iin[$i] * $b1[$i];
}
$iin[11] = (int)substr($this->$attribute, 11, 1);
$controll = $summ % 11;
if ($controll == 10) {
$summ = 0;
for ($i = 0; $i <= 10; $i++) {
$summ += $iin[$i] * $b2[$i];
}
$controll = $summ % 11;
}
if ($controll !== $iin[11]) {
$this->addError($attribute, isset($params['message']['control']) ?
$params['message']['control'] : 'ИИН не корректен (контрольное число не совпадает)');
}
}
}
Очень подробно! Спасибо большое за такую статью!

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Казком берет комиссии за оплаты по карте. Почему на это закрывают глаза Visa и MasterCard?!

Казком берет комиссии за оплаты по карте. Почему на это закрывают глаза Visa и MasterCard?!

Покупаешь в супермаркете продукты на 5000 тенге и банк забирает себе еще 30-50 тенге. То есть, продукты обошлись уже не в 5000, а в 5050 тенге.
ValentinaVladimirska
25 мая 2017 / 22:56
  • 13461
  • 26
Узаконенное варварство в стране, принимающей «EPXO». Еще далеко нам до «топ-30 развитых стран»

Узаконенное варварство в стране, принимающей «EPXO». Еще далеко нам до «топ-30 развитых стран»

В продвинутых государствах едва ли поймут, почему в столь развитом, успешном и преуспевающем Казахстане от имени и по заданию властей творятся такие зверства над животными.
openqazaqstan
24 мая 2017 / 12:12
  • 10827
  • 102
Вырубка деревьев в Алматы под БРТ. Проект уже нанес городу экологический ущерб

Вырубка деревьев в Алматы под БРТ. Проект уже нанес городу экологический ущерб

Как ранее уже сообщалось из-за строительства БРТ в Алматы пострадают значительное количество деревьев. На прошлой неделе вырублены первые вязы и клён, - под расширение проезжей части на улице...
SKYFALL
24 мая 2017 / 17:20
  • 10532
  • 14
Поддержим пенсией жиреющие банки! На что казахстанцам разрешат досрочно тратить свои накопления в ЕНПФ

Поддержим пенсией жиреющие банки! На что казахстанцам разрешат досрочно тратить свои накопления в ЕНПФ

Со стороны ЕНПФ в очередной раз прозвучало крайне неоднозначное заявление, от которого, на наш взгляд, лучше было бы воздержаться.
openqazaqstan
23 мая 2017 / 11:08
  • 9935
  • 32
Системная коррупция стала главной угрозой для Казахстана. У нас воруют миллиардами

Системная коррупция стала главной угрозой для Казахстана. У нас воруют миллиардами

Коррупционные отношения вышли на такой уровень, что они уже начинают дискредитировать всю систему управления.
openqazaqstan
26 мая 2017 / 13:45
  • 8435
  • 34
Что бы ни сделал пешеход – все равно водитель сядет

Что бы ни сделал пешеход – все равно водитель сядет

Вопрос о равной ответственности водителя и пешехода при наезде на последних, только-только начинают обдумывать в высоких кабинетах. Но, пока государственные головы думают, водители продолжают...
Mirogloff
22 мая 2017 / 23:29
  • 5149
  • 32
Да-да, я знаю, пора выходить замуж. Есть ли у меня еще время и, пожалуйста, уточните сколько?

Да-да, я знаю, пора выходить замуж. Есть ли у меня еще время и, пожалуйста, уточните сколько?

Итак давайте сразу начистоту. Мне 29. Не замужем, никогда не была, детей нет. В душе я совсем не чувствую этот возраст. Каждый раз когда задумываюсь об этом больше чем на 3 минуты, меня накрывает...
user2017
23 мая 2017 / 10:57
Пока полицейские будут прощать, им будут бить и по чести, и по лицу

Пока полицейские будут прощать, им будут бить и по чести, и по лицу

Судья Алмалинского районного суда Куаныш Арипов ломает стереотипы отношения граждан к представителям Фемиды. Напавшему на полицейского экс-сотруднику алматинского акимата он назначил наказание выше...
Mirogloff
24 мая 2017 / 16:41
  • 4003
  • 9
Аблязов загробным голосом декларирует «ДВК-2». Монолог обиженного человека

Аблязов загробным голосом декларирует «ДВК-2». Монолог обиженного человека

Последний монолог Аблязова о «продолжении борьбы с режимом» и «ДВК-2», при всём желании, не выглядел как какой-то политический манифест.
openqazaqstan
25 мая 2017 / 13:53
  • 3285
  • 62