Не совсем корректная проверка. Например, вполне себе годный ИНН 612101881190 проверку не проходит. Дело в том, что есть один маленький нюанс:
если остаток от деления = 10, то остаток = 0. Кроме того, ИНН12 содержит 2 контрольные цифры. Значит, и проверять желательно обе.
если остаток от деления = 10, то остаток = 0. Кроме того, ИНН12 содержит 2 контрольные цифры. Значит, и проверять желательно обе.
Функция ВалидностьИНН12(пИНН)
Перем А[12];
Для i=1 По СтрДлина(пИНН) Цикл
А[i]=Число(Сред(пИНН,i,1));
КонецЦикла;
//Проверка первого контрольного числа
Сумма = А[1]*3 + А[2]*7 + А[3]*2 + А[4]*4 + А[5]*10 + А[6]*3 + А[7]*5 + А[8]*9 + А[9]*4 + А[10]*6 + А[11]*8;
Остаток = Сумма % 11;
Если Остаток = 10 Тогда
Остаток = 0;
КонецЕсли;
Если А[12] <> Остаток Тогда
Возврат 0;
КонецЕсли;
//Проверка второго контрольного числа
Сумма = А[1]*7 + А[2]*2 + А[3]*4 + А[4]*10 + А[5]*3 + А[6]*5 + А[7]*9 + А[8]*4 + А[9]*6 + А[10]*8;
Остаток = Сумма % 11;
Если Остаток = 10 Тогда
Остаток = 0;
КонецЕсли;
Если А[11] = Остаток Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Функция ВалидностьИНН10(пИНН)
Перем А[10];
Для i=1 По СтрДлина(пИНН) Цикл
А[i]=Число(Сред(пИНН,i,1));
КонецЦикла;
Сумма=А[1]*2+А[2]*4+А[3]*10+А[4]*3+А[5]*5+А[6]*9+А[7]*4+А[8]*6+А[9]*8;
Остаток = Сумма % 11;
Если А[10]=Остаток Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Функция глВалидностьИНН(тИНН) Экспорт
тИНН=СокрЛП(тИНН);
Если СтрДлина(тИНН)=10 Тогда
Возврат ВалидностьИНН10(тИНН);
ИначеЕсли СтрДлина(тИНН)=12 Тогда
Возврат ВалидностьИНН12(тИНН);
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
ПоказатьПо теме из базы знаний
- Проверка ИНН v.7.7
- Интеграция 1С и CMS WordPress посредством Rest API сайта. Первый шаг
- Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория
- Как быстро развернуть автоматическую линию проверки своего решения на 1С, затратив 8 часов и получив выигрыш в 1 человеко/месяц
- Поиск и обработка ликвидированных юридических лиц (ЛИКВЮЛ) и ИП (ЛИКВИП) в 1С 8.3
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
в Функции Валидность12 добавил
а в Функция ВалидностьИНН10(пИНН) не добавил.
у меня масса клиентов с реальными ИНН выпала с ошибкой....
вот мой вариант, т.е. не мой... измененный
Если Остаток = 10 Тогда
Остаток = 0;
КонецЕсли;
а в Функция ВалидностьИНН10(пИНН) не добавил.
у меня масса клиентов с реальными ИНН выпала с ошибкой....
вот мой вариант, т.е. не мой... измененный
Функция ВалидностьИНН12(пИНН)
Перем А[12];
Для i=1 По СтрДлина(пИНН) Цикл
А[i]=Число(Сред(пИНН,i,1));
КонецЦикла;
//Проверка первого контрольного числа
Сумма = А[1]*3 + А[2]*7 + А[3]*2 + А[4]*4 + А[5]*10 + А[6]*3 + А[7]*5 + А[8]*9 + А[9]*4 + А[10]*6 + А[11]*8;
Остаток = Сумма % 11;
Если Остаток = 10 Тогда
Остаток = 0;
КонецЕсли;
Если А[12] <> Остаток Тогда
Возврат 0;
КонецЕсли;
//Проверка второго контрольного числа
Сумма = А[1]*7 + А[2]*2 + А[3]*4 + А[4]*10 + А[5]*3 + А[6]*5 + А[7]*9 + А[8]*4 + А[9]*6 + А[10]*8;
Остаток = Сумма % 11;
Если Остаток = 10 Тогда
Остаток = 0;
КонецЕсли;
Если А[11] = Остаток Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Функция ВалидностьИНН10(пИНН)
Перем А[10];
Для i=1 По СтрДлина(пИНН) Цикл
А[i]=Число(Сред(пИНН,i,1));
КонецЦикла;
Сумма=А[1]*2+А[2]*4+А[3]*10+А[4]*3+А[5]*5+А[6]*9+А[7]*4+А[8]*6+А[9]*8;
Остаток = Сумма % 11;
Если Остаток = 10 Тогда
Остаток = 0;
КонецЕсли;
Если А[10]=Остаток Тогда
Возврат 1;
Иначе
//Сообщить("А[10]: "+СпС(А[10]));
//Сообщить("Остаток: "+СпС(Остаток));
Возврат 0;
КонецЕсли;
КонецФункции
Функция глВалидностьИНН(тИНН) Экспорт
тИНН=СокрЛП(тИНН);
Если СтрДлина(тИНН)=10 Тогда
Возврат ВалидностьИНН10(тИНН);
ИначеЕсли СтрДлина(тИНН)=12 Тогда
Возврат ВалидностьИНН12(тИНН);
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Показать
В связи с грядущими событиями, тема как никогда актуальна. Подскажите лучше, какой слэш правильно ставить между ИНН и КПП в справочнике контрагентов, прямой или обратный? Если ни какой не проставить, то в сформированной книге продаж ставится прямой "/", хотя вроде как нужно ставить обратный "\"? Чёт я запутался.
Тема актуальна, да.
Но функцию можно было загуглить за 3 минуты. Я вывел на отдельную кнопку, проверяю не всех контрагентов, а только тех, по кому есть документы за период. Релизить?
Но функцию можно было загуглить за 3 минуты. Я вывел на отдельную кнопку, проверяю не всех контрагентов, а только тех, по кому есть документы за период. Релизить?
Пока сюда выложу код. Если к ночи будут силы и тут будет интерес - сделаю нормальную публикацию.
На форму обработки 2 даты, ДатаНачала и ДатаКонца. В процедуре ВыбратьКонтрагентовПоДокументамЗаПериод укажите свои виды документов (у меня нетиповая конфа).
Перем ТаблицаКонтрагентовДляПроверкиИНН;
//*****************************************************************************
Функция КонтрольнаяСуммаИНН(n,inn)
Перем checksum[11];
checksum[1]=3;
checksum[2]=7;
checksum[3]=2;
checksum[4]=4;
checksum[5]=10;
checksum[6]=3;
checksum[7]=5;
checksum[8]=9;
checksum[9]=4;
checksum[10]=6;
checksum[11]=8;
s=0;
Для i=1 По n-1 Цикл
s=s+Число(Сред(inn,i,1))*checksum[12-n+i];
КонецЦикла;
Возврат s%11%10;
КонецФункции //КонтрольнаяСуммаИНН()
//*****************************************************************************
Функция лПроверитьИНН(Знач inn) //Экспорт
inn=СокрЛП(Строка(inn));
len=СтрДлина(inn);
Если len=10 тогда
Если Число(Сред(inn,10,1))<>КонтрольнаяСуммаИНН(10,inn) тогда Возврат 0; КонецЕсли;
ИначеЕсли len=12 then
Если Число(Сред(inn,11,1))<>КонтрольнаяСуммаИНН(11,inn) тогда Возврат 0; КонецЕсли;
Если Число(Сред(inn,12,1))<>КонтрольнаяСуммаИНН(12,inn) тогда Возврат 0; КонецЕсли;
ИначеЕсли len<>0 Тогда
Сообщить("inn" + inn);
Возврат 0;
КонецЕсли;
Возврат 1;
КонецФункции //глПроверитьИНН()
//*****************************************************************************
Процедура ВыбратьКонтрагентовПоДокументамЗаПериод(ТаблицаКонтрагентовДляПроверкиИНН, ДатаНачала, ДатаКонца)
Перем Запрос, ТекстЗапроса;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(ВыбратьКонтрагентовПоДокументамЗаПериод)
|Период с ДатаНачала по ДатаКонца;
|Обрабатывать НеПомеченныеНаУдаление;
|Без итогов;
|ТекДок = Документ.РН.ТекущийДокумент, Документ.СФ.ТекущийДокумент;
|Контрагент = Документ.РН.Клиент, Документ.СФ.Контрагент;
//|Условие Контрагент.ВидКонтрагента = &Юрлицо;
|Группировка Контрагент;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Пока Запрос.Группировка() = 1 Цикл
ТекКонтрагент = Запрос.Контрагент;
//Сообщить(СокрЛП(ТекКонтрагент) + "," + ТекКонтрагент.ИНН);
Если ТекКонтрагент.ВидКонтрагента = Перечисление.ВидыКонтрагентов.Организация Тогда
ТаблицаКонтрагентовДляПроверкиИНН.НоваяСтрока();
ТаблицаКонтрагентовДляПроверкиИНН.Контрагент = ТекКонтрагент;
ТаблицаКонтрагентовДляПроверкиИНН.ИНН = ТекКонтрагент.ИНН;
ТаблицаКонтрагентовДляПроверкиИНН.КПП = ТекКонтрагент.КПП;
ТаблицаКонтрагентовДляПроверкиИНН.Проверен = 0;
ТаблицаКонтрагентовДляПроверкиИНН.Ошибка = 0;
ИначеЕсли ТекКонтрагент.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ДочернееОбщество Тогда
Сообщить("Проверьте вид контрагента у " + ТекКонтрагент, "!");
ИначеЕсли ТекКонтрагент.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЗависимоеОбщество Тогда
Сообщить("Проверьте вид контрагента у " + ТекКонтрагент,"!");
ИначеЕсли ТекКонтрагент.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо Тогда
// У физлиц можно не проверять?
КонецЕсли;
КонецЦикла;
КонецПроцедуры //ВыбратьКонтрагентовПоДокументамЗаПериод(ТаблицаКонтрагентовДляПроверкиИНН, ДатаНачала, ДатаКонца)
//*****************************************************************************
Процедура Сформировать()
//Перем СчДокДляПроверки, ВсегоДокументов;
ВыбратьКонтрагентовПоДокументамЗаПериод(ТаблицаКонтрагентовДляПроверкиИНН, ДатаНачала,ДатаКонца);
ТаблицаКонтрагентовДляПроверкиИНН.ВыбратьСтроки();
Пока ТаблицаКонтрагентовДляПроверкиИНН.ПолучитьСтроку() = 1 Цикл
Если лПроверитьИНН(ТаблицаКонтрагентовДляПроверкиИНН.ИНН) = 1 Тогда
ТаблицаКонтрагентовДляПроверкиИНН.Проверен = 1
Иначе
ТаблицаКонтрагентовДляПроверкиИНН.Ошибка = 1;
ТекКонтрагент = ТаблицаКонтрагентовДляПроверкиИНН.Контрагент;
Сообщить("Ошибка ИНН у организации " + ТекКонтрагент + ", код " + ТекКонтрагент.Код + ", ИНН " + ТекКонтрагент.ИНН);
КонецЕсли;
КонецЦикла;
ТаблицаКонтрагентовДляПроверкиИНН.ВыбратьСтроку("результат проверки ИНН по списку");
КонецПроцедуры //Сформировать()
//*****************************************************************************
На форму обработки 2 даты, ДатаНачала и ДатаКонца. В процедуре ВыбратьКонтрагентовПоДокументамЗаПериод укажите свои виды документов (у меня нетиповая конфа).
Перем ТаблицаКонтрагентовДляПроверкиИНН;
//*****************************************************************************
Функция КонтрольнаяСуммаИНН(n,inn)
Перем checksum[11];
checksum[1]=3;
checksum[2]=7;
checksum[3]=2;
checksum[4]=4;
checksum[5]=10;
checksum[6]=3;
checksum[7]=5;
checksum[8]=9;
checksum[9]=4;
checksum[10]=6;
checksum[11]=8;
s=0;
Для i=1 По n-1 Цикл
s=s+Число(Сред(inn,i,1))*checksum[12-n+i];
КонецЦикла;
Возврат s%11%10;
КонецФункции //КонтрольнаяСуммаИНН()
//*****************************************************************************
Функция лПроверитьИНН(Знач inn) //Экспорт
inn=СокрЛП(Строка(inn));
len=СтрДлина(inn);
Если len=10 тогда
Если Число(Сред(inn,10,1))<>КонтрольнаяСуммаИНН(10,inn) тогда Возврат 0; КонецЕсли;
ИначеЕсли len=12 then
Если Число(Сред(inn,11,1))<>КонтрольнаяСуммаИНН(11,inn) тогда Возврат 0; КонецЕсли;
Если Число(Сред(inn,12,1))<>КонтрольнаяСуммаИНН(12,inn) тогда Возврат 0; КонецЕсли;
ИначеЕсли len<>0 Тогда
Сообщить("inn" + inn);
Возврат 0;
КонецЕсли;
Возврат 1;
КонецФункции //глПроверитьИНН()
//*****************************************************************************
Процедура ВыбратьКонтрагентовПоДокументамЗаПериод(ТаблицаКонтрагентовДляПроверкиИНН, ДатаНачала, ДатаКонца)
Перем Запрос, ТекстЗапроса;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(ВыбратьКонтрагентовПоДокументамЗаПериод)
|Период с ДатаНачала по ДатаКонца;
|Обрабатывать НеПомеченныеНаУдаление;
|Без итогов;
|ТекДок = Документ.РН.ТекущийДокумент, Документ.СФ.ТекущийДокумент;
|Контрагент = Документ.РН.Клиент, Документ.СФ.Контрагент;
//|Условие Контрагент.ВидКонтрагента = &Юрлицо;
|Группировка Контрагент;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Пока Запрос.Группировка() = 1 Цикл
ТекКонтрагент = Запрос.Контрагент;
//Сообщить(СокрЛП(ТекКонтрагент) + "," + ТекКонтрагент.ИНН);
Если ТекКонтрагент.ВидКонтрагента = Перечисление.ВидыКонтрагентов.Организация Тогда
ТаблицаКонтрагентовДляПроверкиИНН.НоваяСтрока();
ТаблицаКонтрагентовДляПроверкиИНН.Контрагент = ТекКонтрагент;
ТаблицаКонтрагентовДляПроверкиИНН.ИНН = ТекКонтрагент.ИНН;
ТаблицаКонтрагентовДляПроверкиИНН.КПП = ТекКонтрагент.КПП;
ТаблицаКонтрагентовДляПроверкиИНН.Проверен = 0;
ТаблицаКонтрагентовДляПроверкиИНН.Ошибка = 0;
ИначеЕсли ТекКонтрагент.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ДочернееОбщество Тогда
Сообщить("Проверьте вид контрагента у " + ТекКонтрагент, "!");
ИначеЕсли ТекКонтрагент.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЗависимоеОбщество Тогда
Сообщить("Проверьте вид контрагента у " + ТекКонтрагент,"!");
ИначеЕсли ТекКонтрагент.ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо Тогда
// У физлиц можно не проверять?
КонецЕсли;
КонецЦикла;
КонецПроцедуры //ВыбратьКонтрагентовПоДокументамЗаПериод(ТаблицаКонтрагентовДляПроверкиИНН, ДатаНачала, ДатаКонца)
//*****************************************************************************
Процедура Сформировать()
//Перем СчДокДляПроверки, ВсегоДокументов;
ВыбратьКонтрагентовПоДокументамЗаПериод(ТаблицаКонтрагентовДляПроверкиИНН, ДатаНачала,ДатаКонца);
ТаблицаКонтрагентовДляПроверкиИНН.ВыбратьСтроки();
Пока ТаблицаКонтрагентовДляПроверкиИНН.ПолучитьСтроку() = 1 Цикл
Если лПроверитьИНН(ТаблицаКонтрагентовДляПроверкиИНН.ИНН) = 1 Тогда
ТаблицаКонтрагентовДляПроверкиИНН.Проверен = 1
Иначе
ТаблицаКонтрагентовДляПроверкиИНН.Ошибка = 1;
ТекКонтрагент = ТаблицаКонтрагентовДляПроверкиИНН.Контрагент;
Сообщить("Ошибка ИНН у организации " + ТекКонтрагент + ", код " + ТекКонтрагент.Код + ", ИНН " + ТекКонтрагент.ИНН);
КонецЕсли;
КонецЦикла;
ТаблицаКонтрагентовДляПроверкиИНН.ВыбратьСтроку("результат проверки ИНН по списку");
КонецПроцедуры //Сформировать()
//*****************************************************************************
Всем добрый день!
У меня одного проявляется глюк, когда конструкция:
В случае с темпИНН выдаёт 10 символов, а в случае с тИНН выдает 20?
На всякий случай скрин прикрепил.
p.s. а вы этим не в связи с новым НДС занимаетесь?
У меня одного проявляется глюк, когда конструкция:
Функция глВалидностьИНН(тИНН) Экспорт
тИНН=СокрЛП(тИНН);
темпИНН = СокрЛП(тИНН);
Сообщить (СтрДлина(темпИНН)); // длина 10 символов
Сообщить (СтрДлина(тИНН)); // длина 20 символов
Если СтрДлина(тИНН)=10 Тогда
Возврат ВалидностьИНН10(тИНН);
ИначеЕсли СтрДлина(тИНН)=12 Тогда
Возврат ВалидностьИНН12(тИНН);
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
ПоказатьВ случае с темпИНН выдаёт 10 символов, а в случае с тИНН выдает 20?
На всякий случай скрин прикрепил.
p.s. а вы этим не в связи с новым НДС занимаетесь?
Прикрепленные файлы:
Где-то оно у меня раньше было, ткнулся - нет. По сайтай поискал функцию, не нашел (может плохо искал)
Пришлось набрость на скорую руку, может кому еще сгодится:
P.S. Забыл оператор, ктр. реализует функцию mod, пришлось по старинке ;)
Зато понятнее
Пришлось набрость на скорую руку, может кому еще сгодится:
Код |
---|
Функция ВалидностьИНН12(пИНН)
Перем А[12];
Для i=1 По СтрДлина(пИНН) Цикл
А[i]=Число(Сред(пИНН,i,1));
КонецЦикла;
Сумма=А[1]*3+А[2]*7+А[3]*2+А[4]*4+А[5]*10+А[6]*3+А[7]*5+А[8]*9+А[9]*4+А[10]*6+А[11]*8;
Остаток=Сумма-Цел(Сумма/11)*11;
Если А[12]=Остаток Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Функция ВалидностьИНН10(пИНН)
Перем А[10];
Для i=1 По СтрДлина(пИНН) Цикл
А[i]=Число(Сред(пИНН,i,1));
КонецЦикла;
Сумма=А[1]*2+А[2]*4+А[3]*10+А[4]*3+А[5]*5+А[6]*9+А[7]*4+А[8]*6+А[9]*8;
Остаток=Сумма-Цел(Сумма/11)*11;
Если А[10]=Остаток Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Функция глВалидностьИНН(тИНН) Экспорт
тИНН=СокрЛП(тИНН);
Если СтрДлина(тИНН)=10 Тогда
Возврат ВалидностьИНН10(тИНН);
ИначеЕсли СтрДлина(тИНН)=12 Тогда
Возврат ВалидностьИНН12(тИНН);
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Показать полностью |
P.S. Забыл оператор, ктр. реализует функцию mod, пришлось по старинке ;)
Зато понятнее
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот