Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Ищу сорцы. Класс проверок ИНН, КПП. (число прочтений - 2559 )
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Ищу сорцы. Класс проверок ИНН, КПП.
14. Мая 2008 :: 08:52
Печать  
Поделитесь, плз, если не жалко Улыбка
  
Наверх
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ищу сорцы. Класс проверок ИНН, КПП.
Ответ #1 - 14. Мая 2008 :: 09:13
Печать  
Блин, неужели никто не озадачивался?
  
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ищу сорцы. Класс проверок ИНН, КПП.
Ответ #2 - 14. Мая 2008 :: 09:29
Печать  
Код
Выбрать все
Функция КонтрольнаяСуммаИНН(n,inn)
	s=0;
	Для i=1 По n-1 Цикл
		s=s+Число(Сред(inn,i,1))*checksum[12-n+i];
	КонецЦикла;
	Возврат s%11%10;
КонецФункции

Функция ПроверитьИНН()
	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;
	inn = СокрЛП(ИНН);
	len = СтрДлина(inn);
	Если len = 0 Тогда Возврат 0 КонецЕсли;
	Если len = 10 Тогда
		Если Число(Сред(inn, 10, 1)) <> КонтрольнаяСуммаИНН(10, inn) Тогда Возврат 1 КонецЕсли;
	ИначеЕсли len = 12 Тогда
		Если Число(Сред(inn, 11, 1)) <> КонтрольнаяСуммаИНН(11, inn) Тогда Возврат 1 КонецЕсли;
		Если Число(Сред(inn, 12, 1)) <> КонтрольнаяСуммаИНН(12, inn) Тогда Возврат 1 КонецЕсли;
	Иначе
		Возврат 1;
	КонецЕсли;
	Возврат 0;
КонецФункции
 



не помню откуда взял. давно уже в конфе.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ищу сорцы. Класс проверок ИНН, КПП.
Ответ #3 - 14. Мая 2008 :: 09:43
Печать  
Arta писал(а) 14. Мая 2008 :: 09:29:
Код
Выбрать все
Функция КонтрольнаяСуммаИНН(n,inn)
,,,,,
КонецФункции
 



не помню откуда взял. давно уже в конфе.

Тут присоветовали: http://www.polytech.ural.ru/checkvalues.htm
не, не проходит проверки...
  
Наверх
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ищу сорцы. Класс проверок ИНН, КПП.
Ответ #4 - 15. Мая 2008 :: 10:09
Печать  
Смейкал маленький класс на эту тему:
Код
Выбрать все
Перем гИНН10_маска[10];
Перем гИНН12_маска[12];


Функция Сам(Конт) Возврат Конт; КонецФункции

Процедура Конструктор()
	гИНН10_маска[1] = 2;
	гИНН10_маска[2] = 4;
	гИНН10_маска[3] = 10;
	гИНН10_маска[4] = 3;
	гИНН10_маска[5] = 5;
	гИНН10_маска[6] = 9;
	гИНН10_маска[7] = 4;
	гИНН10_маска[8] = 6;
	гИНН10_маска[9] = 8;
	гИНН10_маска[10] = 0;

	гИНН12_маска[1] = 3;
	гИНН12_маска[2] = 7;
	гИНН12_маска[3] = 2;
	гИНН12_маска[4] = 4;
	гИНН12_маска[5] = 10;
	гИНН12_маска[6] = 3;
	гИНН12_маска[7] = 5;
	гИНН12_маска[8] = 9;
	гИНН12_маска[9] = 4;
	гИНН12_маска[10] = 6;
	гИНН12_маска[11] = 8;
	гИНН12_маска[12] = 0;

КонецПроцедуры // Конструктор()

Процедура Деструктор()
КонецПроцедуры


Функция выделитьИННиКПП(Знач псИНН_КПП, псИНН, псКПП = "")
	ЗначВозврата = 1;
	псИНН = "";
	псКПП = "";

	вИНН_КПП = СокрЛП(псИНН_КПП);
	Если СтрДлина(вИНН_КПП) = 0 Тогда
		Возврат 0;
	КонецЕсли;

	вСлеш = "/";
	вПозСлеша = Найти(псИНН_КПП,вСлеш);
	Если вПозСлеша = 0 Тогда
	    вСлеш = "\";
		вПозСлеша = Найти(псИНН_КПП,вСлеш);
		Если вПозСлеша = 0 Тогда
			псИНН = вИНН_КПП;
			Возврат 1;
		КонецЕсли;
	КонецЕсли;
	псИНН = Лев(вИНН_КПП, вПозСлеша-1);
	Если вПозСлеша<СтрДлина(вИНН_КПП) Тогда
		псКПП = Сред(вИНН_КПП, вПозСлеша+1);
	КонецЕсли;
	Возврат 1;
КонецФункции // выделитьИННиКПП()


Функция символЭтоЧисло( псСимвол )
	Если (псСимвол = "0") ИЛИ (Число(псСимвол)>0)  Тогда
		Возврат 1;
	Иначе
		Возврат 0;
	КонецЕсли;
КонецФункции // символЭтоЧисло()


Функция ИНН10_Валиден( псИНН )
	ЗначВозврата = 0;
	Если СтрДлина(псИНН)<>10 Тогда
		Возврат ЗначВозврата;
	КонецЕсли;
	вСумма = 0;
	СЦ = 0;
	вПослСимв = 0;
	Для СЦ = 1 По 10 Цикл
		вСимв = Сред(псИНН,СЦ,1);
		Если символЭтоЧисло(вСимв) = 0 Тогда
			Возврат 0;
		КонецЕсли;
		вПослСимв = Число(вСимв);
		вСумма = вСумма + вПослСимв*гИНН10_маска[СЦ];
	КонецЦикла;
	вСумма2 = вСумма % 11;
	Если вСумма2>9 Тогда
	    вСумма2 = вСумма2 % 10;
	КонецЕсли;
	ЗначВозврата = ?(вСумма2 = вПослСимв,1,0);
	Возврат ЗначВозврата;

КонецФункции // ИНН10_Валиден()

Функция ИНН12_Валиден( псИНН )
	ЗначВозврата = 0;
	Если СтрДлина(псИНН)<>12 Тогда
		Возврат ЗначВозврата;
	КонецЕсли;
	вСумма11 = 0;
	вСумма12 = 0;
	СЦ = 0;
	вПослСимв = 0;
	Для СЦ = 1 По 12 Цикл
		вСимв = Сред(псИНН,СЦ,1);
		Если символЭтоЧисло(вСимв) = 0 Тогда
			Возврат 0;
		КонецЕсли;

		вПослСимв = Число(вСимв);
		Если СЦ<12 Тогда
			вСумма11 = вСумма11 + вПослСимв*гИНН12_маска[СЦ+1];
		КонецЕсли;
		вСумма12 = вСумма12 + вПослСимв*гИНН12_маска[СЦ];
	КонецЦикла;

	вСумма11 = вСумма11 % 11;
	вСумма12 = вСумма12 % 11;
	Если вСумма11>9 Тогда	    вСумма11 = вСумма11 % 10;	КонецЕсли;
	Если вСумма12>9 Тогда	    вСумма12 = вСумма12 % 10;	КонецЕсли;
	Если вСумма11 <> Число(Сред(псИНН,11,1)) Тогда
		Возврат 0;
	КонецЕсли;
	Если вСумма12 <> Число(Сред(псИНН,12,1)) Тогда
		Возврат 0;
	КонецЕсли;
	Возврат 1;
КонецФункции // ИНН10_Валиден()


Функция ИНН_Валиден( псИНН ) Экспорт
	ЗначВозврата = 0; /// 0- проверка не пройдена, 1-проверка пройдена.

	вИНН = "";
	вКПП = "";
	Если выделитьИННиКПП(псИНН, вИНН, вКПП) = 0 Тогда
		Возврат ЗначВозврата;
	КонецЕсли;

	Если СтрДлина(вИНН) = 10 Тогда			Возврат ИНН10_Валиден(вИНН);
	ИначеЕсли СтрДлина(вИНН) = 12 Тогда		Возврат ИНН12_Валиден(вИНН);
	Иначе
		Возврат 0;
	КонецЕсли;
	Возврат 0;
КонецФункции // проверитьИНН()
////ОТладка!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//#if DEBUG
Процедура ПриОткрытии()
	Форма.Параметр._ПриОткрытии();
	Форма.Закрыть();
КонецПроцедуры
//#endif
 

  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ищу сорцы. Класс проверок ИНН, КПП.
Ответ #5 - 15. Мая 2008 :: 10:26
Печать  
trdm писал(а) 15. Мая 2008 :: 10:09:
Смейкал маленький класс на эту тему:

Всё, подсел на классы?  Смех
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ищу сорцы. Класс проверок ИНН, КПП.
Ответ #6 - 15. Мая 2008 :: 11:07
Печать  
А смысл держать десяток вспомогательных процедур в ГМ к одной используемой?
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать