none
Проверка в Sharepoint 2010 полей ИНН и КПП, на основе формулы Excel (Update) RRS feed

  • Вопрос

  •  Уважаемые коллеги, помогите получить правильную формулу для проверки поля ИНН (да и КПП)

    На данный момент я смог найти формулу по проверке этих значений в Excel.  Но приведенный ниже код содержит диапазоны, да и хотелось бы видеть куда в этой красоте имя поля вбивать ;)

    =ЕСЛИ(ДЛСТР(A1)=10;ЕСЛИ(ЕСЛИ(СУММПРОИЗВ((ПСТР(A1;СТРОКА($1:$10);1)*1)*{2:4:10:3:5:9:4:6:8:0})-ЦЕЛОЕ((СУММПРОИЗВ((ПСТР(A1;СТРОКА($1:$10);1)*1)*{2:4:10:3:5:9:4:6:8:0})/11))*11>10;0;СУММПРОИЗВ((ПСТР(A1;СТРОКА($1:$10);1)*1)*{2:4:10:3:5:9:4:6:8:0})-ЦЕЛОЕ((СУММПРОИЗВ((ПСТР(A1;СТРОКА($1:$10);1)*1)*{2:4:10:3:5:9:4:6:8:0})/11))*11)=ПСТР(A1;10;1)*1;"верно";"неверно");ЕСЛИ(СУММПРОИЗВ(ЕСЛИ(ЕСЛИ(СУММПРОИЗВ(--(ПСТР(A1;СТРОКА($1:$12);1));{7:2:4:10:3:5:9:4:6:8:0:0})-ЦЕЛОЕ(СУММПРОИЗВ(--(ПСТР(A1;СТРОКА($1:$12);1));{7:2:4:10:3:5:9:4:6:8:0:0})/11)*11=10;0;СУММПРОИЗВ(--(ПСТР(A1;СТРОКА($1:$12);1));{7:2:4:10:3:5:9:4:6:8:0:0})-ЦЕЛОЕ(СУММПРОИЗВ(--(ПСТР(A1;СТРОКА($1:$12);1));{7:2:4:10:3:5:9:4:6:8:0:0})/11)*11)=ПСТР(A1;11;1)*1;1;0);ЕСЛИ(ЕСЛИ(СУММПРОИЗВ(--(ПСТР(A1;СТРОКА($1:$12);1));{3:7:2:4:10:3:5:9:4:6:8:0})-ЦЕЛОЕ(СУММПРОИЗВ(--(ПСТР(A1;СТРОКА($1:$12);1));{3:7:2:4:10:3:5:9:4:6:8:0})/11)*11=10;0;СУММПРОИЗВ(--(ПСТР(A1;СТРОКА($1:$12);1));{3:7:2:4:10:3:5:9:4:6:8:0})-ЦЕЛОЕ(СУММПРОИЗВ(--(ПСТР(A1;СТРОКА($1:$12);1));{3:7:2:4:10:3:5:9:4:6:8:0})/11)*11)=ПСТР(A1;12;1)*1;1;0))=1;"верно";"не верно"))

    Также как правильно делать проверку на уникальность сразу двух полей ИНН и КПП, т.е каждое по отдельности поле может быть не уникальным, а в связке ИНН и КПП, только уникальным.


    23 июля 2013 г. 14:34

Ответы

Все ответы

  • Это не отработает в качестве формулы валидации значения поля,

    даже если и захотеть разобраться куда в этом аду подставлять название поля для валидации.

    Вам остается внимательно изучить правила составления выражений для валидации, они практически такие же как и для Calculated Field'ов.

    Если же не получится имеющимися средствами написать формулу валидации для шарика идентичную той что была указана вами, то вам останется только одно - писать Event Receiver и проводить валидацию там но уже C#-ным кодом.

    Других вариантов нет.


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    23 июля 2013 г. 15:25
  • Использование InfoPath 2010-2013, может как то помочь в решении этой задачи, или по сути это просто "другая обертка" формы?

    И вообще немного "диковато", понимаю что возможно не самая профильная проверка для Sharepoint, но пока, поиски тех кто реализовал проверку по нижеуказанному правилу не увенчались успехом.

    Собственно сам алгоритм проверки значений ИНН (из сети):

    Алгоритм проверки ИНН

    1.Алгоритм проверки 10-го значного ИНН.
    ИНН.10. 1)Находим произведения первых 9-ти цифр ИНН на спепиальные множители соотственно. 9 множителей ( 2 4 10 3 5 9 4 6 8 ).
    ИНН.10. 2) Складываем все 9-ть получившихся произведений.
    ИНН.10. 3) Получившуюся сумму делим на число 11 и извлекаем целую часть частного от деления.
    ИНН.10. 4) Умножаем получившееся число на 11.
    ИНН.10. 5) Сравниваем числа получившиеся на шаге 2 и шаге 4, их разница, и есть контрольное число, которое и должно равняться 10-й цифре в ИНН. (Если контрольное число получилось равным 10-ти, в этом случае принимаем контрольное число равным 0.)

    2.Алгоритм проверки 12-го значного ИНН.
    ИНН.12. 1)Находим произведения первых 10-ти цифр ИНН на спепиальные множители соотственно (10-ю цифру принимаем за 0). 10 множителей ( 7 2 4 10 3 5 9 4 6 8 ).
    ИНН.12. 2) Складываем все 10-ть получившихся произведений.
    ИНН.12. 3) Получившуюся сумму делим на число 11 и извлекаем целую часть частного от деления.
    ИНН.12. 4) Умножаем получившееся число на 11. ИНН.12. 5) Сравниваем числа получившиеся на шаге 2 и шаге 4, их разница, и есть первое контрольное число, которое и должно равняться 11-й цифре в ИНН.(Если контрольное число получилось равным 10-ти, в этом случае принимаем контрольное число равным 0.) Если получившееся число не не равно 11-ой цифре ИНН, значит ИНН не верный, если же совпадает, тогда высчитываем следующее контрольное число, которое должно быть равным 12-ой цифре ИНН
    ИНН.12. 6)Находим произведения первых 11-ти цифр ИНН на спепиальные множители соотственно (10-ю цифру принимаем за 0). 11 множителей ( 3 7 2 4 10 3 5 9 4 6 8 ).
    ИНН.12. 7) Складываем все 11-ть получившихся произведений.
    ИНН.12. 8) Получившуюся сумму делим на число 11 и извлекаем целую часть частного от деления.
    ИНН.12. 9) Умножаем получившееся число на 11.
    ИНН.12. 10) Сравниваем числа получившиеся на шаге 7 и шаге 9, их разница, и есть контрольное число, которое и должно равняться 12-й цифре в ИНН. (Если контрольное число получилось равным 10-ти, в этом случае принимаем контрольное число равным 0.) Если высчитанное число равно 12-ой цифре ИНН, и на первом этапе все контрольное число совпало с 11-ой цифрой ИНН, следовательно ИНН считается верным.

    • Изменено GhostInTheDitch 23 июля 2013 г. 16:08 Исправление
    23 июля 2013 г. 15:57
  • Над вопросом работаем в двух направлениях.

    1. Event Reciever

    И тут нужна помощь, в компании только один дотнет разработчик и тот ранее не работал с Sharepoint, готов разобраться, окружение почти настроено, но у меня опыта разработки почти не было, нужны пояснения, буквально несколько первоначальных шагов, что выделить, как создать проект, для того что бы делать Event Reciever для поля ИНН (VS2010)

    2. Сделана формула в Excel (может кому нибудь тоже пригодится)

    Ссылка на Skydrive - http://sdrv.ms/1cIWz9L

    К сожалению, при более простой проверке получил следующую ошибку.

    Проверяем:

    =(ПСТР(ИНН;1;1)*7+ПСТР(ИНН;2;1)*2+ПСТР(ИНН;3;1)*4+ПСТР(ИНН;4;1)*10+ПСТР(ИНН;5;1)*3+ПСТР(ИНН;6;1)*5+ПСТР(ИНН;7;1)*9+ПСТР(ИНН;8;1)*4+ПСТР(ИНН;9;1)*6+ПСТР(ИНН;10;1)*8)

    Ошибка:

    "ПСТР" не является допустимой функцией XSLT или XPath.

    (-->ПСТР(., 1, 1)<-- * 7 + ПСТР(., 2, 1) * 2 + ПСТР(., 3, 1) * 4 + ПСТР(., 4, 1) * 10 + ПСТР(., 5, 1) * 3 + ПСТР(., 6, 1) * 5 + ПСТР(., 7, 1) * 9 + ПСТР(., 8, 1) * 4 + ПСТР(., 9, 1) * 6 + ПСТР(., 10, 1) * 8)

    Кто-нибудь знает как это обходить или "alias kaput" )?


    16 августа 2013 г. 10:06
  • Проект ближе к стадии завершения.

    Смигрировал данные, и тут выяснилась неприятная особенность. 

    В форме есть проверка (Event reciever), развернута как решение на сайте, которая проверяет на уникальность ИНН и КПП, т.е смотрит есть ли в списке подобная комбинация, связка ИНН и КПП.  Так вот до миграции, данная операция занимала миллисекунды, а на 11000 тыс. элементов порядка 2 минут.

    Т.е заполняем форму, нажимаем кнопку "Сохранить" он крутит иконку прогресса, пишет что отправляет данные на сервер, и через пару минут наконец отвечает что указанные ИНН и КПП не уникальны.

    Это при том что у front end и БД серверов ресурсов в избытке. (( 

    Вопрос это можно исправить или проверка значений на уникальность в Sharepoint (архитектурно) по определению будет занимать много времени.   В прежнем решении на Sharepoint 2.0 проверки были написаны на SQL тригеррах, и проверка на уникальность занимала пару секунд.   

    11 августа 2014 г. 7:58
  • Скажите, а каким образом осуществляется поиск и сопоставление ИНН и КПП?
    11 августа 2014 г. 8:24
    Модератор
  • Добрый день,

    Вы перебираете 11к. элементов и сравниваете значения? Если так, то конечно будет выполняться долго.

    Я бы предложил проверять уникальность прямо из формы в коде (если нет такого ограничения). При этом данные запрашивать не все конечно, а составлять CAML запрос, в который включать только поля ИНН и КПП - выполнится на порядок быстрее.

    И как у вас связана форма и event reciever? Тут непонятно, не вижу обратной связи.

    Использование InfoPath не упростит задачу.

    11 августа 2014 г. 8:30
  • В Event Reciever была следующая проверка запускаемая при сохранении элемента списка:

    //if (!CheckAttrs.Error)
                            //{
                            //    string inn = properties.AfterProperties["Details_INN0"].ToString();
                            //    string kpp = properties.AfterProperties["Details_KPP0"].ToString();
                            //    string innValue = "";
                            //    string kppValue = "";
                            //    int clientID = -1;
                            //    if (!adding) clientID = properties.ListItemId;
                            //    for (int i = 0; i < properties.List.ItemCount; i++)
                            //    {
                            //        if (!adding && (clientID == properties.List.Items[i].ID)) continue;
                            //        innValue = properties.List.Items[i]["Details_INN0"] == null ? "" : properties.List.Items[i]["Details_INN0"].ToString().ToUpper();
                            //        kppValue = properties.List.Items[i]["Details_KPP0"] == null ? "" : properties.List.Items[i]["Details_KPP0"].ToString().ToUpper();
                            //        if (
                            //            (CheckAttrs.EntityType == EntityType.Person && innValue == inn.ToUpper()) ||
                            //            (CheckAttrs.EntityType == EntityType.Client && innValue == inn.ToUpper() && kppValue == kpp.ToUpper())
                            //           )
                                        
                            //        {
                            //            if (CheckAttrs.EntityType == EntityType.Client) 
                            //                CheckAttrs.SetErrorCode(CheckAttrs.REGISTER_SUPPLIERS_DUBLICATE_INN_KPP, true);
                            //            else
                            //                CheckAttrs.SetErrorCode(CheckAttrs.PERSON_DUBLICATE_INN, true);
                            //            res = false;
                            //            break;
                            //        }
                            //    }
                            //}

    13 августа 2014 г. 15:06
  • Максим, спасибо за ответ. Но все вышло как раз наоборот, так как это веб форма InfoPath c кодом как то совсем сложно, а на текущий момент сделал следующее, проверку уникальности исключили в Event Reciever, и перенес ее в InfoPath, уже не помню почему сразу ее не стал делать в InfoPath, но сделать ее было совсем не сложно. 

    Сделал в форме еще одно подключение к данным, текущего списка, и далее правило:

    где желтым отмечены поля ИНН и КПП подгружаемые из самого же списка. 

    Для того что-бы не увеличивать время загрузки формы на подгрузку данных, сделал следующее

    когда изменяется поле ИНН при переходе на другое поле начинают загружаться данные  ИНН и КПП списка, в это время, как правило, менеджер копирует значение КПП из другого источника, и в тот момент когда он возвращается данные уже загружены (2 секунды), когда вставляет значение КПП в поле происходит проверка уникальности, где-то 0.5 секунды. 

    Отвечая на вопрос, event reciever развернут как решение на сайте, обработчик событий срабатывает когда элемент списка сохраняется или изменяется.

    13 августа 2014 г. 15:26
  • Держите формулу проверки ИНН

    =OR(AND(LEN([INN]=10),
    MOD(MOD(MID([INN],1,1)*2+MID([INN],2,1)*4+MID([INN],3,1)*10+

    MID([INN],4,1)*3+MID([INN],5,1)*5+MID([INN],6,1)*9+MID([INN],7,1)*4+
    MID([INN],8,1)*6+MID([INN],9,1)*8,11),10)-MID([INN],10,1)=0),
    AND(LEN([INN])=12, MOD(MOD(MID([INN],1,1)*7+MID([INN],2,1)*2+MID([INN],3,1)*4+

    MID([INN],4,1)*10+
    MID([INN],5,1)*3+MID([INN],6,1)*5+MID([INN],7,1)*9+MID([INN],8,1)*4+MID([INN],9,1)*6+

    MID([INN],10,1)*8,11),10)-
    MID([INN],LEN([INN])-1,1)=0,
    MOD(MOD(MID([INN],1,1)*3+
    MID([INN],2,1)*7+MID([INN],3,1)*2+MID([INN],4,1)*4+MID([INN],5,1)*10+
    MID([INN],6,1)*3+MID([INN],7,1)*5+MID([INN],8,1)*9+MID([INN],9,1)*4+

    MID([INN],10,1)*6+MID([INN],LEN([INN])-1,1)*8,11),10)-
    MID([INN],LEN([INN]),1)=0))

    • Предложено в качестве ответа Marina_Karmanova 22 сентября 2014 г. 11:44
    22 сентября 2014 г. 11:42
  • Wow! Даже
    не ожидал что кто нибудь ответит ))) Спасибо большое!

    Марина, я
    так понял это алгоритм проверки 10-значного ИНН (юр. лицо) , не сочтите за наглость, нет ли у вас
    случайно алгоритмов для проверки:

    корр - расч. счетов, юридического, физического лица.

    К слову
    может есть способ получить эти проверки в InfoPath (tool) конвертацией из чего
    нибудь другого Excel, C#?




    22 сентября 2014 г. 12:27
  • Код проверяет 10 и 12-значный ИНН.

    КПП:

    Согласно приказу МНС России от 3 марта 2004 года № БГ-3-09/178, структура кода причины постановки на учет представляет собой девятизначный номер (NNNNPPXXX), где: NNNN – код налогового органа, где была поставлена на учет организация; PP – причина постановки на учет (эти символы могут принимать значения для российских организаций – от 1 до 50, для иностранных – от 51 до 99); XXX – порядковый номер постановки на учет в территориальном налоговом органе (цифры показывают, сколько раз организация вставала на учет по данной причине).

    Нет контрольной цифры. Какую проверку тут можно сделать, даже не знаю

    22 сентября 2014 г. 12:53
  • Есть такое, с КПП переборщил )) нет там проверок кроме количества знаков ).  

    Осталось только придумать как проверять значение корр. и расч. счета!

    Так-же не сразу узнал, что:

    "Для расчётно-кассового центра или другого подразделения в составе территориального учреждения Банка России, наделённого функциями расчётно-кассового (кассового) центра, в данных разрядах указывается значение «000».

    Для Головного расчётно-кассового центра или другого подразделения в составе территориального учреждения Банка России, наделённого функциями Головного расчётно-кассового центра, в данных разрядах указывается значение «001»." 

    а для этих подразделений не указывается корр. счет, а проверка расчетного счета вроде бы как отличается ( http://www.forum.mista.ru/topic.php?id=277558

    Надеюсь мне хватит терпения перенести оставшиеся проверки из EventReciever в InfoPath )



    22 сентября 2014 г. 13:07