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