• 19371
  • 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
19371

Загрузка...

Комментарии

Благодарю за публикацию! Великолепная иллюстарция, а главное очень понятно!
Код на 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

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

Только на 10-й раз он смог поступить в Кембридж! Герой с Кармакшинского района

Только на 10-й раз он смог поступить в Кембридж! Герой с Кармакшинского района

Свыше 10 известных университетов приглашают его обучаться зарубежом, но выбор будет оставаться за Сакеном. Он выберет обучение The University of Edinburgh и отправляется в эту удивительную страну...
socium_kzo
30 нояб. 2016 / 11:06
  • 10096
  • 8
Кто хочет стать тоқал? Замужние осуждают их, но не смотрят в корень

Кто хочет стать тоқал? Замужние осуждают их, но не смотрят в корень

Ведь одинокие женщины тоже нуждаются в сексе и не все из них имеют устойчивые моральные принципы. Я за институт многоженства не в том понимании, чтобы брать в жены молодых 18-25 летних девушек...
Zhannamakey
26 нояб. 2016 / 12:52
  • 4525
  • 59
Взгляд со стороны: Назарбаев глазами кыргыза

Взгляд со стороны: Назарбаев глазами кыргыза

В чем уникальность этой личности? В чем его успех или провалы? Эти вопросы требуют глубокой аналитики и исследований. Я же хочу рассказать о Нурсултане Абишевиче глазами рядового кыргыза или...
maxes
1 дек. 2016 / 8:05
  • 3520
  • 13
О переименовании столицы: Казнет не зря взорвался едкими комментариями

О переименовании столицы: Казнет не зря взорвался едкими комментариями

Сеть облетело очень символичное видео, где г-ну Султанову в ходе пресс-конференции прямо задают этот вопрос. «Вы советовались с народом?!» – спрашивают его журналисты. На что депутат так и не смог вразумительно ответить.
openqazaqstan
28 нояб. 2016 / 14:35
  • 3233
  • 15
Когда на тебя смотрят как на говно. На работе многие считали, что они выше меня уровнем

Когда на тебя смотрят как на говно. На работе многие считали, что они выше меня уровнем

Дело было летом 2012 года. Мне было почти 20 лет, жил я от сессии до сессии довольно весело. В голове машины, клубы, тёлки. Жизнь размеренная и неторопливая. Вдруг мне приходит в голову идея...
almatinec_92
28 нояб. 2016 / 16:57
Мой личный опыт использования Astra Plat: мелочи в моем кармане заметно стало меньше

Мой личный опыт использования Astra Plat: мелочи в моем кармане заметно стало меньше

Давно ждал запуска электронного билетирования в общественном транспорте Астаны. В ноябре 2016 года этот день настал. Мой опыт насчитывает последние 2 недели и мне есть чем поделиться. Она не...
iamYerlan
1 дек. 2016 / 15:24
  • 2651
  • 10
Аэропорт Схипхол и Алматы. Смотришь на это и ощущение, что мы лет на тридцать отстали

Аэропорт Схипхол и Алматы. Смотришь на это и ощущение, что мы лет на тридцать отстали

Недавно пролетал через аэропорт Амстердама - Схипхол. Так как улетал из аэропорта Алматы, то не мог не начать сравнивать эти аэропорты.
Superkurt
30 нояб. 2016 / 10:09
  • 2765
  • 12
Молчание врачей. Дети ЮКО, заражённые ВИЧ 10-11 лет назад, узнают о диагнозе-приговоре

Молчание врачей. Дети ЮКО, заражённые ВИЧ 10-11 лет назад, узнают о диагнозе-приговоре

Как сообщают новостные издания, в ближайшее время в Южном Казахстане 102 детям в возрасте 11-12 лет сообщат об их страшном диагнозе. Все эти дети были заражены ВИЧ, причём большинство было инфицировано по вине врачей.
openqazaqstan
вчера / 13:57
  • 2429
  • 0
Понять и простить: почему большинство стран бывшего СССР отказалось от амнистий

Понять и простить: почему большинство стран бывшего СССР отказалось от амнистий

Президент Назарбаев предложил амнистию для совершивших преступления небольшой тяжести несовершеннолетних, пожилых, женщин и других социально уязвимых категорий осуждённых
openqazaqstan
30 нояб. 2016 / 13:45
  • 2642
  • 19