Наконец-то нашел.
Функция для склонения фамилии, имени, отчества
В документах предприятия часто употребляются фамилия, имя, отчество в родительном и дательном падежах. Например: выдать (кому?), назначить (кого?) и т.д. В типовой конфигурации не предусмотрена функция склонения ФИО.
Предлагаемая функция позволяет выполнить склонение фамилий имен и отчеств в соответствии с правилами русского языка. Напомню, что мужские фамилии в русском языке склоняются всегда, кроме тех случаев, когда их вообще невозможно просклонять (фамилии типа Тёмных, Джугашвили, Беранже, Приходько и т.д.). В прочих случаях "экзотическая" мужская фамилия склоняется, а женская - нет. Например: господина Ганжу, но госпожу Ганжа; господина Веббера, но госпожу Веббер и т.д.
Функция имеет три входных параметра: фамилия_имя_отчество полностью (или фамилия + инициалы), пол (М или Ж) и падеж (Р-родительный или Д-дательный).
Выход функции: склонение в заданном падеже.
P.S. Функция была проверена на около 100 различных сочетаний (правильно склоняет даже такую "экзотику" как Кац Мойша Абрамович), но возможно на каких-то сочетаниях имеются "блохи". В таком случае надо добавить соответствующее условие.
P.S.S. В тексте специально не употреблялись сложные конструкции "Если - Иначе" для удобства добавления новых условий.
Функция Склонять(ФИО, Пол, Падеж) экспорт
///Упорядочивание алфавита
Перем L[32];
L[1]="Б";
L[2]="В";
L[3]="Г";
L[4]="Д";
L[5]="Ж";
L[6]="З";
L[7]="К";
L[8]="Л";
L[9]="М";
L[10]="Н";
L[11]="П";
L[12]="Р";
L[13]="С";
L[14]="Т";
L[15]="Ф";
L[16]="Х";
L[17]="Ц";
L[18]="Ч";
L[19]="Ш";
L[20]="Щ";
//Гласные
L[21]="А";
L[22]="Е";
L[23]="И";
L[24]="Й";
L[25]="О";
L[26]="У";
L[27]="Ы";
L[28]="Э";
L[29]="Ю";
L[30]="Я";
L[31]="Ь";
L[32]="Ъ";
/////////Выделение Фамилия, Имя, Отчество
Пол=СокрЛП(Строка(Пол));
Пол=Врег(Пол);
Если (Пол<>"М") И (Пол<>"Ж") Тогда
Предупреждение ("Неверно задан пол: М или Ж");
Возврат " ";
КонецЕсли;
Падеж=СокрЛП(Строка(Падеж));
Падеж=Врег(Падеж);
Если (Падеж<>"Р") И (Падеж<>"Д") Тогда
Предупреждение ("Неверно задан падеж: Р или Д");
Возврат " ";
КонецЕсли;
ПолноеИмя=Строка(ФИО);
ПолноеИмя=СокрЛП(ПолноеИмя);
ПозицияПервогоПробела = Найти(ПолноеИмя, " ");
Фамилия = Лев(ПолноеИмя, ПозицияПервогоПробела);
Фамилия=СокрЛП(Фамилия);
ИмяОтчество = Сред(ПолноеИмя, ПозицияПервогоПробела+1);
ИмяОтчество = СокрЛП(ИмяОтчество);
ПозицияТочки=Найти(ИмяОтчество,".");
Если ПозицияТочки>0 Тогда //если введены инициалы
Имя=Сред(ИмяОтчество,1,ПозицияТочки);
Отчество=Сред(ИмяОтчество,ПозицияТочки+1);
Отчество=СокрЛ(Отчество);
Иначе;
ПозицияВторогоПробела = Найти(ИмяОтчество, " ");
Имя = Сред(ИмяОтчество,1, ПозицияВторогоПробела-1);
Имя=СокрЛП(Имя);
Отчество = Сред(ИмяОтчество, ПозицияВторогоПробела+1);
Отчество = СокрЛП(Отчество);
КонецЕсли;
//////////Склонение фамилии
Фам1=ВРЕГ(Фамилия);
Последняя=Прав(Фам1,1);
ДвеПоследних=Прав(Фам1,2);
ТриПоследних=Прав(Фам1,3);
Флаг=0;
Для i=1 По 32 Цикл
Если L[i]=Последняя Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если i<=20 Тогда
ТипБуквы=1;//согласная
ИНАЧЕ;
ТипБуквы=2;//гласная
КонецЕсли;
//////////////// Исключения ////////////////////
Если СтрДлина(Фамилия)<=2 Тогда
Родительный=Фамилия;//фамилии типа Ге, Че
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
Если (ДвеПоследних="ИХ") ИЛИ (ДвеПоследних="ЫХ") Тогда
Родительный=Фамилия;//сибирские фамилии
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
Если Последняя="О" Тогда
Родительный=Фамилия;//украинские фамилии
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
Если ДвеПоследних="УА" Тогда
Родительный=Фамилия;//фамилии типа Стуруа
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
Если ДвеПоследних="ИА" Тогда
Родительный=Фамилия;//фамилии типа Туташхиа
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
Если (ДвеПоследних="ЖА") И (Пол="Ж") Тогда
Родительный=Фамилия;// женские фамилии типа Ганжа
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
Если ТриПоследних="ДЗЕ" Тогда
Родительный=Фамилия;//грузинские фамилии типа Гогадзе
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
Если ТриПоследних="ИЛИ" Тогда
Родительный=Фамилия;//грузинские фамилии типа Габошвили
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
Если (ДвеПоследних="ОЙ") И (Пол="М") И (СтрДлина(Фамилия)=3) Тогда
Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"я";//фам. типа Цой
Дательный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"ю";
Перейти ~выход;
КонецЕсли;
Если (ДвеПоследних="ОЙ") И (Пол="Ж") И (СтрДлина(Фамилия)=3) Тогда
Родительный=Фамилия; //фам. типа Цой
Дательный=Фамилия;
Перейти ~выход;
КонецЕсли;
///////////////////////////////////////////////////////////////////////
Если (Пол="М") И (ТипБуквы=1) Тогда //мужскую склоняем
Родительный=Фамилия+"а";
Дательный=Фамилия+"у";
Флаг=1;
КонецЕсли;
Если (Пол="М") И (ДвеПоследних="ДЬ") Тогда //специально для губернатора
Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"я";//Лебедя
Дательный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"ю";
Флаг=1;
КонецЕсли;
Если (Пол="Ж") И (ТипБуквы=1) Тогда //женскую не склоняем
Родительный=Фамилия;
Дательный=Фамилия;
Флаг=1;
КонецЕсли;
Если (Пол="Ж") И (Последняя="А") Тогда
Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"у";
Дательный= Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"ой";
Флаг=1;
КонецЕсли;
Если (Пол="М") И (Последняя="А") Тогда //фам. типа Соткилава
Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"у";
Дательный= Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"е";
Флаг=1;
КонецЕсли;
Если (ДвеПоследних="ОЙ") И (Пол="М") И (СтрДлина(Фамилия)>3) Тогда
Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"го";
Дательный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"му";
Флаг=1;
КонецЕсли;
Если (ДвеПоследних="АЯ") И (Пол="Ж") И (СтрДлина(Фамилия)>3) Тогда
Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-2)+"ую";
Дательный=Сред(Фамилия,1,СтрДлина(Фамилия)-2)+"ой";
Флаг=1;
КонецЕсли;
Если Флаг=0 Тогда //если не сработало ни одно условие
Родительный=Фамилия;
Дательный=Фамилия;
КонецЕсли;
~выход: //////////////склонение имени////////
Если ПозицияТочки>0 Тогда
РодительныйИмя=Имя;
ДательныйИмя=Имя;
РодительныйОтчество=Отчество;
ДательныйОтчество=Отчество;
Перейти ~выход1;
КонецЕсли;
Имя1=ВРЕГ(Имя);
Последняя=Прав(Имя1,1);
ДвеПоследних=Прав(Имя1,2);
ТриПоследних=Прав(Имя1,3);
Флаг=0;
Для i=1 По 32 Цикл
Если L[i]=Последняя Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если i<=20 Тогда
ТипБуквы=1;//согласная
ИНАЧЕ;
ТипБуквы=2;//гласная
КонецЕсли;
Если (Пол="М") И (ТипБуквы=1) Тогда ///Иван, Петр и т.д.
РодительныйИмя=Имя+"а";
ДательныйИмя =Имя+"у";
Флаг=1;
КонецЕсли;
Если (Пол="М") И (Последняя="Й") Тогда ///Сергей, Дмитрий и т.д.
РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"я";
ДательныйИмя =Сред(Имя,1,СтрДлина(Имя)-1)+"ю";
Флаг=1;
КонецЕсли;
Если (Пол="М") И (Последняя="А") Тогда ///Фома
РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"у";
ДательныйИмя =Сред(Имя,1,СтрДлина(Имя)-1)+"е";
Флаг=1;
КонецЕсли;
Если (Пол="М") И (Последняя="Я") Тогда ///Илья
РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"ю";
ДательныйИмя =Сред(Имя,1,СтрДлина(Имя)-1)+"е";
Флаг=1;
КонецЕсли;
Если (Пол="М") И (Последняя="Ь") Тогда ///Игорь
РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"я";
ДательныйИмя =Сред(Имя,1,СтрДлина(Имя)-1)+"ю";
Флаг=1;
КонецЕсли;
Если (Пол="Ж") И (Последняя="А") Тогда ///Татьяна, Людмила и т.д.
РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"у";
ДательныйИмя =Сред(Имя,1,СтрДлина(Имя)-1)+"е";
КонецЕсли;
Если (Пол="Ж") И (Последняя="Я") Тогда ///Зоя, Наталья и т.д.
РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"ю";
ДательныйИмя =Сред(Имя,1,СтрДлина(Имя)-1)+"е";
Флаг=1;
КонецЕсли;
Если (Пол="Ж") И (ДвеПоследних="ИЯ") Тогда ///Наталия,Виктория и т.д.
РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"ю";
ДательныйИмя =Сред(Имя,1,СтрДлина(Имя)-1)+"и";
Флаг=1;
КонецЕсли;
Если Флаг=0 Тогда
РодительныйИмя=Имя;
ДательныйИмя =Имя;
КонецЕсли;
/////////склонение отчества///////
Если (Пол="М") Тогда
РодительныйОтчество=Отчество+"а";
ДательныйОтчество =Отчество+"у";
КонецЕсли;
Если (Пол="Ж") Тогда
РодительныйОтчество=Сред(Отчество,1,СтрДлина(Отчество)-1)+"у";
ДательныйОтчество =Сред(Отчество,1,СтрДлина(Отчество)-1)+"е";
КонецЕсли;
~выход1: /////////////////////
Если Падеж="Д" Тогда
ФИОВозврат=Дательный+" "+ДательныйИмя+" "+ДательныйОтчество;
Иначе;
ФИОВозврат=Родительный+" "+РодительныйИмя+" "+РодительныйОтчество;
КонецЕсли;
Возврат ФИОВозврат;
КонецФункции