Имя: Пароль:
1C
1С v8
Алгоритм расчета контрольной суммы ИНН для Украины
,
0 sqr4
 
03.09.13
13:31
Нужно проверять правильность введенного ИНН для Украинских партнеров. Не могу нигде найти формулы, по которым рассчитывается контрольное число для различных длин ИНН. Прошу помощи
1 Molinor
 
03.09.13
13:35
http://www.foxclub.ru/sol/solution606.php
Можно отсюда вытащить.
2 Molinor
 
03.09.13
13:35
3 sqr4
 
03.09.13
13:58
спасибо сейчас уже изучим
4 aka AMIGO
 
03.09.13
14:00
5 aka AMIGO
 
03.09.13
14:01
+4 правда, это для 77, но в умелых ручках - не проблема.
да и алгоритм, ИМХО, не должен отличаться
6 pumbaEO
 
03.09.13
14:03
7 sqr4
 
03.09.13
14:14
(6) это я находил, ввожу ИНН банков украинских, ругается гад.
8 aka AMIGO
 
03.09.13
14:20
9 sqr4
 
03.09.13
14:21
(4) это для русских как я понял ИНН у них в Украине там по другому как то
10 aka AMIGO
 
03.09.13
14:21
(9) в яндексе, нажми букву "Я" справа от топика, там много всего
11 sqr4
 
03.09.13
14:22
12 sqr4
 
03.09.13
14:28
Мб есть онлайн сервис, который украинские ИНН проверяет? Или может кто подкинет списочек ИНН украинских, для теста
13 sqr4
 
03.09.13
14:44
ЕстьОшибкаВКоде=Ложь;
        
        ИНН = СокрЛП(ИНН);
        Если СтрДлина(ИНН)<>10 И СтрДлина(ИНН)<>9 И СтрДлина(ИНН)<>12 Тогда
            #Если Клиент Тогда
                Сообщить("Не соответствует длина кода ИНН", СтатусСообщения.Важное);
            #КонецЕсли    
            Возврат Ложь;
        КонецЕсли;
        
        Если СтрДлина(ИНН)=10 Тогда
            ДлинаПроверки = Число(Left(ИНН, 1))   * -1 +Число(Сред(ИНН, 2, 1)) * 5 + Число(Сред(ИНН, 3, 1)) * 7
            + Число(Сред(ИНН, 4, 1)) * 9 +Число(Сред(ИНН, 5, 1)) * 4
            +Число(Сред(ИНН, 6, 1)) * 6 +Число(Сред(ИНН, 7, 1)) * 10
            +Число(Сред(ИНН, 8, 1)) * 5 + Число(Сред(ИНН, 9, 1)) * 7;
            ДлинаКода = ДлинаПроверки-Цел(ДлинаПроверки/11)*11;
            Если ДлинаКода=10 Тогда
                ДлинаКода = 0;
            КонецЕсли;
            Если Число(Прав(ИНН,1))=ДлинаКода Тогда
                ЕстьОшибкаВКоде = Ложь;
            Иначе
                ЕстьОшибкаВКоде = Истина;
            КонецЕсли;
        ИначеЕсли СтрДлина(ИНН)=12 Тогда
            ДлинаПроверки =
            Число(Лев(ИНН,   1))  * 11
            + Число(Сред(ИНН, 2, 1))  * 13
            + Число(Сред(ИНН, 3, 1))  * 17
            + Число(Сред(ИНН, 4, 1))  * 19
            + Число(Сред(ИНН, 5, 1))  * 23
            + Число(Сред(ИНН, 6, 1))  * 29
            + Число(Сред(ИНН, 7, 1))  * 31
            + Число(Сред(ИНН, 8, 1))  * 37
            + Число(Сред(ИНН, 9, 1))  * 41
            + Число(Сред(ИНН, 10, 1)) * 43
            + Число(Сред(ИНН, 11, 1)) * 47;
            ДлинаКода = ДлинаПроверки-Цел(ДлинаПроверки/11)*11;
            Если ДлинаКода = 10 Тогда
                ДлинаПроверки =
                Число(Лев(ИНН,   1))  * 13
                + Число(Сред(ИНН, 2, 1))  * 17
                + Число(Сред(ИНН, 3, 1))  * 19
                + Число(Сред(ИНН, 4, 1))  * 23
                + Число(Сред(ИНН, 5, 1))  * 29
                + Число(Сред(ИНН, 6, 1))  * 31
                + Число(Сред(ИНН, 7, 1))  * 37
                + Число(Сред(ИНН, 8, 1))  * 41
                + Число(Сред(ИНН, 9, 1))  * 43
                + Число(Сред(ИНН, 10, 1)) * 47
                + Число(Сред(ИНН, 11, 1)) * 53;
                ДлинаКода = ДлинаПроверки-Цел(ДлинаПроверки/11)*11;
                Если ДлинаКода=10 Тогда
                    ДлинаКода = 0;
                КонецЕсли;
            КонецЕсли;
            Если Число(Прав(ИНН,1))=ДлинаКода Тогда
                ЕстьОшибкаВКоде = Ложь;
            Иначе
                ЕстьОшибкаВКоде = Истина;
            КонецЕсли;
        Иначе
            ДлинаПроверки =
            Число(Лев(ИНН,   1))  * 9
            + Число(Сред(ИНН, 2, 1))  * 11
            + Число(Сред(ИНН, 3, 1))  * 13
            + Число(Сред(ИНН, 4, 1))  * 17
            + Число(Сред(ИНН, 5, 1))  * 19
            + Число(Сред(ИНН, 6, 1))  * 23
            + Число(Сред(ИНН, 7, 1))  * 29
            + Число(Сред(ИНН, 8, 1))  * 31;
            
            ДлинаКода = ДлинаПроверки-Цел(ДлинаПроверки/11)*11;
            Если  ДлинаКода=10 Тогда
                ДлинаПроверки =
                Число(Лев(ИНН,   1))  * 11
                + Число(Сред(ИНН, 2, 1))  * 13
                + Число(Сред(ИНН, 3, 1))  * 17
                + Число(Сред(ИНН, 4, 1))  * 19
                + Число(Сред(ИНН, 5, 1))  * 23
                + Число(Сред(ИНН, 6, 1))  * 29
                + Число(Сред(ИНН, 7, 1))  * 31
                + Число(Сред(ИНН, 8, 1))  * 37;
                ДлинаКода = ДлинаПроверки-Цел(ДлинаПроверки/11)*11;
                Если ДлинаКода=10 Тогда
                    ДлинаКода = 0;
                КонецЕсли;
                
                Если Число(Прав(ИНН,1))=ДлинаКода Тогда
                    ЕстьОшибкаВКоде = Ложь;
                Иначе
                    ЕстьОшибкаВКоде = Истина;
                КонецЕсли;
                
            Иначе
                ЕстьОшибкаВКоде = Истина;
            КонецЕсли;
        КонецЕсли;
        
        Если ЕстьОшибкаВКоде Тогда
            #Если Клиент Тогда
                Сообщить("Ошибка в коде ИНН", СтатусСообщения.Важное);
            #КонецЕсли    
        КонецЕсли;
        
        Возврат Не ЕстьОшибкаВКоде;        
Вот такую вот хрень состряпал, вот этот вот ИНН 235983905269 не пропускает, а он есть!
14 sqr4
 
03.09.13
14:50
Косяк получается когда ДлинаКода=10, повторный прогон дает неправильный результат. Прошу помощи у спецов
15 sqr4
 
03.09.13
14:53
Есть ли у кого нибудь ссылка на документацию нормальную про украинские ИНН
16 DS
 
03.09.13
15:56
Попробуй в один проход:
    Коэф[0] = 3;
    Коэф[1] = 7;
    Коэф[2] = 2;
    Коэф[3] = 4;
    Коэф[4] = 10;
    Коэф[5] = 3;
    Коэф[6] = 5;
    Коэф[7] = 9;
    Коэф[8] = 4;
    Коэф[9] = 6;
    Коэф[10] = 8;
17 DS
 
03.09.13
16:02
(14) У юрлица длина ИНН = 12. Длина ИНН в 10 - у физлица. Алгоритмы разные.
18 sqr4
 
03.09.13
16:43
Ну подсчитай с этими коэффициентами для 235983905269, выходит?
19 DS
 
03.09.13
18:44
(18) Выходит.
20 sqr4
 
03.09.13
20:32
И сколько сумма получилась? Почему у меня то не выходит. Математик чтоли я плохой совсем
21 DS
 
03.09.13
21:22
Ты прав. Это я напутал.
Попробуй так как в (13), но во втором проходе используй 17, 19, . . ., 59.
22 sqr4
 
03.09.13
21:27
для двух вариантов сработало! Спасибо огромное, буду тестить. Можно спросить как вы до этого дошли, логически? Или нашли какой то подтверждающий документ?
23 DS
 
03.09.13
21:37
Официальный документ есть только по ЕДРПОУ и банковскому счету. Все остальное - под грифом "сомнительно", но на 99% работает.
24 sqr4
 
03.09.13
21:41
Ну чтоже, я написал в налоговую службу Украины. Мб что-нибудь внятное ответят. Спасибо еще раз