Last active
December 22, 2015 03:38
-
-
Save pumbaEO/6411240 to your computer and use it in GitHub Desktop.
#1C Проверка кода ЕДРПОУ для Украины.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Функция нфПолучитьКЧ_ЕДРПОУ(Код,ВесКоэф,СмещениеКоэф=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