Проверка валидности ИНН

3. Утюг 56 06.03.15 13:02 Сейчас в теме
Не совсем корректная проверка. Например, вполне себе годный ИНН 612101881190 проверку не проходит. Дело в том, что есть один маленький нюанс:
если остаток от деления = 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;
   КонецЕсли;
КонецФункции
Показать
rougudz; +1
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. antares2010 10.03.15 12:02 Сейчас в теме
Это в какое место конфигурации вставлять?
+
5. rougudz 10.03.15 16:28 Сейчас в теме
в Функции Валидность12 добавил
Если Остаток = 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;
	КонецЕсли;
КонецФункции
Показать
+
6. пользователь 11.03.15 14:42
Сообщение было скрыто модератором.
...
7. antares2010 12.03.15 10:41 Сейчас в теме
В связи с грядущими событиями, тема как никогда актуальна. Подскажите лучше, какой слэш правильно ставить между ИНН и КПП в справочнике контрагентов, прямой или обратный? Если ни какой не проставить, то в сформированной книге продаж ставится прямой "/", хотя вроде как нужно ставить обратный "\"? Чёт я запутался.
+
8. Зеленоград 12.03.15 10:44 Сейчас в теме
Тема актуальна, да.

Но функцию можно было загуглить за 3 минуты. Я вывел на отдельную кнопку, проверяю не всех контрагентов, а только тех, по кому есть документы за период. Релизить?
+
9. antares2010 12.03.15 11:13 Сейчас в теме
10. Зеленоград 12.03.15 11:29 Сейчас в теме
Пока сюда выложу код. Если к ночи будут силы и тут будет интерес - сделаю нормальную публикацию.

На форму обработки 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;
ТекКонтрагент = ТаблицаКонтрагентовДляПроверкиИНН.Контрагент;
Сообщить("Ошибка ИНН у организации " + ТекКонтрагент + ", код " + ТекКонтрагент.Код + ", ИНН " + ТекКонтрагент.ИНН);
КонецЕсли;
КонецЦикла;

ТаблицаКонтрагентовДляПроверкиИНН.ВыбратьСтроку("результат проверки ИНН по списку");

КонецПроцедуры //Сформировать()

//*****************************************************************************
+
11. N2 3 13.03.15 11:18 Сейчас в теме
Всем добрый день!
У меня одного проявляется глюк, когда конструкция:

Функция глВалидностьИНН(тИНН)   Экспорт
   тИНН=СокрЛП(тИНН);
   темпИНН = СокрЛП(тИНН);
   Сообщить (СтрДлина(темпИНН)); // длина 10 символов
   Сообщить (СтрДлина(тИНН)); // длина 20 символов
   Если СтрДлина(тИНН)=10 Тогда
      Возврат ВалидностьИНН10(тИНН);
   ИначеЕсли  СтрДлина(тИНН)=12 Тогда 
      Возврат ВалидностьИНН12(тИНН);
   Иначе
      Возврат 0;
   КонецЕсли;
КонецФункции
Показать


В случае с темпИНН выдаёт 10 символов, а в случае с тИНН выдает 20?
На всякий случай скрин прикрепил.
p.s. а вы этим не в связи с новым НДС занимаетесь?
Прикрепленные файлы:
+
12. Abadonna 3959 30.12.07 23:22 Сейчас в теме
Где-то оно у меня раньше было, ткнулся - нет. По сайтай поискал функцию, не нашел (может плохо искал)
Пришлось набрость на скорую руку, может кому еще сгодится:
Код
Функция ВалидностьИНН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, пришлось по старинке ;)
Зато понятнее
+
13. poppy 30.12.07 23:45 Сейчас в теме
Abadonna Написал:
-------------------------------------------------------
> P.S. Забыл оператор, ктр. реализует функцию mod,
> пришлось по старинке
> Зато понятнее

mod = %

+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот