// Функция для склонения одного слова!!!
// z1 - само слово
// z2 - номер падежа
// z3 - пол
// z4 - 0 - как существительное, 1-склонять как фамилию, 2-имя, 3-отчество
//
//
// 1 - именительный
// 2 - родительный
// 3 - дательный
// 4 - винительный
// 5 - творительный
// 6 - предложный
Function ПадежС(z1,Знач z2=2,Знач z3="*",z4=0) Экспорт
z5 = Find(z1,"-");
z6 = ?(z5=0,"","-"+ПадежС(Mid(z1,z5+1,StrLen(z1)-z5+1),z2,z3,z4));
z1 = НРег(?(z5=0,z1,Left(z1,z5-1)));
zc = Max(z2,-z2);
zf = "";// исключения
if zf = "" Then
z7 = Right(z1,3);z8=Right(z7,2);z9=Right(z8,1);
z5 = StrLen(z1);
za = Find("ая ия ел ок яц ий па да ца ша ба та га ка на ма ха",z8);
zb = Find("аеёийоуэюяжнгхкчшщ",Left(z7,1));
zd = ?(za=4,5,Find("айяь",z9));
zd = ?((zc=1)or(z9=".")or((z4=2)и(Find("оиеу"+?(z3="ч","","бвгджзклмнпрстфхцчшщъ"),z9)>0))or((z4=1)и(Find("мия мяэ лия кия жая лея шлы",z7)>0))or((z4=2)и(Find("ьжэ",z7)>0)),9,?((zd=4)и(z3="ч"),2,?(z4=1,?(Find("оеиую",z9)+Find("их ых аа еа ёа иа оа уа ыа эа юа яа",z8)>0,9,?(z3<>"ч",?(za=1,7,?(z9="а",?((za>18)и(z7<>"ина"),1,6),9)),?(((Find("ой ый",z8)>0)и(z5>4)и(Find("опой вбой",Right(z1,4))=0))or((zb>10)и(za=16)),8,zd))),zd)));
ze = Find("лец нёк вей бей дец пец мец нец рец вец аец иец ыец бер",z7);
zf = ?((zd = 8)и(zc<>5),?((zb>15)or(Find("жий ний",z7)>0),"е","о"),?(z1="лев","ьв",?((Find("аеёийоуэюя",Mid(z1,z5-3 ,1))=0)и((zb>11)or(zb=0))и(ze<>49),"",?(za=7,"л",?(za=10,"к",?(za=13,"йц",?(ze=0,"",?(ze<16,"ь"+?(ze=1,"ц",?(ze=5,"к","")),?(ze<41,"ц",?(ze<53,"йц","р"))))))))));
zf = ?((zd = 9)or((z4 = 3)и(Right(z1,1)="ы")),z1,Left(z1,z5-?((zd>6)or(zf<>""),2,?(zd>0,1,0)))+zf+СокрП(Mid("а у а "+?((Find("ич ыш нц эц",z8)>0)и(Найти("кмь",Left(z7,1))=0),"е",?( (Find("ов ин ев", z8)>0)и(z4=1) ,"ы","о"))+"ме "+?(Find("гжкхш",Left(z8,1))>0,"и","ы")+" е у "+?(z8="ца","е","о")+"йе я ю я ем"+?(za=16,"и","е")+" и е ю ейе и и ь ьюи и и ю ейи ойойу ойойойойуюойойгомуго"+?((zf="е")or(za=16)or((zb>12)и(zb<16)),"и","ы")+"мм",10*zd+2*zc-3,2)));
EndIf;
Return ?("" = z1, "", ?(z4 > 0, ВРег(Left(zf, 1))+?((z2 < 0)и(z4 > 1), ".", Mid(zf, 2)), zf) + z6);
EndFunction
// Функция для склонения ФИО!!!
// z1 - фамилия имя отчество например Железняков Юрий Юрьевич
// z2 - Падеж ( по умолчанию = 2 - родительный)
// 2 - родительный ( нет кого? ) Железнякова Юрия Юрьевича
// 3 - дательный ( кому? ) Железнякову Юрию Юрьевичу
// 4 - винительный ( вижу кого? ) Железнякова Юрия Юрьевича
// 5 - творительный ( кем? ) Железняковым Юрием Юрьевичем
// 6 - предложный ( о ком? ) Железнякове Юрии Юрьевиче
// Если задать Z2 меньше 0, то на выходе получим от -1=Железняков Ю. Ю. до -6=Железнякове Ю. Ю.
// z3 - параметр Пол может не указываться, но при наличии фамилий с
// инициалами точное определение пола невозможно, поэтому предлагается задавать пол этим
// параметром 1 - мужской 2 - женский
// ДЛЯ СКЛОНЕНИЯ ПРОФЕССИЙ ИСПОЛЬЗУЙТЕ ФУНКЦИЮ ПАДЕЖП И БУДЕТ ВАМ СЧАСТЬЕ!
// ---------------------------------------------------------------------------------------
// Бибик Галушка Цой Николайчик Наталия Петровна Герценберг Кривошей Капица-Метелица
// Если Падеж(Фио ,1 ,3), то на выходе получим Фамилия Имя Отчество и т.д.
// Если Падеж(Фио ,1 ,3,"1" ), то Фамилия
// Если Падеж(Фио ,1 ,3,"2" ), то Имя
// Если Падеж(Фио ,1 ,3,"3" ), то Отчество
// Если Падеж(Фио, 1 ,3,"12" ), то Фамилия Имя
// Если Падеж(Фио, 1 ,3,"23" ), то Имя Отчество
// Если Падеж(Фио,-1 ,3,"231" ),то И. О. Фамилия
// Если Падеж(Фио,-1 ,3,"23" ), то И. О.
Function Падеж(Знач z1,z2=2,z3=3,Знач z4="123",z5=1) Экспорт
z1=СокрЛП(z1);
Возврат СокрЛП(?(z5<4,Падеж(СокрЛП(СтрЗаменить(Сред(z1,Найти(z1+" "," ")+1),".",". ")),z2,z3,СтрЗаменить(z4,z5,ПадежС(Лев(z1,Найти(z1+" "," ")-1),z2,Сред("ча"+НРег(Прав(z1,1)),z3,1),z5)+" "),z5+1),z4));
EndFunction
// Функция для склонения только первого слова предложения!!!
Function ПадежП(Знач z1,Знач z2,z3=0, ВНижнийРегистр=0) Экспорт
z1=СокрЛП(z1);
z1=СокрЛП(z1);z4=Найти(z1+" "," ")+1;z5=Лев(z1,z4-2);z6=Прав(z5,2);
z7=?((Найти("ая ий ый",z6)>0)и(Найти("ющий нный",Сред(z1,z4-5,4))=0)и(z3=0),"1","*");
Рез=?((z6="ая")или(Прав(z6,1)="а"),ПадежС(z5,z2,z7,1)+" "+ПадежС(Сред(z1,z4),z2),ПадежС(z5,z2,"ч",1)+?((z6="ий")и(Найти(z1," ")=0),""," "+?(z7="1",ПадежП(Сред(z1,z4),z2,Число(z7)),Сред(z1,z4))));
Возврат ?(ВНижнийРегистр=1,НРег(Рез),Рез);
EndFunction
|