HelpF.pro

Как разобрать "наименование" сотрудника Ф.И.О. на Фамилию и инициалы сотрудника?

Код 1C v 7.x
 
Функция глРазложить(Знач Стр, Разделитель = ",") Экспорт
	СЗ = СоздатьОбъект("СписокЗначений");
	Если Разделитель = " " Тогда
		Стр = СокрЛП(Стр);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				СЗ.ДобавитьЗначение(Стр);
				Возврат СЗ;
			КонецЕсли;
			СЗ.ДобавитьЗначение(Лев(Стр,Поз-1));
			Стр = СокрЛ(Сред(Стр,Поз));
		КонецЦикла;
	Иначе
		ДлинаРазделителя = СтрДлина(Разделитель);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				СЗ.ДобавитьЗначение(Стр);
				Возврат СЗ;
			КонецЕсли;
			СЗ.ДобавитьЗначение(Лев(Стр,Поз-1));
			Стр = Сред(Стр,Поз+ДлинаРазделителя);
		КонецЦикла;
	КонецЕсли;
КонецФункции 

Функция ФамилияИмяОтчество(Объект,Фамилия="",Имя="",Отчество="") Экспорт
    
	Если ТипЗначения(Объект)=2 Тогда
		ФИО = глРазделить(СокрЛП(Объект),",");
	Иначе
		ФИО = глРазделить(СокрЛП(Объект.Наименование),",");
	КонецЕсли;                             
	ФИО = глРазложить(ФИО," ");
	Фамилия = ""; Имя = ""; Отчество = "";
	Если ФИО.РазмерСписка() > 0 Тогда
		Фамилия = ФИО.ПолучитьЗначение(1);
		Если ФИО.РазмерСписка() > 1 Тогда
			Имя		= ФИО.ПолучитьЗначение(2);
			Если ФИО.РазмерСписка() > 2 Тогда 
				// а вот отчество бывает и не из одного слова				
				Для Сч = 3 По ФИО.РазмерСписка() Цикл
					Отчество = Отчество + ФИО.ПолучитьЗначение(Сч) + " ";
				КонецЦикла;
				Если ПустоеЗНачение(Отчество) = 0 Тогда
					Отчество = Лев(Отчество,СтрДлина(Отчество)-1);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Фамилия+?(ПустоеЗначение(Имя)=0," "+Лев(Имя,1)+"."+?(ПустоеЗначение(Отчество)=0,Лев(Отчество,1)+".",""),"")

КонецФункции



Код 1C v 8.х
 
Функция глРазложить(Знач Стр, Разделитель = ",") Экспорт
	СЗ = Новый СписокЗначений;
	Если Разделитель = " " Тогда
		Стр = СокрЛП(Стр);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				СЗ.Добавить(Стр);
				Возврат СЗ;
			КонецЕсли;
			СЗ.Добавить(Лев(Стр,Поз-1));
			Стр = СокрЛ(Сред(Стр,Поз));
		КонецЦикла;
	Иначе
		ДлинаРазделителя = СтрДлина(Разделитель);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				СЗ.Добавить(Стр);
				Возврат СЗ;
			КонецЕсли;
			СЗ.Добавить(Лев(Стр,Поз-1));
			Стр = Сред(Стр,Поз+ДлинаРазделителя);
		КонецЦикла;
	КонецЕсли;
КонецФункции 

Функция РазборФИО(Сотрудник)
	ФИО = глРазложить(Сотрудник," ");
	Фамилия = ""; Имя = ""; Отчество = "";
	Если ФИО.Количество() > 0 Тогда
		Фамилия = Строка(ФИО.Получить(0));
		Если ФИО.Количество() > 1 Тогда
			Имя		= Строка(ФИО.Получить(1));
			Если ФИО.Количество() > 2 Тогда 
				// а вот отчество бывает и не из одного слова				
				Для Сч = 2 По ФИО.Количество()-1 Цикл
					Отчество = Отчество + Строка(ФИО.Получить(Сч)) + " ";
				КонецЦикла;
				Если ЗначениеЗаполнено(Отчество) Тогда  
					Отчество = Лев(Отчество,СтрДлина(Отчество)-1);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
Возврат Фамилия+?(ЗначениеЗаполнено(Имя)," "+Лев(Имя,1)+"."+?(ЗначениеЗаполнено(Отчество),Лев(Отчество,1)+".",""),"")
КонецФункции
   


Обязательно посмотрите более краткий вариант!
)
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/39.html