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

20.05.10

Разработка - Математика и алгоритмы

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

Алгоритм основан на статье: 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;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Статус;
КонецФункции // глВалидностьИН

См. также

Загрузка и выгрузка в Excel Математика и алгоритмы Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Статья посвящена распространённому вопросу - как сохранить несколько таблиц (отчетов) в формате MXL, с которым работает 1С, на отдельные листы одного Excel файла. Освещается простой алгоритм решения проблемы штатными средствами, без использования внешних модулей и библиотек (не относящихся к 1С и Excel).

23.11.2015    19253    etmarket    14    

21

Разработка внешних компонент Математика и алгоритмы Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры для использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать классы .Net только на языке 1С. Реализация 1C Messenger описанного здесь http://infostart.ru/public/434771/

12.11.2015    51832    Serginio    36    

58

Математика и алгоритмы Программист Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Статья посвящена исследованию следующего вопроса: необходимо сравнить 2 наименования справочников с целью вычисления их степени сходства. По задумке, степень сходства должна выражаться в процентах.

1 стартмани

25.02.2015    25111    etmarket    46    

18

Математика и алгоритмы Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Часто при приеме на работу встречается задача про сгибание листка

1 стартмани

26.02.2013    19794    11    Sbelyi78    38    

9

Математика и алгоритмы Системный администратор Программист Бухгалтер Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Универсальная печать таблицы значений, которую не стыдно прикрутить к рабочей базе данных. Группировка данных, подсчет итогов, составление диаграмм, выгрузка в быстрый доступ к исходной ТЗ.

1 стартмани

23.05.2012    14901    66    McSeem    3    

8

Математика и алгоритмы Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Алгоритм получения значения тригонометрических функций путем разложения их в ряд Тейлора

1 стартмани

04.03.2012    8770    4    nysysimara    10    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Socradt 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 105 14.04.10 13:25 Сейчас в теме
(3) А Вы попробуйте штук 10 ИИН-ов и БИН-ов проверить этой функцией. Будете неприятно удивлены.
6. Necytij 13.05.10 09:43 Сейчас в теме
7. 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 105 20.05.10 06:55 Сейчас в теме
9. Gvozdod 105 20.05.10 07:02 Сейчас в теме
(7) я бы порекомендовал использовать маску "999999999999"
Оставьте свое сообщение