Имя: Пароль:
1C
 
Предлагаю коллективно написать функцию склонения
0 Гений 1С
 
гуру
16.05.08
10:22
А то мне не нравится, что эта функция зашита в ВК.
Какие идеи, с чего начнем.
По сути мысль такая - сюда будем класть функцию и тестировать ее.
Глюки исправлять.
Я координатор.
1 Дуб
 
16.05.08
10:22
(0) склонения к чему? И кого?
2 Гений 1С
 
гуру
16.05.08
10:23
(1) Склонения ФИО и должностей.
Например: по велению директор[a] Мефодия Кириллович[а] Жигунов[а]
3 Гений 1С
 
гуру
16.05.08
10:24
Может у кого есть готовая фукнция на VB или другом языке?
4 Дуб
 
16.05.08
10:25
(2) неее, вот если бы девушек склонять.. К чему-нить хорошему...
5 Defender aka LINN
 
16.05.08
10:33
(3) Есть готовая ВК, что тебе еще надо?
6 Регистратор
 
16.05.08
10:49
Хорошая идея, можно еще совместить склонение фамилий с генератором матов, для большей выразительности.
7 Гений 1С
 
гуру
16.05.08
14:19
(5) давай исходный код
(5) Не люблю проприетарность... Думаю, напишем функцию на 1С без извратов, увековечим себя. ее можно потом и на бейсик перелобать и на паскаль и на шарп.
8 a_ivanov
 
16.05.08
14:22
9 MistK
 
16.05.08
14:38
(7)
Вот тут посмотри, на 1С тоже есть:

http://www.superjur.narod.ru/padeg.htm

все уже придумано до нас :)
10 Fragster
 
гуру
16.05.08
14:41
а вот интересно, как отличать метро и пальто от г"вно?
11 Fragster
 
гуру
16.05.08
14:43
(10) да и вообще дофига исключений, выпадающих/чередующихся гласных и т.д.
12 Immortal
 
16.05.08
14:45
велотрасса Мск-НьюВасюки
13 у лю 427
 
16.05.08
14:46
(11) не миздите. Полный текст этой функции для России составляет 2 страницы

(0) даже полные дятлы уже давно скопипастили эту функцию в инете на любом языке программирования
14 Maxus43
 
16.05.08
14:55
Гений, лови такую:

Процедура УстановитьСклонение(ФамилияРаботника,ИмяРаботника,ОтчествоРаботника)
   Если Пол = Перечисления.ПолФизическихЛиц.Мужской Тогда
       Если (Прав(ФамилияРаботника, 2) = "ев") или (Прав(ФамилияРаботника, 2) = "ов") или
           (Прав(ФамилияРаботника, 2) = "ин") или (Прав(ФамилияРаботника, 2) = "ын") или
           (Прав(ФамилияРаботника, 2) = "ёв") Тогда
           СклонениеФамилии = СокрЛП(ФамилияРаботника)+ "а";
       ИначеЕсли Прав(ФамилияРаботника, 2) = "ий"    Тогда
           СклонениеФамилии = Лев(ФамилияРаботника,СтрДлина(ФамилияРаботника)-2)+ "ого";
       Иначе
           СклонениеФамилии = ФамилияРаботника;
       КонецЕсли;
       Если Прав(ИмяРаботника,1) = "й" Тогда
           СклонениеИмени = Лев(ИмяРаботника,СтрДлина(ИмяРаботника)-1)+ "я";
       Иначе
           СклонениеИмени = СокрЛП(ИмяРаботника)+ "а";
       КонецЕсли;
       СклонениеОтчества = СокрЛП(ОтчествоРаботника)+ "а";
   Иначе
       Если (Прав(ФамилияРаботника, 3) = "ева") или (Прав(ФамилияРаботника, 3) = "ова") или
           (Прав(ФамилияРаботника, 3) = "ина") или (Прав(ФамилияРаботника, 3) = "ына") или
           (Прав(ФамилияРаботника, 3) = "ёва") Тогда
           СклонениеФамилии = Лев(ФамилияРаботника,СтрДлина(ФамилияРаботника)-1)+ "у";
       ИначеЕсли Прав(ФамилияРаботника, 3) = "ая"    Тогда
           СклонениеФамилии = Лев(ФамилияРаботника,СтрДлина(ФамилияРаботника)-2)+ "ую";
       Иначе
           СклонениеФамилии = ФамилияРаботника;
       КонецЕсли;
       Если Прав(ИмяРаботника,1) = "а" Тогда
           СклонениеИмени = Лев(ИмяРаботника,СтрДлина(ИмяРаботника)-1)+ "у";
       ИначеЕсли Прав(ИмяРаботника,1) = "я" Тогда
           СклонениеИмени = Лев(ИмяРаботника,СтрДлина(ИмяРаботника)-1)+ "ю";
       Иначе
           СклонениеИмени = СокрЛП(ИмяРаботника);
       КонецЕсли;
       СклонениеОтчества = Лев(ОтчествоРаботника,СтрДлина(ОтчествоРаботника)-1)+ "у";
   КонецЕсли;
   Склонение = СокрЛП(СклонениеФамилии) + " " + СокрЛП(СклонениеИмени) + " " + СокрЛП(СклонениеОтчества);
КонецПроцедуры
15 Нуф-Нуф
 
16.05.08
15:02
у меня на работе бухша есть. уже полгода подкатываю... никак склонить не могу...
16 Maxus43
 
16.05.08
15:04
(15) напиши ей обработку, склонится м.б.)
17 strelok_1975
 
16.05.08
15:14
Есть фамилии, которые вообще не склоняются.
Например, Скрипка.
Так что функция в любом случае будет ошибаться.
18 Sadovnikov
 
16.05.08
15:15
(15) Твоя бухша не из примера в (17) ?
19 Maxus43
 
16.05.08
15:17
(17) будет, и функция в ВК тож ошибается...
20 butterbean
 
16.05.08
15:19
(17) ИМХО мужские всегда склоняются
21 Fragster
 
гуру
16.05.08
15:19
(13) в посте (2) написано, что не только фамилии, но и должности и пр. склонять надо.
22 strelok_1975
 
16.05.08
15:19
У меня нет личной бухши.

Это известный дирижер.
23 strelok_1975
 
16.05.08
15:21
(20) Замечательный ресурс gramota.ru
24 Maxus43
 
16.05.08
16:03
(21) дак и для них подобную чуш написать можно, как в (14)
25 Maxus43
 
16.05.08
16:03
(3) в (14) тебе на 1С...
Тему создал и свалил короче
26 Fragster
 
гуру
16.05.08
16:06
(24) ну так я ж говорю и метро, и пальто, и г"вно - на о заканчиваются, но при этом метро и пальто не склоняются никак :/
27 Maxus43
 
16.05.08
16:08
(26) да я не спорю, я в курсе этого... Гений грит - давайте код, я дал, пусть чо хочет с ним делает)
28 Гений 1С
 
гуру
16.05.08
16:51
(14) Это у тебя какой падеж? Где падеж передается?
29 Гений 1С
 
гуру
16.05.08
17:00
(17) Исключения можно забить в функцию, не тренди
30 Гений 1С
 
гуру
16.05.08
17:01
(26) исключения - в функцию
31 у лю 427
 
16.05.08
17:11
всеми забыт миздательный падёж - звучит миздить Гени(тали)и
32 France
 
16.05.08
17:20
склонения к сожительству с 1С?
33 Гений 1С
 
гуру
16.05.08
17:33
Мда, только трендеть умеют 1сники...
Какие нафиг 2с, ананасы, когда даже функцию слонения по падежам написать сообча не могут...
34 Lmn
 
16.05.08
17:40
Дык зачем писать то что уже есть. Давай еще квадратный корень, синус, косинус, логарифм до кучи перепишем. Тоже кода нет открытого, не то что в ВК, ваще в платформу зашили, негодяи!!! :)
35 liosha
 
16.05.08
17:47
(33) Ну ты бы тогда хотя бы начал, что ли...
36 Гений 1С
 
гуру
16.05.08
18:06
(34) Сравнил синус, который любой студень может написать с функцией склонения.
Если есть, то вынь и положь, опиши олгоритм. Я тебе алгоритм синуса описать могу.
(35) Ну блин, есть 6 падежей, ок...
Функция на входе получает фамилию, имя, отчество, падеж
На выходе выдает в нужном виде структуру Фамилия,Имя,Отчетство.
Можно составить тест, чтобы проверять...
37 Denjs
 
17.05.08
01:58
(0) я могу помоч.
возглавить разработку, организовать, и тесты описать, и проконтроллировать...

но есть маленькая заковырка.
Нахаляву писать я буду только GPL-ный код - а применение GPL-ного кода заставит вас выкладывать по GPL конфигурации которые используют эту функцию. и ключем такую конфигурацию защищать будет нельзя. ибо лицензия. )
Потому для всех любитетей "поторговать" эта функция будет мало интересна.

А если не нахаляву - тогда озвучте сумму бюджета )))

(33) руководитель нужен) координатор ) 1С-ники - они не Линуксоиды - самоорганизовыватьс якак правило не умеют. имхо. )

==========================================================
А вообще склонение по падежам - имхо - первая задачка на пути к задачам типа "перевод текста" или "программы ведения диалога".. и т.д. вплоть до "узнавания образа".

И смею заявить : алгоритмически - задача не решается.

ага.
Тут словарь нужен. Если уж вы хотите работать с этим как с функцией.
не от падежа зависит склонение. "пальто - много пальто", но "гавно - много гавна" - как уже сказали выше.

Тем более - если вы "замахиваетесь" на склонение фамилий и имен.
в общем - в продолжение (33) - "как ты задачу поставил, так тебе и ответили".
Алгоритмически это не решается. имхо.
38 Злопчинский
 
17.05.08
02:08
Гений, на проклабе возьми разработку "Падеж "Крохотулька" - и порадуйся...
39 Гений 1С
 
гуру
19.05.08
09:53
(37) Не тренди, не чуствуешь разницу? пальто заканчивается на ТО а говно на НО.
(37) Не знаю что такое GPL, а я разрабатываю свои функции на правах антикопирайта. Сделал сам - поделюсь с товарищем. На халяву... ПРи чем здесь бабосы.
(38) Ты в самом деле считаешь, что Open Source код может выглядеть так маразматично, причем без камментов? Я уже сталкивался с этим кодом, он глюкавит и понять алгоритм, чтобы исправить невозможно:

Функция ПадежС(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))=0))или((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<>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+СокрП(Сред("а у а "+?((z8="ич")или(z8="ыш"),"е",?((z8="ов")or(z8="ин"),"ы","о"))+"ме "+?(Найти("гжкхш",Лев(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);
КонецФункции

Давайте лучше вместе напишем.
40 Maxus43
 
19.05.08
10:17
(28) Процедурка по падежам не рулит, под документ делалась, чтобы правильно выводилось на печать, когда ещо без ВК работали, типа:
Иванов Иван Иваныч - Иванова Ивана Ивановича
41 Гений 1С
 
гуру
19.05.08
16:40
(40) Я перерыл весь интернет, не нашел алгоритма. Если сделаем - прославимся. ;-)
42 Maxus43
 
19.05.08
16:42
(41) дак ВК уже сделали ведь, прославились
43 Гений 1С
 
гуру
19.05.08
16:51
Закинул тему на sql.ru.
Может там кто делал наработки.
http://www.sql.ru/forum/actualthread.aspx?bid=24&tid=557993
44 Долорес И
 
19.05.08
17:06
(39)в свое время понадобилось что-то поправить в этой функции, разобралась исправила.
45 Гений 1С
 
гуру
19.05.08
17:06
(44) Ты более крутой реверс-инженер, чем я.. Я не осилил...
У тебя случайно кода переписанного на Если-То-Иначе нет?
46 DimG
 
19.05.08
17:18
Странно что про РупороАбсурдовский сайт еще никто не вспомнил.
47 maxar
 
19.05.08
17:22
Футбольный матч ЦСКА - Динамо. Фанат орет "ЦСКА сделай Динаму!!!". Пожилой болельщик - "Молодой человек, Вы знаете что слово Динамо не склоняется?". Фанат - "Перед ЦСКОЙ все склоняются!!!"
48 Гений 1С
 
гуру
19.05.08
18:25
(47) ;-)
(46) А что, рупор писал про склонения.

Просто ненавижу проприетарный код и то, что склонения запихнули в ДЛЛ.
49 DimG
 
19.05.08
18:55
(48) Дык посмотри. У него там лежит обработка датированная аж 2002 годом. Нормально вроде работает, без нареканий.
50 Гений 1С
 
гуру
20.05.08
09:49
(49) А у него - это где?
51 Гений 1С
 
гуру
20.05.08
10:02
Нашел:
http://avb1c.narod.ru/?=a10

Хотя здесь только два падежа - родительный и дательный.
Счас займусь обратным инжинирингом этого чуда кода без единого коммента:

//
//                  by Alexey Bazhitov aka avb
//                    Moscow,  october 2002
//                  mailto: avb@dmitrovka.net
//
//-----------------------------------------------------------------------------
function upperFirst(val str) export
 if isBlankString(str)=1 then return "" endif;
 str=lower(str);
 return upper(mid(str,1,1))+mid(str,2);
endFunction  
//-----------------------------------------------------------------------------
function decline(word,sex,declension,base,case)
 if isBlankString(word)=1 then return ""  endif;
 if declension=0 then return word
 elsif declension=1 then        
   return word+?(case=0,?(base=0,"я","а"),?(base=0,"ю","у"));
 elsif declension=2 then
   if case=0 then return word+?(base=0,"и","ы") endif;
   if right(word,1)="и" then return word+"и" endif;
   return word+"е";
 elsif declension=3 then
   if sex=0 then return word+"ой" endif;
   return word+?(case=0,"а","у");  
 elsif declension=4 then
   if sex=0 then return word+?(base=0,"ей","ой") endif;
   return word+?(case=0,?(base=0,"его","ого"),?(base=0,"ему","ому"));
 endif;
 return word;
endFunction
//-----------------------------------------------------------------------------
function analysisI(word,base,sex,declension,sexUpdate=0)
 if word="" then return("") endif;    
 base=1;      
 if find("бвгджзклмнпрстфхцчшщ",right(word,1))<>0 then
   declension=1;                          
   if sexUpdate=0 then sex=1; sexUpdate=1; endif;
   if word="Павел" then return "Павл" endif;
   if word="Лев" then return "Льв" endif;  
   return word;
 elsif find("ьй",right(word,1))<>0 then
   if (sex=0) or (word="Любовь") then
     declension=0;
     return word;
   endif;
   declension=1;
   if sexUpdate=0 then sex=1; sexUpdate=1; endif;
   base=0;
   return left(word,strlen(word)-1);
 elsif right(word,1)="а" then
   declension=2;
   if sexUpdate=0 then sex=0; endif;
   if find("гйкхчшщ",mid(word,strlen(word)-1,1))<>0 then base=0 endif;
   return left(word,strlen(word)-1);
 elsif right(word,1)="я" then
   declension=2;
   if sexUpdate=0 then sex=0; endif;
   base=0;
   return left(word,strlen(word)-1);
 endif;      
 declension=0;
 return word;
endFunction
//-----------------------------------------------------------------------------
function analysisF(word,base,sex,declension,sexUpdate=0)
 base=1;    
 if find("ин ын ов ев ёв",right(word,2))<>0 then
   declension=3;
   if sexUpdate=0 then sex=1; sexUpdate=1; endif;
   return word;
 elsif find("ина ына ова ева ёва",right(word,3))<>0 then
   declension=3;
   if sexUpdate=0 then sex=0; sexUpdate=1; endif;
   return left(word,strlen(word)-1);
 elsif find("ий ый ой",right(word,2))<>0 then
   declension=4;  
   if sexUpdate=0 then sex=1; sexUpdate=1; endif;
   return left(word,strlen(word)-2);
 elsif right(word,2)="ая" then
   declension=4;
   if sexUpdate=0 then sex=0; sexUpdate=1; endif;
   return left(word,strlen(word)-2);  
 elsif right(word,2)="яя" then
   declension=4;
   base=1;
   if sexUpdate=0 then sex=0; sexUpdate=1; endif;
   return left(word,strlen(word)-2);    
 elsif (find("их ых ко",right(word,2))<>0) or (right(word,3)="ово") then
   declension=0;
   return word;
 endif;
 if sex=1 then return analysisI(word,base,sex,declension,sexUpdate) endif;
 declension=0;
 return word;
endFunction  
//-----------------------------------------------------------------------------
function analysisO(word,base,sex,declension)
 base=1;
 if find("ич ыч",right(word,2))<>0 then
   declension=1;
   sex=1;
   return word;
 elsif right(word,2)="на" then
   declension=2;
   sex=0;
   return left(word,strlen(word)-1);
 endif;  
 declension=0;
 return word;
endFunction
//-----------------------------------------------------------------------------
function prepareF(fname,sex,case,sexUpdate=0)
 var base,declension;  
 pos=find(fname,"-");
 vlfname=createObject("ValueList");
 while pos<>0 do
   vlfname.addValue(upperFirst(left(fname,pos-1)));
   fname=mid(fname,pos+1);
   pos=find(fname,"-");
 enddo;
 vlfname.addValue(upperFirst(fname));  
 i=1;
 while sexUpdate=0 do
   try fname=vlfname.getValue(i) except break endtry;
   word=analysisF(fname,base,sex,declension,sexUpdate);
   i=i+1;
 enddo;
 fname="";
 for i=1 to vlfname.getListSize() do
   word=analysisF(vlfname.getValue(i),base,sex,declension,sexUpdate);
   fname=fname+?(fname="","","-")+decline(word,sex,declension,base,case);
 enddo;
 return fname;
endFunction
//-----------------------------------------------------------------------------
function declineFIO(val fio,case=0,val sex="") export
 //основа алгоритма: http://mt.nightmail.ru/index.htm?/russian/fio.htm  
 //
 //fio  - Фамилия Имя Отчество
 //       либо Фамилия Имя
 //       либо Фамилия И.О.
 //       либо Фамилия И.  
 //       либо только Фамилия.
 //       фамилия может быть двойной, тройной и т.д. ("Соловьев-Седой"),
 //       при этом склоняются все части фамилии ("Соловьеву-Седому").
 //       fio может передаваться в любом регистре символов.
 //case - падеж; 0-родительный, 1-дательный.
 //sex  - род; 0-женский, 1-мужской; необходимо указывать только для
 //       склонения неоднозначностей типа "Блок Саша", "Гоголь Н.В." и т.п.
 var fname,iname,oname;
 var base,declension;                  
 if sex="" then sexUpdate=0; else sexUpdate=1 endif;
 if isBlankString(fio)=1 then return "" endif;
 fio=trimAll(fio);
 //if strCountOccur(fio," ")=0 then return fio endif;
 while find(fio,"  ")>0 do fio=strReplace(fio,"  "," ") enddo;
 fio=strReplace(fio," -","-");                    
 fio=strReplace(fio,"- ","-");
 fio=strReplace(fio," .",".");                    
 fio=strReplace(fio,". ",".");
 if find(fio,".")<>0 then
   pos=find(fio," ");
   if pos=0 then return fio endif;
   fname=left(fio,pos-1);
   ioname=upper(mid(fio,pos+1));
   fname=prepareF(fname,sex,case);
   return fname+" "+strReplace(ioname," ","");
 endif;
 pos=find(fio," ");
 if pos=0 then
   return prepareF(fio,sex,case);
 else
   fname=left(fio,pos-1);
   fio=mid(fio,pos+1);
   pos=find(fio," ");
   if pos=0 then
     iname=upperFirst(fio);
     oname="";                  
   else
     iname=upperFirst(left(fio,pos-1));
     oname=upperFirst(mid(fio,pos+1));
     sex=?(right(oname,1)="ч",1,0);  
     sexUpdate=1;
   endif;                                    
 endif;
 if sexUpdate=0 then word=analysisI(iname,base,sex,declension,sexUpdate) endif;  
 if sex="" then sex=0 endif;
 fname=prepareF(fname,sex,case,sexUpdate);
 word=analysisI(iname,base,sex,declension,sexUpdate);
 iname=decline(word,sex,declension,base,case);
 word=analysisO(oname,base,sex,declension);
 oname=decline(word,sex,declension,base,case);
 return trimAll(fname+" "+iname+" "+oname);
endFunction
//-----------------------------------------------------------------------------
rgCase=1;  
rgSex=1;
form.lbfio.caption("Фамилия Имя Отчество
 |либо Фамилия Имя
 |либо Фамилия И.О.
 |либо Фамилия И.  
 |либо только Фамилия.    
 |(именно в таком порядке)
 |Фамилия может быть двойной, тройной и т.д. (""Соловьев-Седой"")");
52 Гений 1С
 
гуру
21.05.08
09:21
на sql.ru нашел код на Cashe для склонения.
Начал переносить на 1С, перенес уже фамилии и имена, осталось отчества.
Потом допишу модуль тестирования (набросаю фамилий, имено отчеств) - и все будет пучком.

Вот то, что есть на данный момент:

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

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

Сообщить(обСклонениеСтроки("Иванова", "В", "Фамилия", "Ж"));
Сообщить(обСклонениеСтроки("Анна", "В", "Имя", "Ж"));
Сообщить(обСклонениеСтроки("Семеновна", "В", "Отчество", "Ж"));
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.