Skip to content

Instantly share code, notes, and snippets.

@pumbaEO
Last active December 22, 2015 03:38
Show Gist options
  • Save pumbaEO/6411240 to your computer and use it in GitHub Desktop.
Save pumbaEO/6411240 to your computer and use it in GitHub Desktop.
#1C Проверка кода ЕДРПОУ для Украины.
Функция нфПолучитьКЧ_ЕДРПОУ(Код,ВесКоэф,СмещениеКоэф=0)
КонтрольнаяСумма=0;
Для ПерЦ=1 По СтрДлина(ВесКоэф) Цикл
КонтрольнаяСумма=КонтрольнаяСумма+(Число(Сред(Код,ПерЦ,1))*(Число(Сред(ВесКоэф,ПерЦ,1))+СмещениеКоэф));
КонецЦикла;
КонтрЧисло = КонтрольнаяСумма-Цел(КонтрольнаяСумма/11)*11;
Возврат КонтрЧисло;
КонецФункции //ПолучитьКЧ_ЕДРПОУ
// нфОшибкаЕДРПОУ ===============================
// Назначение:
// Проверка кода ЕДРПОУ для Украины
// Аргументы:
// КодДляПроверки - Код ЕДРПОУ
// Возвращает:
// 0 - код правильный
// 1 - код неверно, есть ошибка в коде
Функция нфОшибкаВКоде_ЕДРПОУ_8(ЕДРПОУ)
ЕстьОшибкаВКоде = Ложь;
КодДляПроверки=СОКРЛП(ЕДРПОУ);
// Определяем набор весовых коэффициентов
Если (Число(КодДляПроверки)<30000000) Или (Число(КодДляПроверки)>60000000) Тогда
Коэф="1234567";
Иначе
Коэф="7123456";
КонецЕсли;
// Расчитываем контрольное число как сумму произведений разрядов кода на соответсвующие коэфициенты
КЧ=нфПолучитьКЧ_ЕДРПОУ(КодДляПроверки,Коэф);
Если КЧ=10 Тогда
КЧ = нфПолучитьКЧ_ЕДРПОУ(КодДляПроверки,Коэф,2);
Если КЧ=10 Тогда
КЧ=0;
КонецЕсли;
КонецЕсли;
Если Число(Прав(КодДляПроверки,1))=КЧ Тогда
ЕстьОшибкаВКоде = Ложь;
Иначе
ЕстьОшибкаВКоде = Истина;
КонецЕсли;
Возврат ЕстьОшибкаВКоде;
КонецФункции
// нфОшибкаЕДРПОУ ===============================
// Назначение:
// Проверка кода ЕДРПОУ для Украины
// Аргументы:
// КодДляПроверки - Код ЕДРПОУ
// Возвращает:
// 0 - код правильный
// 1 - код неверно, есть ошибка в коде
Функция нфОшибкаВКоде_ИНН(ИНН) Экспорт
Перем ДлинаКода, ДлинаПроверки;
ЕстьОшибкаВКоде=Ложь;
ИНН = СокрЛП(ИНН);
Если СтрДлина(ИНН)<>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)) * 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))=ДлинаКода Тогда
ЕстьОшибкаВКоде = Ложь;
Иначе
ЕстьОшибкаВКоде = Истина;
КонецЕсли;
Иначе
ЕстьОшибкаВКоде = Истина;
КонецЕсли;
КонецЕсли;
Если ЕстьОшибкаВКоде Тогда
#Если Клиент Тогда
Сообщить("Ошибка в коде ИНН", СтатусСообщения.Важное);
#КонецЕсли
КонецЕсли;
Возврат ЕстьОшибкаВКоде;
КонецФункции
// нфОшибкаЕДРПОУ ===============================
// Назначение:
// Проверка кода ЕДРПОУ для Украины
// Аргументы:
// КодДляПроверки - Код ЕДРПОУ
// Возвращает:
// 0 - код правильный
// 1 - код неверно, есть ошибка в коде
Функция нфОшибкаЕДРПОУ(КодПоЕДРПОУ) Экспорт
ЕстьОшибкаВКоде=Ложь;
Если СтрДлина(СокрЛП(КодПоЕДРПОУ)) = 10 Тогда
//Это код ЧП-ка, проверяем по алгоритму ИНН
ЕстьОшибкаВКоде = нфОшибкаВКоде_ИНН(КодПоЕДРПОУ);
ИначеЕсли СтрДлина(СокрЛП(КодПоЕДРПОУ)) = 8 Тогда
//Это код юр.лица проверяем по алгоритму ЕДРПОУ
ЕстьОшибкаВКоде = нфОшибкаВКоде_ЕДРПОУ_8(КодПоЕДРПОУ);
Иначе
// (СтрДлина(СокрЛП(КодПоЕДРПОУ)) > 10) или (СтрДлина(СокрЛП(КодПоЕДРПОУ)) < 8) Тогда
#Если Клиент Тогда
Сообщить("Код ЕДРПОУ должен содержать 8 или 10 символов - " + КодПоЕДРПОУ+"!",СтатусСообщения.Важное);
#КонецЕсли
ЕстьОшибкаВКоде = Истина;
КонецЕсли;
Если ЕстьОшибкаВКоде Тогда
#Если Клиент Тогда
Сообщить("Ошибка в коде ЕДРПОУ", СтатусСообщения.Важное);
#КонецЕсли
КонецЕсли;
Возврат ЕстьОшибкаВКоде;
КонецФункции //
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment