Имя: Пароль:
1C
1С v8
Проверка контрольной цифры-Налоговый и идентификационные коды Украина
0 marinanima
 
02.09.13
13:44
Здравствуйте! Поделитесь пожалуйста кодом для проверки контрольной суммы ИНН и ОКПО (юр/физ лиц).
Документооборот 8 КОРП 1.2 там есть эта проверка, но только для России а необходимо поменять для Украины.
Функция ИННСоответствуетТребованиям(Знач ИНН, ЭтоЮрЛицо, ТекстСообщения) Экспорт
1 pumbaEO
 
02.09.13
13:58
Функция нфПолучитьКЧ_ЕДРПОУ(Код,ВесКоэф,СмещениеКоэф=0)
    КонтрольнаяСумма=0;
    Для ПерЦ=1 По СтрДлина(ВесКоэф) Цикл
        КонтрольнаяСумма=КонтрольнаяСумма+(Число(Сред(Код,ПерЦ,1))*(Число(Сред(ВесКоэф,ПерЦ,1))+СмещениеКоэф));
    КонецЦикла;                                                                                
    КонтрЧисло = КонтрольнаяСумма-Цел(КонтрольнаяСумма/11)*11;
    Возврат КонтрЧисло;
КонецФункции //ПолучитьКЧ_ЕДРПОУ

// нфОшибкаЕДРПОУ ===============================
// Назначение:
//        Проверка кода ЕДРПОУ для Украины
// Аргументы:
//        КодДляПроверки - Код ЕДРПОУ
// Возвращает:                          
//         0 - код правильный
//         1 - код неверно, есть ошибка в коде
Функция нфОшибкаВКоде_ЕДРПОУ_8(ЕДРПОУ)
    ЕстьОшибкаВКоде = Ложь;
    КодДляПроверки=СОКРЛП(ЕДРПОУ);
    // Определяем набор весовых коэффициентов
    Если (Число(КодДляПроверки)<30000000) Или (Число(КодДляПроверки)>60000000)  Тогда
        Коэф="1234567";
    Иначе
        Коэф="7123456";
    КонецЕсли;
    // Расчитываем контрольное число как сумму произведений разрядов кода на соответсвующие коэфициенты
    КЧ=нфПолучитьКЧ_ЕДРПОУ(КодДляПроверки,Коэф);
    Если КЧ=10 Тогда
        КЧ = нфПолучитьКЧ_ЕДРПОУ(КодДляПроверки,Коэф,2);
        Если КЧ=10 Тогда
            КЧ=0;
        КонецЕсли;
    КонецЕсли;
    
    Если Число(Прав(КодДляПроверки,1))=КЧ Тогда
        ЕстьОшибкаВКоде = Ложь;
    Иначе
        ЕстьОшибкаВКоде = Истина;
    КонецЕсли;
    Возврат ЕстьОшибкаВКоде;
КонецФункции

// нфОшибкаЕДРПОУ ===============================
// Назначение:
//        Проверка кода ЕДРПОУ для Украины
// Аргументы:
//        КодДляПроверки - Код ЕДРПОУ
// Возвращает:                          
//         0 - код правильный
//         1 - код неверно, есть ошибка в коде
Функция нфОшибкаВКоде_ИНН(ИНН) Экспорт
    Перем ДлинаКода, ДлинаПроверки;
    
    ЕстьОшибкаВКоде=Ложь;
    
    ИНН = СокрЛП(ИНН);
    Если СтрДлина(ИНН)<>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))  * 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))=ДлинаКода Тогда
                ЕстьОшибкаВКоде = Ложь;
            Иначе
                ЕстьОшибкаВКоде = Истина;
            КонецЕсли;
2 pumbaEO
 
02.09.13
14:02
Чет обрезалось.

https://gist.github.com/pumbaEO/6411240
3 marinanima
 
02.09.13
16:07
спасибо большое!
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший