gifts2017

v7: Алгоритм проверки валидности ИИН/БИН (Казахстан)

Опубликовал Сергей Шахов (Gvozdod) в раздел Программирование - Практика программирования

До настоящего времени с проверкой валидности ИИН/БИН была довольно большая проблема. Хоть алгоритм и очень простой, но его просто никто не знал. Предлагаю вашему вниманию его

Алгоритм основан на статье: http://www.gotdotnet.ru/blogs/kidinfo/7516/
За что огромное спасибо автору
Функция глВалидностьИН(Значение) Экспорт
// Вычисление контрольного разряда
    
    Статус = 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)+
        //                3*Сред(ПодстрокаИН11,2,1)+
        //                7*Сред(ПодстрокаИН11,3,1)+
        //                9*Сред(ПодстрокаИН11,4,1)+
        //                3*Сред(ПодстрокаИН11,5,1)+
        //                1*Сред(ПодстрокаИН11,6,1)+
        //                9*Сред(ПодстрокаИН11,7,1)+
        //                7*Сред(ПодстрокаИН11,8,1)+
        //                3*Сред(ПодстрокаИН11,9,1)+
        //                9*Сред(ПодстрокаИН11,10,1)+
        //                1*Сред(ПодстрокаИН11,11,1);
        //ВычисленноеКонтрольноеЗначение = СуммаРазрядов % 10;
        
        СуммаРазрядов =    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);
            ВычисленноеКонтрольноеЗначение = СуммаРазрядов % 11;
        КонецЕсли;
        
        Если (ВычисленноеКонтрольноеЗначение = КонтрольноеЗначение) И (СуммаРазрядов<>0) Тогда
            Сообщить("Введенный ИИН/БИН корректен!");
            Статус = 1;
        Иначе
            Сообщить("Введенный ИИН/БИН некорректен!","!!!");
            Статус = 0;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Статус;
КонецФункции // глВалидностьИН

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Юрий Мисюрин (Socrat) 14.04.10 06:20
2. Андрей (homkadron) 14.04.10 10:20
3. Николай (provnick) 14.04.10 13:20
//А так не идет?

Функция глВалидностьИН(Значение) Экспорт
// Вычисление контрольного разряда

Статус = 0;

//Проверка на длину ИИН/БИН
Если СтрДлина(СокрЛП(Значение))<12 Тогда
Предупреждение("Количество знаков в ИИН/БИН меньше 12!",60);

// проверка на одиниковость всех цифр
ИначеЕсли СтрЧислоВхождений(Значение, Лев(Значение,1))=12 Тогда
Предупреждение("Цифра " + Лев(Значение,1) + " повторяется 12 раз!",60);

Иначе

ПодстрокаИН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;

Если ВычисленноеКонтрольноеЗначение = Число(КонтрольноеЗначение) Тогда
Предупреждение("Введенный ИИН/БИН корректен!",60);
Статус = 1;
Иначе
Предупреждение("Введенный ИИН/БИН некорректен!",60);
Статус = 0;
КонецЕсли;
КонецЕсли;

Возврат Статус;
КонецФункции // глВалидностьИН
4. Николай (provnick) 14.04.10 13:22
5. Сергей Шахов (Gvozdod) 14.04.10 13:25
(3) А Вы попробуйте штук 10 ИИН-ов и БИН-ов проверить этой функцией. Будете неприятно удивлены.
6. Дмитрий Ташланов (Necytij) 13.05.10 09:43
7. Skela Sam (skelasam@mail.ru) 19.05.10 19:37
Все замечательно, но :cry: нашлись люди которые в место цифр ввели слово из 12 букв и результат "Введенный ИИН/БИН корректен!".
По этому вопиющему безпределу предлагаю следующее :
Где
"СуммаРазрядов = 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);"

Добавить
Если СуммаРазрядов=0 Тогда
Предупреждение("Введенный ИИН/БИН НЕКОРРЕКТЕН!!!",60);
Возврат = 0;
КонецЕсли;
8. Сергей Шахов (Gvozdod) 20.05.10 06:55
9. Сергей Шахов (Gvozdod) 20.05.10 07:02
(7) я бы порекомендовал использовать маску "999999999999"