Давно где то в инете нашел
********************************************
* Преобразование мужской фамилии
********************************************
Function Fam_m(Fam, Pad) // параметры фамилия в именит. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный
LOCAL OK,LEN,Fam_m:=""
LOCAL OKI:={"","","","","",""} // определяем массив окончаний
Len=Len(Fam) // определяем количество букв в фамилии
Ok=RIGHT(Fam, 3) // берем последние 3 буквы фамилии
If Ok="кий" .OR. Ok="ний"; // если окончание такое
Fam=LEFT(Fam, len-2) // то формируем фамилию
Do Case
Case Ok="кий"
Oki={"ий","ого","ому","ого","им","ом"}
Case Ok="ний"
Oki={"ий","его","ему","его","им","ем"}
EndCase
Fam_m=Fam+Oki[Pad] // добавляем к фамилии окончание
Return Fam_m // возвращем результат
EndIf
***** перебираем другие окончания
Ok=RIGHT(Fam, 2) // берем последние две буквы
If Ok="ий"
Fam=LEFT(Fam, Len-1) // формируем фамилию
Oki={"й","я","ю","я","ем","и"}
Fam_m=Fam+Oki[Pad] // добавляем к фамилии окончание
Return Fam_m // возвращем результат
EndIf
Do Case
Case Ok="ын" .OR. Ok="ин" .OR. Ok="ев" .OR. Ok="ёв" .OR. Ok="ов"
Oki={"","а","у","а","ым","е"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
Case Ok="ян" .OR. Ok="ан" .OR. Ok="он" .OR. Ok="ук" ;
.OR. Ok="юк" .OR. Ok="яр"
Oki={"","а","у","а","ом","е"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
Case Ok="ок"
If Pad>1
Fam=LEFT(Fam, len-2)+"к"
EndIf
Oki={"","а","у","а","ом","е"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
Case Ok="ый" .OR. Ok="ой"
Fam=LEFT(Fam, Len-2)
Oki={OK,"ого","ому","ого","ым","ом"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
Case Ok="ич"
Oki={"","а","у","а","ем","е"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
CASE OK=="ей"
If LEFT(RIGHT(FAM,3),1)=="л"//ПЕРЕД OK НАХОДИТСЯ МЯГКАЯ СОГЛАСНАЯ: ВОДОЛЕЙ
FAM=LEFT(FAM, LEN-2)
OKI={OK,"ея","ею","ея","ем","ее"}
FAM_M=FAM+OKI[PAD]
RETURN FAM_M
Else //ПЕРЕД OK НАХОДИТСЯ ТВЕРДАЯ СОГЛАСНАЯ: ВОРОБЕЙ
FAM=LEFT(FAM, LEN-2)
OKI={OK,"ья","ью","ья","ьем","ье"}
FAM_M=FAM+OKI[PAD]
RETURN FAM_M
EndIF
CASE OK=="ец"
IF LEFT(RIGHT(FAM,3),1)=="л"//ПЕРЕД OK НАХОДИТСЯ МЯГКАЯ СОГЛАСНАЯ: СТРЕЛЕЦ
FAM=LEFT(FAM, LEN-2)
OKI={OK,"ьца","ьцу","ьца","ьцом","ьце"}
FAM_M=FAM+OKI[PAD]
RETURN FAM_M
ELSE //ПАСОВЕЦ
FAM=LEFT(FAM, LEN-2)
OKI={OK,"ца","цу","ца","цом","це"}
FAM_M=FAM+OKI[PAD]
RETURN FAM_M
ENDIF
EndCase
OK=RIGHT(FAM, 1) // берем последнию букву
DO CASE
CASE OK=="а"
Fam=LEFT(Fam, Len-1)
Oki={"а","ы","е","у","е","ой"}
//НУЛЕВОЕ ОКОНЧАНИЕ
CASE OK!="е" .AND. OK!="ё" .AND. OK!="и" .AND. OK!="о" ;
.AND. OK!="у" .AND. OK!="э" .AND. OK!="ю" .AND. OK!="я"
OKI={"","а","у","а","ом","е"}
ENDCASE
Fam_m=Fam+Oki[Pad]
Return Fam_m
********************************************
* Преобразование женской фамилии
********************************************
Function Fam_w(Fam, Pad) // параметры фамилия в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный
LOCAL OK,LEN,Fam_m:=""
LOCAL OKI:={"","","","","",""} // определяем массив окончаний
Len=Len(Fam) // определяем количество букв в фамилии
Ok=RIGHT(Fam, 2)
//Ok=Substr(Fam, Len-1, 2) // берем посление 3 буквы фамилии
If Ok="ая" .OR. Ok="яя"; // если окончание такое
Fam=LEFT(Fam,len-2) // то формируем фамилию
Do Case
Case Ok="ая"
Oki={"ая","ой","ой","ую","ой","ой"}
Case Ok="яя"
Oki={"яя","ей","ей","юю","ей","ей"}
EndCase
Fam_m=Fam+Oki[Pad] // добавляем к фамилии окончание
Return Fam_m // возвращем результат
EndIf
***** перебираем другие окончания
Ok=RIGHT(Fam, 3) // берем последние две буквы
//Ok=Substr(Fam, Len-2, 3) // берем последние две буквы
If Ok="ова" .OR. Ok="ева" .OR. Ok="ёва" .OR. Ok="ина"
Fam=LEFT(Fam, Len-1) // формируем фамилию
Oki={"а","ой","ой","у","ой","ой"}
EndIf
Fam_m=Fam+Oki[Pad]
Return Fam_m
**************************************************
* Функция преобразования мужского имени
*
*
**************************************************
Function Name_m(Name, Pad) // параметры: имя в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный
LOCAL Oki[6] // определяем массив окончаний
LOCAL OK
Ok=RIGHT(Name, 1) // смотрим окончание
IF Ok="й"
Oki={OK,"я","ю","я","ем","е"}
Name=LEFT(Name, Len(Name)-1)
ELSE
Oki={"","а","у","а","ом","е"}
ENDIF
Return Name+Oki[Pad]
**************************************************
* Функция преобразования женского имени
*
*
**************************************************
Function Name_w(Name, Pad) // параметры: имя в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный
LOCAL Oki[6] // определяем массив окончаний
LOCAL OK
Ok=RIGHT(Name, 1) // смотрим окончание
Do Case
Case Ok="а"
Oki={OK,"ы","е","у","ой","е"}
OK=RIGHT(NAME,2) //ОЛЬГА
IF OK=='ка'.OR. OK=='га' .OR. OK=='жа' .OR. ;
OK=='ха' .OR. OK=='ша' .OR. OK=='ща'
OKI[2]="и"
ENDIF
Name=LEFT(Name, Len(Name)-1)
Case Ok="я"
IF RIGHT(NAME,2)="ия"
Oki={"я","и","и","ю","ей","и"}
ELSE
Oki={OK,"и","е","ю","ей","и"}
ENDIF
Name=LEFT(Name, Len(Name)-1)
CASE OK=="и"
OKI={"","","","","",""}
EndCase
Return Name+Oki[Pad]
**************************************************
* Функция преобразования мужского отчества
*
*
**************************************************
Function SoName_m(SoName, Pad) // параметры: имя в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный
LOCAL Oki[6] // определяем массив окончаний
LOCAL OK
OK=RIGHT(SONAME, 1) // смотрим окончание
Oki={"","а","у","а","ем","е"}
Return SoName+Oki[Pad]
**************************************************
* Функция преобразования женского отчества
*
*
**************************************************
Function SoName_w(SoName, Pad) //параметры: имя в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный
LOCAL Oki[6] // определяем массив окончаний
LOCAL OK
Ok=RIGHT(SoName, 1) // смотрим окончание
If Ok="а"
Oki={"а","ы","е","у","ой","е"}
SoName=LEFT(SoName, Len(SoName)-1)
EndIf
Return SoName+Oki[Pad]