ArPlus
09.05.2010, 09:43
Сделано на примере УТ. В модуле формы "ФормаЭлемента" справочника Контрагенты есть функция ПроверитьИНН().
Предлагаю заменить ее на следующую. В данном случае будет проверяться контрольное число.
Если НЕ ЗначениеЗаполнено(ИНН) Тогда
Возврат;
КонецЕсли;
ДлинаИНН = СтрДлина(ИНН);
ТекстСообщения = "";
Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.Физ Лицо Тогда
Если НЕ ДлинаИНН = 12 Тогда
ТекстСообщения = """ИНН"" физического лица 12 символов!";
КонецЕсли;
Иначе
Если НЕ ДлинаИНН = 10 Тогда
ТекстСообщения = """ИНН"" юридического лица 10 символов!";
КонецЕсли;
КонецЕсли;
Множители = Новый Массив(11);
Множители[0] = 3;
Множители[1] = 7;
Множители[2] = 2;
Множители[3] = 4;
Множители[4] = 10;
Множители[5] = 3;
Множители[6] = 5;
Множители[7] = 9;
Множители[8] = 4;
Множители[9] = 6;
Множители[10] = 8;
Результат=Ложь;
Если ДлинаИНН = 10 Тогда
Сум = 0;
Для i=0 По 8 Цикл
Сум = Сум + Сред(ИНН,i+1,1) * Множители[i+2];
КонецЦикла;
Сум = Сум - 11 * Цел(Сум/11);
Сум = Сум - 10 * Цел(Сум/10);
Результат = ?(Число(Сред(ИНН,10,1)) = Сум,Истина,Ложь);
ИначеЕсли ДлинаИНН = 12 Тогда
Сум = 0;
Для i=0 По 9 Цикл
Сум = Сум + Сред(ИНН,i+1,1) * Множители[i+1];
КонецЦикла;
Сум = Сум - 11 * Цел(Сум/11);
Сум = Сум - 10 * Цел(Сум/10);
Сум2 = 0;
Для i=0 По 10 Цикл
Сум2 = Сум2 + Сред(ИНН,i+1,1) * Множители[i];
КонецЦикла;
Сум2 = Сум2 - 11 * Цел(Сум2/11);
Сум2 = Сум2 - 10 * Цел(Сум2/10);
Результат = ?((Число(Сред(ИНН,11,1)) = Сум)И(Число(Сред(ИНН,12,1)) = Сум2),Истина,Ложь);
КонецЕсли;
Если Результат = ложь Тогда
ТекстСообщения = """ИНН"" не совпадают контрольные числа!";
КонецЕсли;
Если ЗначениеЗаполнено(ТекстСо� �бщения) Тогда
ОбщегоНазначения.Сообщить� �бОшибке("Длина ""ИНН"" не соответствует требованиям: " + ТекстСообщения);
КонецЕсли;
Предлагаю заменить ее на следующую. В данном случае будет проверяться контрольное число.
Если НЕ ЗначениеЗаполнено(ИНН) Тогда
Возврат;
КонецЕсли;
ДлинаИНН = СтрДлина(ИНН);
ТекстСообщения = "";
Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.Физ Лицо Тогда
Если НЕ ДлинаИНН = 12 Тогда
ТекстСообщения = """ИНН"" физического лица 12 символов!";
КонецЕсли;
Иначе
Если НЕ ДлинаИНН = 10 Тогда
ТекстСообщения = """ИНН"" юридического лица 10 символов!";
КонецЕсли;
КонецЕсли;
Множители = Новый Массив(11);
Множители[0] = 3;
Множители[1] = 7;
Множители[2] = 2;
Множители[3] = 4;
Множители[4] = 10;
Множители[5] = 3;
Множители[6] = 5;
Множители[7] = 9;
Множители[8] = 4;
Множители[9] = 6;
Множители[10] = 8;
Результат=Ложь;
Если ДлинаИНН = 10 Тогда
Сум = 0;
Для i=0 По 8 Цикл
Сум = Сум + Сред(ИНН,i+1,1) * Множители[i+2];
КонецЦикла;
Сум = Сум - 11 * Цел(Сум/11);
Сум = Сум - 10 * Цел(Сум/10);
Результат = ?(Число(Сред(ИНН,10,1)) = Сум,Истина,Ложь);
ИначеЕсли ДлинаИНН = 12 Тогда
Сум = 0;
Для i=0 По 9 Цикл
Сум = Сум + Сред(ИНН,i+1,1) * Множители[i+1];
КонецЦикла;
Сум = Сум - 11 * Цел(Сум/11);
Сум = Сум - 10 * Цел(Сум/10);
Сум2 = 0;
Для i=0 По 10 Цикл
Сум2 = Сум2 + Сред(ИНН,i+1,1) * Множители[i];
КонецЦикла;
Сум2 = Сум2 - 11 * Цел(Сум2/11);
Сум2 = Сум2 - 10 * Цел(Сум2/10);
Результат = ?((Число(Сред(ИНН,11,1)) = Сум)И(Число(Сред(ИНН,12,1)) = Сум2),Истина,Ложь);
КонецЕсли;
Если Результат = ложь Тогда
ТекстСообщения = """ИНН"" не совпадают контрольные числа!";
КонецЕсли;
Если ЗначениеЗаполнено(ТекстСо� �бщения) Тогда
ОбщегоНазначения.Сообщить� �бОшибке("Длина ""ИНН"" не соответствует требованиям: " + ТекстСообщения);
КонецЕсли;