Имя: Пароль:
1C
1С v8
функции склонения фио
0 LivingStar
 
22.04.13
13:45
есть ли в бп функции склонения фио?
1 1Сергей
 
22.04.13
13:46
да. В родительный и дательный
2 Wobland
 
22.04.13
13:46
в ней есть глобальный поиск
3 LivingStar
 
22.04.13
13:51
(1 ) что за функция, подскажите пожалуйста?
4 LivingStar
 
22.04.13
13:54
нащел функцию просклонять, но она нигде не используется в конфигурации, непонятно что за компонента???
|
// Функция склоняет переданую фразу
// Параметры:
//  Фраза (обязательный), тип строка
//   Параметр должен содержать фразу. Каждое слово фразы будет просклонено отдельно
//
//  Падеж (обязательный), тип число
//   Падеж, в который необходимо поставить ФИО.
//   1 - Именительный
//   2 - Родительный
//   3 - Дательный
//   4 - Винительный
//   5 - Творительный
//   6 - Предложный
//
Функция Просклонять(Компонента, Знач Фраза = "", Падеж = 1, Пол = Неопределено, Результат) Экспорт
   
   Если Компонента = Неопределено Тогда
       Возврат Ложь;
   КонецЕсли;
   
   Результат = "";
   
   #Если Клиент Тогда
       
   МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Фраза, " ");
   
   // Выделим первые 3 слова, так как компонента не умеет склонять фразу большую 3х символов
   НомерНесклоняемогоСимвола = 4;
   Для Номер = 1 По Мин(МассивСтрок.Количество(), 3) Цикл
       Если Не РегламентированнаяОтчетность.ФИОНаписаноВерно(МассивСтрок[Номер-1], Истина) Тогда
           НомерНесклоняемогоСимвола = Номер;
           Прервать;
       КонецЕсли;

       Результат = Результат + ?(Номер > 1, " ", "") + МассивСтрок[Номер-1];
   КонецЦикла;
   
   Если ПустаяСтрока(Результат) Тогда
       Результат = Фраза;
       Возврат Ложь;
   КонецЕсли;
   
   Попытка
       Если Пол = Перечисления.ПолФизическихЛиц.Мужской Тогда
           Результат = Компонента.Просклонять(Результат, Падеж, 1) + " ";
           
       ИначеЕсли Пол = Перечисления.ПолФизическихЛиц.Женский Тогда
           Результат = Компонента.Просклонять(Результат, Падеж, 2) + " ";
           
       Иначе
           Результат = Компонента.Просклонять(Результат, Падеж) + " ";
           
       КонецЕсли;
       
   Исключение
       Результат = Фраза;
       Возврат Ложь;
       
   КонецПопытки;
   
   // Остальные символы добавим без склонения
   Для Номер = НомерНесклоняемогоСимвола По МассивСтрок.Количество() Цикл
       Результат = Результат + " " + МассивСтрок[Номер-1];
   КонецЦикла;
   
   Результат = СокрЛП(Результат);
   
   Возврат Истина;
   
   #Иначе
       
   Возврат Ложь;
   
   #КонецЕсли
   
КонецФункции // Просклонять()
5 Wobland
 
22.04.13
13:55
+(2) и возможность ввода строк "склон", "падеж"
6 Cube
 
22.04.13
13:56
(4) В ЗиУП используется, как минимум.
7 LivingStar
 
22.04.13
14:00
(6) как ей пользоваться? что передавать в параметрах?
8 floody
 
22.04.13
14:04
в каментах разве не про это?
9 Maxus43
 
22.04.13
14:06
дарю красивые:

Функция глПадеж(Знач Фио, Падеж = 1 ) Экспорт
   // Фио - фамилия имя отчество например Железняков Юрий Юрьевич, Бибик Иван Андреевич, Галушка Виктор Михайлович
   // Падеж  
   // 2 - родительный  ( нет кого?  )
   // 3 - дательный    ( кому?      )
   // 4 - винительный  ( вижу кого? )
   // 5 - творительный ( кем?       )  
   // 6 - предложный   ( о ком?     )
   // возвращает
   // Если Падеж =2 Железнякова Юрия Юрьевича     Бибика Ивана Андреевича    Галушки Виктора Михайловича
   //             3 Железнякову Юрию Юрьевичу     Бибику Ивану Андреевичу    Галушке Виктору Михайловичу
   //             4 Железнякова Юрия Юрьевича     Бибика Ивана Андреевича    Галушку Виктора Михайловича
   //             5 Железняковым Юрием Юрьевичем  Бибиком Иваном Андреевичем Галушкой Виктором Михайловичем
   //             6 Железнякове Юрие Юрьевиче     Бибике Иване Андреевиче    Галушке Викторе Михайловиче
   // Бибик Галушка Цой Николайчик Наталия Петровна Герценберг
   Перем Z604,Z605,Z607,Z608,Z617,Z616, Пол;
   Фио = СокрЛП(Фио);
   Пол = Прав(СокрЛП(Фио), 1);
   Найти_ = Find(Фио," ");
   z608 = Найти_ - 1;
   Result = Сред(Фио,1,Z608);
   Z607 =Сред(Result,Z608, 1);
   Z616 = Сред( Result ,Z608 -1, 2);
   z609 = Сред(Result,Z608-2,3);
   Result =?( ( ( Z616="ой") или (Z616="ый") или (Z616="ий") или (Z616="рг") ) и (Пол <> "а") ,
   ?(Найти( "Цц", Сред( Result ,Z608 -2, 1) )<>0, Сред(  Result,1, Z608- 1)+ Сред("я ю я еме",Падеж*2-3,2) , ?( (Z616="рг") , Result+ Сред("а у а оме",Падеж*2-3,2), Сред(  Result,1, Z608- 2) + Сред("огоомуого" + ?((Z616="ий")или(z609="гой")или(z609="хой"),"им ","ым ")+"ом",Падеж*3-5,3))) ,
   ?(((Z607="в")или(Z607="т")или(Z616="ик")или(Z616="ах")или(Z616="ин")или(Z616="ын")или(Z616="юк")или(Z616="им")или(Z616="ак"))и(Пол<>"а"),Result+Сред("а у а "+?((Z616="ик")или(Z616="ах")или(Z616="им")или(Z616="юк")или(Z616="ак"),"ом","ым")+"е",Падеж*2-3,2),?(((Z607="а")или(Z616="ая"))и(z609<>"ула"),Лев(Result,Z608-?(Z616="ая",2,1))+Сред(?(Z616="ка","и е у ойе","ойойу"+?(z616="ая","ю"," ")+"ойой"),Падеж*2-3,2),Result)));
   Z604=""; Z605="";
   Если z608<> -1 Тогда
       НайтиОтчество = Найти( Сред(Фио, Найти_+ 1,100)," ");
       Найти_ = Найти_ + НайтиОтчество;
       Z604 = Сред( Фио , Z608 + 2 , Найти_ - Z608 - 2);
       Если z604<>"" Тогда
           Z617 = Прав( Z604, 1 );
           Z604 = ?( (Z617 = "а") или (Z617 = "й") или (Z617 = "ь") или (Z617 = "я"),
           Лев( Z604, СтрДлина(Z604) - 1) + ?( ( ( Сред( Z604, СтрДлина(z604) - 1, 1) = "г" ) и (Падеж=2 ) ) или ( Сред( Z604, СтрДлина(z604) - 2, 2) = "ли" ) и (Падеж=6 ) , "и",Сред( Сред(  ?( (Z607="а") или (Пол="а") ,"ыяииеюи"+?(Прав(Z604,2 )="ия","и","е")+"уяьюоеьеееие" ,  "ыяяиеююеуяяюоеееееее"), Падеж*4 - 7, 4) , Найти( "айья", Z617), 1) ) +
           ?( Падеж =5, Сред( ?(Z607="а", "ймюй", "йммй") , Найти( "айья", Z617), 1),""),
           ?(Прав(Z604, 2)="ел", Лев(Z604,СтрДлина(Z604)-2) +"л", ?(Прав(Z604, 2)="ев", Лев(Z604,СтрДлина(Z604)-2) +"ьв", Z604)) + ?((Прав(Z604, 1)<>".") и (Прав(Z604, 3)<>"жан") , Сред("а у а оме", Падеж* 2 - 3, 2 ), "")) ;
       КонецЕсли;        
       Если НайтиОтчество <> 0 Тогда
           Z605 = Сред( Фио , Найти_ +1 , СтрДлина(Фио) );
           Z605 = СокрЛП(Z605);
           Z605 = ?(Пол="а" , Сред(Z605,1, СтрДлина(Z605)-1)+ Сред("ы е у ойе", Падеж* 2 - 3, 2 ), ?( Пол="ч", Z605+ Сред("а у а еме", Падеж*2 - 3, 2), z605));
       КонецЕсли;    
   КонецЕсли;
   Возврат СокрП( Result ) + " " + СокрП( Z604) + " " + СокрП( Z605)
КонецФункции // Падеж(Фио, Падеж = 1 )
//----------------------------------------------------
// 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)));
   zf=?((zd=9)или((z4=3)и(Прав(z1,1)="ы")),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,Знач z3="*",z4=0)
//_____________________________________________________________________________
// 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) Экспорт
   z6=Нрег(Прав(СокрП(z1),4));
   z7=Прав(z6,1);
   Возврат?(z5<4,глПадежФИО(СокрЛП(СтрЗаменить(Сред(z1,Найти(z1+" "," ")+1),".",". ")),z2,z3,СтрЗаменить(z4,z5,глПадежС(?((z5=3)и(z7="ы"),z1,Лев(z1,Найти(z1+" "," ")-1)),z2,Сред("ча"+z7,?(z3=3,?(z6="оглы",1,?(z6="кызы",1,3)),z3),1),z5)+" "),z5+1),z4);
КонецФункции //глПадежФИО(z1,z2=2,z3=3,z4="123",z5=1)

Функция глПадежП(Знач z1,Знач z2,z3=0) Экспорт
   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)))));
КонецФункции //глПадежП(Знач z1,Знач z2,z3=0)                
(с)
10 GANR
 
22.04.13
14:06
11 LivingStar
 
22.04.13
14:08
СПАСИБО!!!
12 LivingStar
 
22.04.13
14:23
(10) Серафим Серафимыч Серафимский, первая склоняет как Серафима Серафимыча Серафимскийа
|
ПадежФИО( Выборка.Фамилия + " " + Выборка.Имя + " " + Выборка.Отчество ,2,Ложь)
13 LivingStar
 
22.04.13
14:28
досадно, но (9) тоже не полноценно склоняет, или я пример дубовый привел?
14 LivingStar
 
22.04.13
14:29
дубовый пример привел видимо в самом фио
15 hardsign
 
22.04.13
14:43
(12)
во-первых, Серафим СерафимОВИЧ Серафимский
во-вторых, ясно же написано = фамилия, потом имя, а потом отчество... Вы зачем порядок поменяли наоборот?:)

попробуйте Серафимский Серафим Серафимович - все верно склоняет
16 hardsign
 
22.04.13
14:44
(9) Спасибо, все работает, забрал:) Очень полезно.
17 LivingStar
 
22.04.13
14:50
да спасибо, все супер !!!
18 sda553
 
22.04.13
15:02
Закладка