В моих проектах часто необходимо вносить данные по клиентам, которые обязательно сопровождаются внесением данных ИИН. Долгое время я собирал данные о том, что такое ИИН и как проверять правильность его ввода. На просторах интернета уже есть несколько постов с необходимой информацией, но, к сожалению, часто бывает, что информация неверная, или не подкреплена никакими официальными источниками.
Сегодня мы с вами попытаемся разобраться в этом вопросе с точки зрения Казахстанского законодательства, а также набросаем простой скрипт проверки ИИН на 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, который позволит проверить правильность ввода ИИН:
-
function iinCheck(iin, clientType, birthDate, sex, isResident) {
-
//clientType: 1 - Физ. лицо (ИИН), 2 - Юр. лицо (БИН)
-
//birthDate: дата рождения (в формате Javascript Date)
-
//sex: true - м, false - ж
-
//isResident: true - резидент, false: нерезидент (true: по умолчанию)
-
isResident = isResident || true;
-
if(!iin) return false;
-
if(iin.length!=12) return false;
-
if(!(/[0-9]{12}/.test(iin))) return false;
-
switch(clientType){
-
case 1:
-
//Физ. лицо
-
//Проверяем первый фасет на совпадение с датой рождения ГГММДД
-
if(iin.substring(0, 6)!=(
-
"" +
-
(birthDate.getYear()) +
-
((birthDate.getMonth()+1)<10?"0":"")+
-
(birthDate.getMonth()+1)+
-
(birthDate.getDate()<10?"0":"")+
-
birthDate.getDate())) return false;
-
//Проверяем пол и век рождения
-
var s = parseInt(iin.substring(6, 7));
-
if(((s%2)==1)!=sex) return false;
-
if(
-
birthDate.getFullYear()<(1800+parseInt(s/2)*100)
-
|| birthDate.getFullYear()>(1900+parseInt(s/2)*100)) return false;
-
break;
-
case 2:
-
//Юр. лицо
-
//Проверяем корректность даты (насколько это возможно)
-
var m = parseInt(iin.substring(2, 4));
-
if(m>12) return false;
-
//Проверяем признак резидентства
-
var r = parseInt(iin.substring(4, 5));
-
if(r<4 || r>6 || (r==4 && !isResident) || (r==5 && isResident)) return false;
-
break;
-
}
-
//Проверяем контрольный разряд
-
var b1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
-
var b2 = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2 ];
-
var a = [];
-
var controll = 0;
-
for(var i=0; i<12; i++){
-
a[i] = parseInt(iin.substring(i, i+1));
-
if(i<11) controll += a[i]*b1[i];
-
}
-
controll = controll % 11;
-
if(controll==10) {
-
alert("s");
-
controll = 0;
-
for(var i=0; i<11; i++)
-
controll += a[i]*b2[i];
-
controll = controll % 11;
-
}
-
if(controll!=a[11]) return false;
-
return true;
-
}