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

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


"Падеж"

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

<source lang=1c> // (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 ) </source>

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

<source lang=1c> 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 </source>

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

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

<source lang=1c> //Еще будет функция по автоматическому определению пола.


Функция обСлужПроверитьДляСклонения(П, Строка)

   Перем ТекСтрока;
   ТекСтрока="";
   Поз=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;
   ИначеЕсли НовыеПравыеДобавить <> Неопределено Тогда
       Р = Строка + НовыеПравыеДобавить;
       НовыеПравыеДобавить = Неопределено;
   Иначе
       Р=Строка;
   КонецЕсли;
   
   Возврат Р;

КонецФункции

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