новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума
Форум

Проверка украинских ИНН

    • #1
    • 03.09.2013 15:32
    0
    Перем ДлинаКода, ДлинаПроверки; ЕстьОшибкаВКоде=Ложь; ИНН = СокрЛП(ИНН); Если СтрДлина(ИНН)<>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))=ДлинаКода Тогда ЕстьОшибкаВКоде = Ложь; Иначе ЕстьОшибкаВКоде = Истина; КонецЕсли; Иначе ЕстьОшибкаВКоде = Истина; КонецЕсли; КонецЕсли; Если ЕстьОшибкаВКоде Тогда #Если Клиент Тогда Сообщить("Ошибка в коде ИНН", СтатусСообщения.Важное); #КонецЕсли КонецЕсли; Возврат Не ЕстьОшибкаВКоде; вот этот ИНН не пропускает 323752326504, . Валится когда ДлиннаКода = 10, повторный пересчет дает не верный результат. Как победить не знаю, прошу помощи
    • #2
    • 03.09.2013 21:06
    0
    В каком смысле "Валится"? Сунул во внешнюю обработку в таком виде:
    Функция ИННПравильный(ИНН)
    	Перем ДлинаКода, ДлинаПроверки;
    	ЕстьОшибкаВКоде=Ложь;
    	
    	
    	ИНН = СокрЛП(ИНН);
    	Если СтрДлина(ИНН)<>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))=ДлинаКода Тогда
    				ЕстьОшибкаВКоде = Ложь;
    			Иначе
    				ЕстьОшибкаВКоде = Истина;
    			КонецЕсли;
    			
    		Иначе
    			ЕстьОшибкаВКоде = Истина;
    		КонецЕсли;
    	КонецЕсли;
    	
    	Если ЕстьОшибкаВКоде Тогда
    		#Если Клиент Тогда
    			Сообщить("Ошибка в коде ИНН", СтатусСообщения.Важное);
    		#КонецЕсли
    	КонецЕсли;
    	
    	Возврат Не ЕстьОшибкаВКоде;
    КонецФункции
    
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    	Сообщить(ИННПравильный("323752326504"));
    КонецПроцедуры
    

    Результат выполнения:
    -----------------------------
    Ошибка в коде ИНН
    Нет
    -----------------------------
    Проверяется соответственно по ветке
    ИначеЕсли СтрДлина(ИНН)=12 Тогда
    

    При чем тут 10, и что я делаю не так? :)
    • #3
    • 03.09.2013 21:16
    0
    Ну там длинна разная бывает. как 12 так и 10, результат же ясен Ошибка в коде ИНН, значит что ИНН неправильный, а он то правильный
    • #4
    • 04.09.2013 01:05
    • Отредактировано: 04.09.2013 01:06:10
    0
    алгоритм расчета контрольной цифры украинского ИНН не разглашается. Методом научного тыка народ допетлил что для 9-ти и 12-значных используются следующие коэффициенты: 9 11 13 17 19 23 29 31 37 41 43 47 53
    Вроде как считается по формуле:
    	n12 = ((n1*11+ n2*13 + n3*17 + n4*19 + n5*23 + n6*29 + n7*31 + n8*37 + n9*41 + n10*43 + n11*47) % 11) % 10;
    	Если n12 = 0 Тогда
    		n12 = ((n1*13 + n2*17 + n3*19 + n4*23 + n5*29 + n6*31 + n7*37 + n8*41 + n9*43 + n10*47 + n11*53) % 11) %10;
    	КонецЕсли;
    

    где nX - соответствующая цифра по ИНН. Предполагаю что предпоследняя цифра считается по первым 10-ти, аналогичным образом, начиная с предыдущего коэффициента, и если получился ноль, то последняя считается по первым же 10-ти, но начиная с коэффициента 17:
    	n11 = ((n1*9 + n2*11 + n3*13 + n4*17 + n5*19 + n6*23 + n7*29 + n8*31 + n9*37 + n10*41) % 11) % 10;
    	Если n11 = 0 Тогда
    		n12 = ((n1*17 + n2*19 + n3*23 + n4*29 + n5*31 + n6*37 + n7*41 + n8*43 + n9*47 + n10*53) % 11) %10;
    	КонецЕсли;
    

    Таким образом функция будет выглядеть как-то так:
    Функция ИННПравильный(ИНН)
    	ИНН = СокрЛП(ИНН);
    	Если СтрДлина(ИНН)<>10 И СтрДлина(ИНН)<>9 И СтрДлина(ИНН)<>12 Тогда
    		#Если Клиент Тогда
    			Сообщить("Не соответствует длина кода ИНН", СтатусСообщения.Важное);
    		#КонецЕсли
    		Возврат Ложь;
    	КонецЕсли;
    	
    	//// 9 11 13 17 19 23 29 31 37 41 43 47 53 ////
    	n1 = Число(Сред(ИНН, 1, 1));
    	n2 = Число(Сред(ИНН, 2, 1));
    	n3 = Число(Сред(ИНН, 3, 1));
    	n4 = Число(Сред(ИНН, 4, 1));
    	n5 = Число(Сред(ИНН, 5, 1));
    	n6 = Число(Сред(ИНН, 6, 1));
    	n7 = Число(Сред(ИНН, 7, 1));
    	n8 = Число(Сред(ИНН, 8, 1));
    	n9 = Число(Сред(ИНН, 9, 1));
    	Если СтрДлина(ИНН) > 9 Тогда
    		n10 = Число(Сред(ИНН, 10, 1));
    	КонецЕсли;
    	Если СтрДлина(ИНН) > 10 Тогда
    		n11 = Число(Сред(ИНН, 11, 1));
    		n12 = Число(Сред(ИНН, 12, 1));
    	КонецЕсли;
    	
    	Если СтрДлина(ИНН) = 9 Тогда
    		Последняя = ((n1*9 + n2*11 + n3*13 + n4*17 + n5*19 + n6*23 + n7*29 + n8*31) % 11) % 10;
    		Если Последняя = 0 Тогда
    			Последняя = ((n1*11 + n2*13 + n3*17 + n4*19 + n5*23 + n6*29 + n7*31 + n8*37) % 11) % 10;
    		КонецЕсли;
    		
    		ЕстьОшибкаВКоде = Последняя <> n9;
    	ИначеЕсли СтрДлина(ИНН) = 12 Тогда
    		Последняя = ((n1*11+ n2*13 + n3*17 + n4*19 + n5*23 + n6*29 + n7*31 + n8*37 + n9*41 + n10*43 + n11*47) % 11) % 10;
    		Если Последняя = 0 Тогда
    			Последняя = ((n1*13 + n2*17 + n3*19 + n4*23 + n5*29 + n6*31 + n7*37 + n8*41 + n9*43 + n10*47 + n11*53) % 11) %10;
    		КонецЕсли;
    		
    		Предпоследняя = ((n1*9 + n2*11 + n3*13 + n4*17 + n5*19 + n6*23 + n7*29 + n8*31 + n9*37 + n10*41) % 11) % 10;
    		Если Предпоследняя = 0 Тогда
    			Последняя = ((n1*17 + n2*19 + n3*23 + n4*29 + n5*31 + n6*37 + n7*41 + n8*43 + n9*47 + n10*53) % 11) %10;
    		КонецЕсли;
    		
    		ЕстьОшибкаВКоде = Последняя <> n12;
    	ИначеЕсли СтрДлина(ИНН) = 10 Тогда
    		Последняя = ((n1*(-1) + n2*5 + n3*7 + n4*9 + n5*4 + n6*6 + n7*10 + n8*5 + n9*7) % 11) % 10;
    		
    		ЕстьОшибкаВКоде = Последняя <> n10;
    	КонецЕсли;
    	
    	Если ЕстьОшибкаВКоде Тогда
    		#Если Клиент Тогда
    			Сообщить("Ошибка в коде ИНН", СтатусСообщения.Важное);
    		#КонецЕсли
    	КонецЕсли;
    	
    	Возврат Не ЕстьОшибкаВКоде;
    КонецФункции
    

    Имейте ввиду, вывел чисто по логике на основании единственного украинского ИНН. Других не видел, в России живу так-то. Проверьте на других, где 11-я цифра ноль.
    • #5
    • 04.09.2013 11:26
    • Отредактировано: 04.09.2013 11:28:18
    0
    Вообщем разобралась. Сама в России живу, написала в Украинскую налоговою, может то ответят, но думаю врятли. На мисте предложили решение, которое подошло, вроде бы
    • #6
    • 04.09.2013 12:01
    +1
    А, значит не в нуле дело, а просто второй проход в любом случае с коэффициента 17 начинать надо. Только правильней наверное проверять не только последнюю, но и предпоследнюю цифры. Они ж обе расчетные. Как-то так:
    Функция ИННПравильный(ИНН)
    	ИНН = СокрЛП(ИНН);
    	Если СтрДлина(ИНН)<>10 И СтрДлина(ИНН)<>9 И СтрДлина(ИНН)<>12 Тогда
    		#Если Клиент Тогда
    			Сообщить("Не соответствует длина кода ИНН", СтатусСообщения.Важное);
    		#КонецЕсли
    		Возврат Ложь;
    	КонецЕсли;
    	
    	//// 9 11 13 17 19 23 29 31 37 41 43 47 53 59 ////
    	n1 = Число(Сред(ИНН, 1, 1));
    	n2 = Число(Сред(ИНН, 2, 1));
    	n3 = Число(Сред(ИНН, 3, 1));
    	n4 = Число(Сред(ИНН, 4, 1));
    	n5 = Число(Сред(ИНН, 5, 1));
    	n6 = Число(Сред(ИНН, 6, 1));
    	n7 = Число(Сред(ИНН, 7, 1));
    	n8 = Число(Сред(ИНН, 8, 1));
    	n9 = Число(Сред(ИНН, 9, 1));
    	Если СтрДлина(ИНН) > 9 Тогда
    		n10 = Число(Сред(ИНН, 10, 1));
    	КонецЕсли;
    	Если СтрДлина(ИНН) > 10 Тогда
    		n11 = Число(Сред(ИНН, 11, 1));
    		n12 = Число(Сред(ИНН, 12, 1));
    	КонецЕсли;
    	
    	Если СтрДлина(ИНН) = 9 Тогда
    		Последняя = ((n1*9 + n2*11 + n3*13 + n4*17 + n5*19 + n6*23 + n7*29 + n8*31) % 11) % 10;
    		Если Последняя = 0 Тогда
    			Последняя = ((n1*11 + n2*13 + n3*17 + n4*19 + n5*23 + n6*29 + n7*31 + n8*37) % 11) % 10;
    		КонецЕсли;
    		
    		ЕстьОшибкаВКоде = Последняя <> n9;
    	ИначеЕсли СтрДлина(ИНН) = 12 Тогда
    		Последняя = ((n1*11+ n2*13 + n3*17 + n4*19 + n5*23 + n6*29 + n7*31 + n8*37 + n9*41 + n10*43 + n11*47) % 11) % 10;
    		Если Последняя = 0 Тогда
    			Последняя = ((n1*17 + n2*19 + n3*23 + n4*29 + n5*31 + n6*37 + n7*41 + n8*43 + n9*47 + n10*53 + n11*59) % 11) %10;
    		КонецЕсли;
    		
    		Предпоследняя = ((n1*9 + n2*11 + n3*13 + n4*17 + n5*19 + n6*23 + n7*29 + n8*31 + n9*37 + n10*41) % 11) % 10;
    		
    		ЕстьОшибкаВКоде = Последняя <> n12 ИЛИ Предпоследняя <> n11;
    	ИначеЕсли СтрДлина(ИНН) = 10 Тогда
    		Последняя = ((n1*(-1) + n2*5 + n3*7 + n4*9 + n5*4 + n6*6 + n7*10 + n8*5 + n9*7) % 11) % 10;
    		
    		ЕстьОшибкаВКоде = Последняя <> n10;
    	КонецЕсли;
    	
    	Если ЕстьОшибкаВКоде Тогда
    		#Если Клиент Тогда
    			Сообщить("Ошибка в коде ИНН", СтатусСообщения.Важное);
    		#КонецЕсли
    	КонецЕсли;
    	
    	Возврат Не ЕстьОшибкаВКоде;
    КонецФункции
    
    
Для участия в обсуждении Вам необходимо авторизоваться либо   зарегистрироваться