Склонение ФИО (1C) — различия между версиями
(Новая страница: «Категория:Примеры кода 1С __TOC__ =="Падеж"== Источник: http://www.forum.mista.ru/topic.php?id=485671 <source lang=1c> // (c)...») |
|||
Строка 1: | Строка 1: | ||
[[Категория:Примеры кода 1С]] | [[Категория:Примеры кода 1С]] | ||
− | + | {| align="right" | |
− | __TOC__ | + | | __TOC__ |
+ | |} | ||
=="Падеж"== | =="Падеж"== | ||
Источник: http://www.forum.mista.ru/topic.php?id=485671 | Источник: http://www.forum.mista.ru/topic.php?id=485671 |
Текущая версия на 12:20, 15 декабря 2020
Содержание |
"Падеж"
Источник: 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;
ИначеЕсли НовыеПравыеДобавить <> Неопределено Тогда
Р = Строка + НовыеПравыеДобавить;
НовыеПравыеДобавить = Неопределено;
Иначе
Р=Строка;
КонецЕсли;
Возврат Р;
КонецФункции
Сообщить(обСклонениеСтроки("Иванова", "В", "Фамилия", "Ж"));
Сообщить(обСклонениеСтроки("Анна", "В", "Имя", "Ж"));
Сообщить(обСклонениеСтроки("Семеновна", "В", "Отчество", "Ж"));