Склонение ФИО в СКД

1. Zhest 21 07.09.17 13:16 Сейчас в теме
Добрый день! Знаю, что можно использовать стандартные функции общего модуля в СКД. Как правильно можно просклонять ФИО? В СхемеКомпановкиДанных заполнен макет с параметрами.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AllexSoft 07.09.17 13:44 Сейчас в теме
А в чем конкретно вопрос? не знаете как запустить процедуру общего модуля из СКД? или проблема с компонентой склонения? или нужно готовое решение?
+
3. spe1c 5 07.09.17 14:19 Сейчас в теме
Надо именно в СКД склонять? Заранее подготовить данные где-то в регистре не вариант? Просто такое склонение может существенно подтормозить отчет.
+
4. starik-2005 3036 07.09.17 14:27 Сейчас в теме
(3) самое простое - вывести без склонения, потом уже результат компоновки (сам макет получившийся) пробежать и просклонять. ИМХО, есть какая-то типовая функция, которая это умеет делать, но точно не помню. А уж в какой ячейке макета ФИО определить, полагаю, несложно. Ну и лично я бы для скорости вызывал бы создание компоненты вне цикла, а внутри цикла просто бы делал что-то такое:
  Результат.Область(нс, нк).Текст = КомпоннентаСклонения.Просклонять(Результат.Область(нс, нк).Текст, Падеж);
+
5. Zhest 21 08.09.17 08:35 Сейчас в теме
В СКД склонять совсем не обязательно. Но как тогда в модуле отчета получить результат ФИО и его просклонять? Текст модуля привожу

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь; // Отключаем стандартную обработку 
	Настройки = КомпоновщикНастроек.Настройки; // Получаем настройки отчета 
	
	// Изменяем отборы по пользовательским настройкам
	ТаблицаОтборов = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
	Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл		
		НайденнаяПользовательскаяНастройка = 
			ТаблицаОтборов.Найти(ЭлементОтбора.ИдентификаторПользовательскойНастройки);		
		Если НайденнаяПользовательскаяНастройка <> Неопределено Тогда
			ЭлементОтбора.ВидСравнения = НайденнаяПользовательскаяНастройка.ВидСравнения;
			ЭлементОтбора.Использование = НайденнаяПользовательскаяНастройка.Использование;
			ЭлементОтбора.ПравоеЗначение = НайденнаяПользовательскаяНастройка.ПравоеЗначение;
		КонецЕсли;		
	КонецЦикла;
		
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;      		
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;    	
	
	// Создаем макет компоновки данных
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	МакетКомпоновки = 
		КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	// Инициализируем процессор компоновки
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	
	ДокументРезультат.Очистить();
	
	// Получаем дополнительный макет с описанием вывода логотипа
	МакетЛоготип = ПолучитьМакет("Макет"); 
	
	// Получаем область логотипа
	Область = МакетЛоготип.ПолучитьОбласть("Логотип");
	ДокументРезультат.Вывести(Область);
	
	// Выводим результат отчета в табличный документ "ДокументРезультат"
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);		
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
				
КонецПроцедуры
Показать
+
6. Redinternational 86 08.09.17 10:22 Сейчас в теме
Функции для склонения.

Функция ПадежС(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)));
  
  //!!! Исключения
  Если z1 = "ООО" Тогда 
	  Возврат z1;
  КонецЕсли;
  
  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);
Возврат ?(""=z1,"",?(z4>0,Лев(zf,1)+?((z2<0)и(z4>1),".",Сред(zf,2)),zf)+z6);

КонецФункции
//__________________________________________________________­___________________
// 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));
	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,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)))));
Возврат ?((z6="ая")или(Прав(z6,1)="а"),ПадежС(z5,z2,z7,1)+" "+ПадежС(Сред(z1,z4),z2),ПадежС(z5,z2,"ч",1)+?((z6="ий")и(Найти(z1," ")=0),""," "+?(z7="1",ПадежП(Сред(z1,z4),z2,Число(z7)),Сред(z1,z4))));
	
КонецФункции
Показать
+
7. Denis_CFO 48 08.09.17 10:28 Сейчас в теме
(6) Было бы хорошо автора упомянуть: © Jurer Production. А то некрасиво получается...
Redinternational; +1
8. Redinternational 86 08.09.17 12:29 Сейчас в теме
(7)Все верно! Функции написаны не мной. Одним хорошим человеком, имя его неизвестно.
+
9. user633533_encantado 11 08.09.17 12:34 Сейчас в теме
Можно, если отчет не очень тормозной сначала определить список всех физ. лиц выполнив отчет и выгрузив его в таблицу значений.
Просклонять их как надо и засунуть склонения в другую таблицу значений, которую в свою очередь засунуть в скд в виде внешнего источника данных.
+
10. Zhest 21 08.09.17 13:41 Сейчас в теме
Функция склонения и так уже есть. Вопрос, как ее вызвать в СКД?
+
12. Zhest 21 08.09.17 13:51 Сейчас в теме
(11), Спасибо! Сейчас попробую!
Nogar; +1
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот