Склонение ФИО (1C)

Материал из КинтВики
Перейти к: навигация, поиск

"Падеж"

Источник: http://www.forum.mista.ru/topic.php?id=485671

// (c) Jurer Production Begin ( Start ) 
// В случае, если программа окажется для Вас полезной, и Вы представляете только свои интересы, а не интересы фирмы, 
// автор будет весьма признателен, если Вы перечислите ему некую сумму на Ваше усмотрение (автор будет благодарен любым инициативам).  
// Для этого через сбербанк перечислите N-ую сумму на следующий счет: 
// филиал 8606/018 Рязанское ОСБ № 8606 СБ РФ г.Рязань РЕКВИЗИТЫ: ИНН 7707083893КОР.СЧЕТ 30101810500000000614 БИК 046126614 
// ДЛЯ ПЕРЕЧИСЛЕНИЙ ВО ВКЛАД ФИЗИЧ.ЛИЦ – 47422810453009902100 НОМЕР СБЕРКНИЖКИ:  42301810953002115714/01  Железняков Юрий Юрьевич 
// __________________________________________________________________ 
//  
//                           SuperJur.Narod.Ru 
// 
// __________________________________________________________________  
// Удаление этих строк незнаконно! 
// Гарантия 91 года и 1 месяц!!! 
// Послегарантийное обслуживание - бесплатно!!! 
// Круглосуточная поддержка - все 48 часов в бою! 
// Ссылка на источник обязательна! 
// Эти программы защищены законом об авторских правах. Запрещается перепродажа данной программы. 
// ПРОВЕРЕНО! ВИРУСОВ НЕТ!!! АНТИВИРУСОВ ТОЖЕ!!! 
// Смотри Милячуша в творительном !! 
// скупой слепой тупой - пропой!! 
// !№№! 
// !54! Очередное сокращение кода 
// !53! Очередное сокращение кода 
// !51! Прегромадное спасибо Олегу Дубровскому за оказанную моральную, информационную и материальную поддержку сего проекта. 
//      Сергею Толкачёву за напоминание о том, что в русском языке всегда есть место исключениям! 
// !50! П:Ответственный за электрохозяйство  Ф:Ацута Груша   
// !48! исправлена ошибка при склонении фамилий (спасибо, Mario). 
// !47! исправлена ошибка при склонении профессий ( спасибо, Павел Ковалев). 
// !46! оптимизация + четвертый параметр задает, что вернуть - фамилия, имя или отчество или всё сразу в нужном падеже 
// !42! Осел + Соловей + Воробей + Немец + Кормилец + Силиец 
// !41! отчества оканчивающиеся на "ы" считаются женскими ? 
// Функция для склонения одного слова!!! 
// z1 - само слово 
// z2 - номер падежа 
// z3 - пол 
// z4 - 1-склонять как фамилию, 2-имя, 3-отчество 
Функция ПадежС(z1,Знач z2=2,Знач z3="*",z4=0) Экспорт
  z5=Найти(z1,"-");
  z6=?(z5=0,"","-"+ПадежС(Сред(z1,z5+1,СтрДлина(z1)-z5+1),z2,z3,z4));
  z1=НРег(?(z5=0,z1,Лев(z1,z5-1)));
  z7=Прав(z1,3);z8=Прав(z7,2);z9=Прав(z8,1);
  z5=СтрДлина(z1);
  za=Найти("ая ия ел ок яц ий па да ца ша ба та га ка",z8);
  zb=Найти("аеёийоуэюяжнгхкчшщ",Лев(z7,1));
  zc=Макс(z2,-z2);
  zd=?(za=4,5,Найти("айяь",z9));
  zd=?((zc=1)или(z9=".")или((z4=2)и(Найти("оиеу"+?(z3="ч","","бвгджзклмнпрстфхцчшщъ"),z9)>0))или((z4=1)и(Найти("мия мяэ лия кия жая лея",z7)>0)),9,?((zd=4)и(z3="ч"),2,?(z4=1,?(Найти("оеиую",z9)+Найти("их ых аа еа ёа иа оа уа ыа эа юа яа",z8)>0,9,?(z3<>"ч",?(za=1,7,?(z9="а",?(za>18,1,6),9)),?(((Найти("ой ый",z8)>0)и(z5>4)и(Прав(z1,4)<>"опой"))или((zb>10)и(za=16)),8,zd))),zd)));
  ze=Найти("лец вей бей дец пец мец нец рец вец аец иец ыец бер",z7);
  zf=?((zd=8)и(zc<>5),?((zb>15)или(Найти("жий ний",z7)>0),"е","о"),?(z1="лев","ьв",?((Найти("аеёийоуэюя",Сред(z1,z5-3 ,1))=0)и((zb>11)или(zb=0))и(ze<>45),"",?(za=7,"л",?(za=10,"к",?(za=13,"йц",?(ze=0,"",?(ze<12,"ь"+?(ze=1,"ц",""),?(ze<37,"ц",?(ze<49,"йц","р"))))))))));
  zf=?((zd=9)или((z4=3)и(z3="ы")),z1,Лев(z1,z5-?((zd>6)или(zf<>""),2,?(zd>0,1,0)))+zf+СокрП(Сред("а у а "+Сред("оыые",Найти("внч",z9)+1,1)+"ме "+?(Найти("гжкхш",Лев(z8,1))>0,"и","ы")+" е у ойе я ю я ем"+?(za=16,"и","е")+" и е ю ейе и и ь ьюи и и ю ейи ойойу ойойойойуюойойгомуго"+?((zf="е")или(za=16)или((zb>12)и(zb<16)),"и","ы")+"мм",10*zd+2*zc-3,2)));
Возврат ?(""=z1,"",?(z4>0,ВРег(Лев(zf,1))+?((z2<0)и(z4>1),".",Сред(zf,2)),zf)+z6);
КонецФункции

//_____________________________________________________________________________ 
// 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" ), то                   И. О.   
// 10-11-2003 3-20 
Функция Падеж(Знач z1,z2=2,z3=3,Знач z4="123",z5=1) Экспорт

    Если ТипЗначенияСтр(z1)="Справочник" Тогда
        Если Метаданные.Справочник(z1.Вид()).Реквизит("ВРодительномПадеже").Выбран()=1 Тогда
            Если ПустаяСтрока(z1.ВРодительномПадеже)=0 Тогда
                Возврат(СокрЛП(z1.ВРодительномПадеже));
            Иначе
                z1=СокрЛП(глНаименование(z1));
            КонецЕсли;
        Иначе
            z1=СокрЛП(глНаименование(z1));
        КонецЕсли;
    Иначе
        z1=СокрЛП(z1);
    КонецЕсли;

Возврат СокрЛП(?(z5<4,Падеж(СокрЛП(СтрЗаменить(Сред(z1,Найти(z1+" "," ")+1),".",". ")),z2,z3,СтрЗаменить(z4,z5,ПадежС(Лев(z1,Найти(z1+" "," ")-1),z2,Сред("ча"+НРег(Прав(z1,1)),z3,1),z5)+" "),z5+1),z4));
КонецФункции//Падеж 

Функция ПадежП(Знач z1,Знач z2,z3=0, ВНижнийРегистр=0) Экспорт
    
    Если ТипЗначенияСтр(z1)="Справочник" Тогда
        Если Метаданные.Справочник(z1.Вид()).Реквизит("ВРодительномПадеже").Выбран()=1 Тогда
            Если ПустаяСтрока(z1.ВРодительномПадеже)=0 Тогда
                Возврат(СокрЛП(z1.ВРодительномПадеже));
            Иначе
                z1=СокрЛП(глНаименование(z1));
            КонецЕсли;
        Иначе
            z1=СокрЛП(глНаименование(z1));
        КонецЕсли;
    Иначе
        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,НРег(Рез),Рез);
КонецФункции//ПадежП 
// (c) Jurer Production End ( Finish )

Еще версия Падеж

Var z0;

Function ПадежС(z1,Знач z2=2,Знач z3="*",z4=0)
  z5=Найти(z1,"-");
  z6=?(z5=0,"","-"+ПадежС(Mid(z1,z5+1,StrLen(z1)-z5+1),z2,z3,z4));
  z1=НРег(?(z5=0,z1,Left(z1,z5-1)));
// исключения
  zf="";
  zc=Max(z2,-z2);
	If zi=1 then
		z0.ИсходнаяТаблица(z4);
		zg = z0.ПолучитьСекцию("1");
		For zh=1 To z0.ВысотаСекции("1") Do
			If zg.Область(zh, 8).Текст = z1 Then
				zf=zg.Область(zh, 1).Текст+zg.Область(zh,zc).Текст;
				Прервать;
			EndIf;
		EndDo;
	EndIf;	
// исключения
  if zf="" then
  	z7=Прав(z1,3);z8=Прав(z7,2);z9=Прав(z8,1);
  	z5=StrLen(z1);                                           
// ая , ия, ел = орел, ок = брелок на = весна, ма = зима		
  	za=Найти("ая ия ел ок яц ий па да ца ша ба та га ка на ма",z8);
  	zb=Найти("аеёийоуэюяжнгхкчшщ",Лев(z7,1));
  	zd=?(za=4,5,Найти("айяь",z9));
  	zd=?((zc=1)или(z9=".")или((z4=2)и(Найти("оиеу"+?(z3="ч","","бвгджзклмнпрстфхцчшщъ"),z9)>0))или((z4=1)и(Найти("мия мяэ лия кия жая лея",z7)>0)),9,?((zd=4)и(z3="ч"),2,?(z4=1,?(Найти("оеиую",z9)+Найти("их ых аа еа ёа иа оа уа ыа эа юа яа",z8)>0,9,?(z3<>"ч",?(za=1,7,?(z9="а",?(za>18,1,6),9)),?(((Найти("ой ый",z8)>0)и(z5>4)и(Найти("опой вбой",Прав(z1,4))=0))или((zb>10)и(za=16)),8,zd))),zd)));
  	ze=Найти("лец нёк вей бей дец пец мец нец рец вец аец иец ыец бер",z7);
  	zf=?((zd=8)и(zc<>5),?((zb>15)или(Найти("жий ний",z7)>0),"е","о"),?(z1="лев","ьв",?((Найти("аеёийоуэюя",Mid(z1,z5-3 ,1))=0)и((zb>11)или(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)или((z4=3)и(Прав(z1,1)="ы")),z1,Лев(z1,z5-?((zd>6)или(zf<>""),2,?(zd>0,1,0)))+zf+СокрП(Mid("а у а "+?((z8="ич")или(z8="ыш"),"е",?((z8="ов")or(z8="ин"),"ы","о"))+"ме "+?(Найти("гжкхш",Лев(z8,1))>0,"и","ы")+" е у "+?(z8="ца","е","о")+"йе я ю я ем"+?(za=16,"и","е")+" и е ю ейе и и ь ьюи и и ю ейи ойойу ойойойойуюойойгомуго"+?((zf="е")или(za=16)или((zb>12)и(zb<16)),"и","ы")+"мм",10*zd+2*zc-3,2)));
	EndIf;
Return ?(""=z1,"",?(z4>0,ВРег(Лев(zf,1))+?((z2<0)и(z4>1),".",Mid(zf,2)),zf)+z6);
EndFunction

Function Padeg(z1,z2=2,z3=3,z4="123",z5=1)
	z6=Нрег(Прав(СокрП(z1),4));
	z7=Прав(z6,1);
  Возврат?(z5<4,Padeg(СокрЛП(СтрЗаменить(Mid(z1,Найти(z1+" "," ")+1),".",". ")),z2,z3,СтрЗаменить(z4,z5,ПадежС(?((z5=3)и(z7="ы"),z1,Лев(z1,Найти(z1+" "," ")-1)),z2,Mid("ча"+z7,?(z3=3,?(z6="оглы",1,?(z6="кызы",1,3)),z3),1),z5)+" "),z5+1),z4);
КонецФункции

Function ПадежП(Знач z1,Знач z2,z3=0)
  z1=СокрЛП(z1);
	z4=Найти(z1+" "," ")+1;
	z5=Лев(z1,z4-2);
	z6=Прав(z5,2);
  z7=?((Найти("ая ий ый",z6)>0)и(Найти("ющий нный",Mid(z1,z4-5,4))=0)и(z3=0),"1","*");
Return НРег(?((z6="ая")или(Прав(z6,1)="а"),ПадежС(z5,z2,z7,1)+" "+ПадежС(Mid(z1,z4),z2),ПадежС(z5,z2,"ч",1)+?((z6="ий")и(Найти(z1," ")=0),""," "+?(z7="1",ПадежП(Mid(z1,z4),z2,Число(z7)),Mid(z1,z4)))));
КонецФункции

Procedure Сформировать(z2,z4)
  z0.ИсходнаяТаблица("Тест");
  zg = z0.ПолучитьСекцию("1");
	For zh=3 To z0.ВысотаСекции("1") Do
		For zj=2 To 6 Do
	  	zg.Область(zh, zj).Текст= Padeg(zg.Область(zh,1).Текст,z2*zj,,z4);
		EndDo;
	EndDo;
	z0.ВывестиСекцию(zg);
	z0.Показать();
EndProcedure

Procedure ПриОткрытии()
	z0 = СоздатьОбъект("Таблица");
	zi=ВосстановитьЗначение("ziForSj");
	zi=?(ПустоеЗначение(zi)=1,1,zi-1);
	Если ПустоеЗначение( Форма.Параметр ) = 0 Тогда
		z2=0;
		z1=Форма.Параметр.ПолучитьЗначение(1,z2);
		z3=0;
	  СтатусВозврата(0);
		z1= ?(z2="4",ПадежП(z1,z2),Padeg(z1,Число(z2),Форма.Параметр.ПолучитьЗначение(2,z3),Число(z3)));
		Форма.Параметр.УстановитьЗначение(1,z1);
	КонецЕсли;
	Сообщить( Padeg("Зима Наталья Андреевна",3) );
EndProcedure

Procedure ПриЗакрытии()
  СохранитьЗначение("ziForSj", zi+1);
EndProcedure

Еще одна склонялка

Источник: http://www.forum.mista.ru/topic.php?id=339908

//Еще будет функция по автоматическому определению пола.
 

Функция обСлужПроверитьДляСклонения(П, Строка)
    Перем ТекСтрока;
    ТекСтрока="";
    Поз=1;
    Всего=СтрДлина(Строка);
    Пока Поз<=Всего Цикл
        ТекСимвол=Сред(Строка,Поз, 1);
        Если ТекСимвол<>" " Тогда
            ТекСтрока=ТекСтрока+ТекСимвол;
        КонецЕсли;
        Если ТекСимвол=" " ИЛИ Поз=Всего Тогда
            Если СтрДлина(ТекСтрока)=1 Тогда
                Если П.ПравыеБуквы1=ТекСтрока Тогда
                    Возврат истина;
                КонецЕсли;
            ИначеЕсли СтрДлина(ТекСтрока)=2 Тогда
                Если П.ПравыеБуквы2=ТекСтрока Тогда
                    Возврат истина;
                КонецЕсли;
            ИначеЕсли СтрДлина(ТекСтрока)=3 Тогда
                Если П.ПравыеБуквы3=ТекСтрока Тогда
                    Возврат истина;
                КонецЕсли;
            КонецЕсли;        
            ТекСтрока="";
        КонецЕсли;
        Поз=Поз+1;
    КонецЦикла;
    Возврат ложь;
КонецФункции


//Строка - склоняемая строка
 
//Вид - Фамилия, Имя, Отчество, Должность
 
//Пол - М или Ж
 
//Падеж: 
 
//    И - именительный (кто, что)
 
//    Р - родительный (кого, чего)
 
//    Д - дательный  (кому, чему)
 
//    В - винительный (кого, что)
 
//    Т - творительный (кем, чем)
 
//    П - предложный (о ком, о чем)
 
Функция обСклонениеСтроки(Строка, Падеж, Вид, Пол)
    //Благодарю за код krysa, SQL.ru
 
    
    П=Новый Структура();
    
    П.Вставить("ПравыеБуквы1", ВРЕГ(Прав(СокрЛП(Строка),1)));
    П.Вставить("ПравыеБуквы2", ВРЕГ(Прав(СокрЛП(Строка), 2)));
    П.Вставить("ПравыеБуквы3", ВРЕГ(Прав(СокрЛП(Строка), 3)));
    П.Вставить("ЗаканчиваетсяНаСогласную", Найти("БВГДЖЗКЛМПРСТФХЦЧШЩ", П.ПравыеБуквы1)<>0);
    П.Вставить("ЗаканчиваетсяНаГласную", НЕ П.ЗаканчиваетсяНаСогласную);
    
    НовыеПравые1 = Неопределено;
    НовыеПравые2 = Неопределено;
    НовыеПравые3 = Неопределено;
    НовыеПравыеДобавить = Неопределено;
    
    //CКЛОНЕНИЕ ФАМИЛИИ
 
    Если Вид = "Фамилия" Тогда 
        Если Падеж = "П" Тогда
            //Предложный (о ком о чем)
 
            Если обСлужПроверитьДляСклонения(П, "ИН ЫН ЯК ЕВ ОВ") Тогда
                НовыеПравыеДобавить = "Е";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "ИНА ЫНА ЕВА ОВА")  Тогда
                НовыеПравые1 = "ой";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "АЯ")  Тогда
                НовыеПравые2 = "ой";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "ИЙ")  Тогда 
                НовыеПравые2 = "ой";
            КонецЕсли;
            
        ИначеЕсли Падеж = "В" Тогда
            //Винительный (кого, что)
 
            Если обСлужПроверитьДляСклонения(П, "ИНА ЫНА ЕВА ОВА")  Тогда
                НовыеПравые1 = "у";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "ИН ЫН ЯК ЕВ ОВ")  Тогда
                НовыеПравыеДобавить = "а";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "ИЙ")  Тогда
                НовыеПравые2 = "ого";
            ИначеЕсли обСлужПроверитьДляСклонения(П,  "АЯ")  Тогда
                НовыеПравые2 = "ую";
            КонецЕсли;
            
        ИначеЕсли Падеж = "Т" Тогда
            //Творительный (Кем, Чем)
 
            Если обСлужПроверитьДляСклонения(П,  "ИН ЫН ЕВ ОВ")  Тогда
                НовыеПравыеДобавить = "ым";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "ЯК")  Тогда
                НовыеПравыеДобавить = "ом";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "ИЙ")  Тогда
                НовыеПравые1 = "м";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "ИНА ЫНА ЕВА ОВА")  Тогда
                НовыеПравые1 = "ой";
            ИначеЕсли обСлужПроверитьДляСклонения(П, "АЯ")  Тогда
                НовыеПравые2 = "ой";
            КонецЕсли;
            
        ИначеЕсли Падеж = "Р" Тогда
            //Родительный (Кого, Чего)
 
            Если обСлужПроверитьДляСклонения(П,  "ИН ЫН ЯК ЕВ ОВ")  Тогда
                НовыеПравые1 = "а";
            ИначеЕсли обСлужПроверитьДляСклонения(П,  "ИЙ")  Тогда
                НовыеПравые2 = "ого";
            ИначеЕсли обСлужПроверитьДляСклонения(П,  "ИНА ЫНА ЕВА ОВА")  Тогда
                НовыеПравые1 = "ой";
            ИначеЕсли обСлужПроверитьДляСклонения(П,  "АЯ")  Тогда
                НовыеПравые2 = "ой";
            КонецЕсли;
            
        ИначеЕсли Падеж = "Д" Тогда
            //Дательный (Кому, Чему)
 
            Если обСлужПроверитьДляСклонения(П,  "ИН ЫН ЯК ЕВ ОВ УК")  Тогда
                НовыеПравые1 = "у";
            ИначеЕсли обСлужПроверитьДляСклонения(П,  "ИЙ")  Тогда
                НовыеПравые2 = "ому";
            ИначеЕсли обСлужПроверитьДляСклонения(П,  "ИНА ЫНА ЕВА ОВА")  Тогда
                НовыеПравые1 = "ой";
            ИначеЕсли обСлужПроверитьДляСклонения(П,  "АЯ")  Тогда
                НовыеПравые2 = "ой";
            КонецЕсли;
        КонецЕсли;
    ИначеЕсли Вид="Имя" Тогда
        
        //СКЛОНЕНИЕ ИМЕНИ 
 
        
        Если Падеж = "Т" Тогда
            
            //Творительный (Кем, Чем)
 
            Если Пол="М" Тогда
                Если обСлужПроверитьДляСклонения(П, "ЕЛ")  Тогда
                    НовыеПравые3 = "лом";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Й")  Тогда
                    НовыеПравые1 = "ем";
                ИначеЕсли П.ЗаканчиваетсяНаСогласную Тогда
                    НовыеПравыеДобавить = "ом";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Я")  Тогда
                    НовыеПравые2 = "ей";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Ь")  Тогда
                    НовыеПравые2 = "ем";
                КонецЕсли;
            Иначе
                Если обСлужПроверитьДляСклонения(П, "Ь")  Тогда
                    НовыеПравые2 = "ю";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "А")  Тогда
                    НовыеПравые1 = "ой";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Я")  Тогда
                    НовыеПравые1 = "ей";
                КонецЕсли;
            КонецЕсли;
            
        ИначеЕсли Падеж = "П" Тогда
            
            //Предложный (О ком о чем)
 
            Если Пол="М" Тогда
                Если обСлужПроверитьДляСклонения(П, "ЕЛ")  Тогда
                    НовыеПравые3 = "ле";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "ИЙ")  Тогда
                    НовыеПравые1 = "и";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Й")  Тогда
                    НовыеПравые1 = "е";
                ИначеЕсли П.ЗаканчиваетсяНаСогласную Тогда
                    НовыеПравыеДобавить = "е";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Я")  Тогда
                    НовыеПравые1 = "е";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Ь")  Тогда
                    НовыеПравые2 = "е";
                КонецЕсли;
            Иначе
                Если обСлужПроверитьДляСклонения(П, "А")  Тогда
                    НовыеПравые1 = "е";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "ИЯ")  Тогда
                    НовыеПравые1 = "и";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Я")  Тогда
                    НовыеПравые1 = "е";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Ь")  Тогда
                    НовыеПравые1 = "и";
                КонецЕсли;
            КонецЕсли;
            
        ИначеЕсли Падеж = "В" Тогда
            
            //Винительный (кого, что)
 
            Если Пол="М" Тогда
                Если обСлужПроверитьДляСклонения(П, "ЕЛ")  Тогда
                    НовыеПравые3 = "ла";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Й")  Тогда
                    НовыеПравые1 = "я";
                ИначеЕсли П.ЗаканчиваетсяНаСогласную Тогда
                    НовыеПравыеДобавить = "а";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Я")  Тогда
                    НовыеПравые1 = "ю";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Ь")  Тогда
                    НовыеПравые1 = "я";
                КонецЕсли;
            Иначе
                Если обСлужПроверитьДляСклонения(П, "А")  Тогда
                    НовыеПравые1 = "у";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Я")  Тогда
                    НовыеПравые1 = "ю";
                КонецЕсли;
            КонецЕсли;
            
        ИначеЕсли Падеж = "Р" Тогда
            
            //Родительный (Кого, Чего)
 
            Если Пол="М" Тогда
                Если обСлужПроверитьДляСклонения(П, "Й")  Тогда
                    НовыеПравые3 = "ла";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Й")  Тогда
                    НовыеПравые1 = "я";
                ИначеЕсли П.ЗаканчиваетсяНаСогласную Тогда
                    НовыеПравыеДобавить = "а";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Я")  Тогда
                    НовыеПравые1 = "ю";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Ь")  Тогда
                    НовыеПравые1 = "я";
                КонецЕсли;
            Иначе
                Если обСлужПроверитьДляСклонения(П, "А")  Тогда
                    НовыеПравые1 = "у";
                ИначеЕсли обСлужПроверитьДляСклонения(П, "Я")  Тогда
                    НовыеПравые1 = "ю";
                КонецЕсли;
            КонецЕсли;
            
            
        КонецЕсли;
    КонецЕсли;
    
    //Проверяем
 
    Если НовыеПравые1 <> Неопределено Тогда
        Р = Сред(Строка, 1, СтрДлина(Строка)-1) + НовыеПравые1;
    ИначеЕсли НовыеПравые2 <> Неопределено Тогда
        Р = Сред(Строка, 1, СтрДлина(Строка)-2) + НовыеПравые2;
    ИначеЕсли НовыеПравые3 <> Неопределено Тогда
        Р = Сред(Строка, 1, СтрДлина(Строка)-3) + НовыеПравые3;
    ИначеЕсли НовыеПравыеДобавить <> Неопределено Тогда
        Р = Строка + НовыеПравыеДобавить;
        НовыеПравыеДобавить = Неопределено;
    Иначе
        Р=Строка;
    КонецЕсли;
    
    Возврат Р;
КонецФункции 

Сообщить(обСклонениеСтроки("Иванова", "В", "Фамилия", "Ж"));
Сообщить(обСклонениеСтроки("Анна", "В", "Имя", "Ж"));
Сообщить(обСклонениеСтроки("Семеновна", "В", "Отчество", "Ж"));