Имя: Пароль:
1C
 
8.2 поделитесь функцией...
0 Aswed
 
04.08.10
11:37
...преобразующей ФИО в Инициалы.
1 levlvov
 
04.08.10
11:40
Функцыя ФИОВИнициалы(ФИО)
   Возврат Сред(ФИО, 1, 1) + ". " + Сред(ФИО, 2, 1) + ". " + Сред(ФИО, 3, 1) + ".";
КонецФункцыи
2 Лефмихалыч
 
04.08.10
11:41
что должна возвращать функция, если ФИО = "Абасов Кулам-Али Гусейн-оглы" или "Тем-оглы Боурамали Эли Оглы"
PS А меж тем, это реально существующие люди
3 Лефмихалыч
 
04.08.10
11:42
Нам-Чан-Гук Инна Александровна
Петров-Водкин Кузьма Сергеевич
:)
4 rrunover
 
04.08.10
11:42
(1) О_о оно реально работать будет?
5 rrunover
 
04.08.10
11:43
+(4) а хотя...  функция возвращает именно то, что указано в техзадании :D
6 AlecoZAV
 
04.08.10
11:44
(1) а поиск первых символов?
7 Aswed
 
04.08.10
11:45
(1) Я такую сам бы написать мог легко))))))
8 levlvov
 
04.08.10
11:46
(7) ну так не написал же
9 Aswed
 
04.08.10
11:46
А никто не писал функцию с анализом Пола ФИО?
Задумка есть как всё это реализовать и сложного там ничего нет, но писать много и лень этой фигнёй страдать)
10 almar
 
04.08.10
11:47
ПозПервогоПробела=Найти(Сотрудник.Наименование," ");
   ИмяОтчество=СокрЛП(Сред(Сотрудник.Наименование,ПозПервогоПробела));
11 levlvov
 
04.08.10
11:48
(9) такая функция у г1с уже есть
12 Aswed
 
04.08.10
11:48
(8) )))))
Я что нить посерьёзней хотел, что бы был вариант обработки сложных фамилий, пример в (2)

А то у нас лиц не совсем русской национальонсти полным полно, и у них такие извращённые фамилии. С ними проблем будет куча.

ЗЫ А за код спасибо конечно)
13 almar
 
04.08.10
11:48
(9) Если отчество заканчивается на "а" или "кызы", то это женщина. Чего там много писать?
14 kosts
 
04.08.10
11:49
А так же бывают люди у которых нет отчества.
15 Лефмихалыч
 
04.08.10
11:50
(10) одной Малла Хусейн Оглы Нария Мухидиновна хватит, чтобы трындец твой функции приключился :)
16 almar
 
04.08.10
11:51
(14) Обычно такие функции нужны в некритичных случаях, например, чтобы программа написала "Уважаемая" а не "Уважаемый(ая)". Для нерусских непринципиально. :)
17 levlvov
 
04.08.10
11:52
(15)+ или например ван Бастен
18 Aswed
 
04.08.10
11:53
(13) Там много писать с обработкой сложных фамилий
Мухамед-Оглы например.
19 Лефмихалыч
 
04.08.10
11:53
(16) большая часть из упомянутых - русские люди, я практически уверен в этом :)
20 aka AMIGO
 
04.08.10
11:54
для 7-ки у меня есть
для 8-ко - нет :)
21 Aswed
 
04.08.10
11:54
(16) ))))
22 levlvov
 
04.08.10
11:55
(0) кароче, вместо функции надо писать целую конфигурацию и дергать преобразование из нее через ком соединение...
23 Aswed
 
04.08.10
11:55
(16) Там как раз критично. Тело договора о купле продажи. В теле договора полностью ФИО со склонениями, а в подписях на каждой странице Фамилия и инициалы.
24 aka AMIGO
 
04.08.10
11:55
(16) "Уваж." спасет отцов.. и матерей русской демократии :)
25 AlecoZAV
 
04.08.10
11:55
(16) Уважаемое?
26 almar
 
04.08.10
11:56
(18) Оглы - мужчина, Кызы - женщина. Мухамед Оглы скорее всего это не фамилия, а отчество :)
27 Лефмихалыч
 
04.08.10
11:56
Некоторые вещи лучше не делать за пользователя...
28 Лефмихалыч
 
04.08.10
11:57
(26) там, кагбэ, как в паспорте написано, так оно и есть, даже не смотря на то, что Оглы - это мужчина, такие дела :)
29 aka AMIGO
 
04.08.10
11:57
вообще-то достаточно просто решается разложением в СЗ по пробелам, (кои надо преобразовать из двух-в-один),
а потом из СЗ брать первый символ, подставлять точку
30 stangen
 
04.08.10
11:58
ФИО = "Абасов Кулам-Али Гусейн-оглы";
   Сообщить(Лев(ФИО,1)+Сред(ФИО,Найти(ФИО," ")+1,1)+Сред(Сред(ФИО,Найти(ФИО," ")+1,СтрДлина(ФИО)-1),Найти(Сред(ФИО,Найти(ФИО," ")+1,СтрДлина(ФИО)-1)," ")+1,1));

АКГ

=)
31 aka AMIGO
 
04.08.10
11:59
Вот такое у меня работает:
Функция ПолучитьФИО(Автор)
   
   Автор = СтрЗаменить(Автор, "  "," ");
   СЗАвт = СоздатьОбъект("СписокЗначений");
   СЗАвт = глРазложить(Автор," ");
   Автор = СЗАвт.ПолучитьЗначение(1);
   Если СЗАвт.РазмерСписка()>1 Тогда
       Автор = Автор+" " + Врег(Лев(СЗАвт.ПолучитьЗначение(2),1)) +".";
   КонецЕсли;
   Если СЗАвт.РазмерСписка()>2 Тогда
       Автор = Автор+" " + Врег(Лев(СЗАвт.ПолучитьЗначение(3),1)) +".";
   КонецЕсли;
   Возврат Автор;
КонецФункции
32 НП
 
04.08.10
12:03
А вот из семерки (очень старой)

Функция ФИО(ПолнИмя) Экспорт
   // позиция первого пробела
   ПервПроб = Найти(ПолнИмя," ");
   Если ПервПроб=0 Тогда
       Возврат ПолнИмя;
   Иначе
       Фамилия = Лев(ПолнИмя,ПервПроб);
       ИО = Сред(ПолнИмя,ПервПроб+1);
       ИО = СокрЛ(ИО);
       Имя = Лев(ИО,1)+".";
       // позиция второго пробела
       ВтПроб = Найти(ИО," ");
       Если ВтПроб=0 Тогда
           Возврат Фамилия+Имя;
       Иначе
           Возврат Фамилия+Имя+" "+Лев(СокрЛ(Сред(ИО,ВтПроб+1)),1)+".";
       КонецЕсли;
   КонецЕсли;
КонецФункции    //ФИО
33 Лефмихалыч
 
04.08.10
12:03
(30) "ЧЕН Ю-СЮ АЛЕКСАНДР БОРИСОВИЧ" и "Прожогина Киреева Анна Валентиновна"
ФИО, раз нужны по отдельности, должны вводиться по отдельности. Это как с адресом - хочешь порядок, выбирай из классификатора
34 stangen
 
04.08.10
12:06
(33) а как тогда? ЧЮАБ И ПКАВ? тогда можно в цикле собирать пробелы)
35 kosts
 
04.08.10
12:07
(31) Это медленная функция. Из-за создания объекта.
36 aka AMIGO
 
04.08.10
12:09
(35) если объект в гм-экспорт - то будет быстро соображать.
37 Aswed
 
04.08.10
12:17
(31) Вот
адаптировал под 8.2 (но и в 8.1 работать будет)

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


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

Кому надо берите.

ЗЫ А сложные фамилии буду обрабатывать методом накопления и сравнения, пирйдётся писать механизм в котором пользователи должны будут сами вводить ФИО и инициалы к ней а потом всё это анализировать.
38 sash-ml
 
04.08.10
12:37
более простое разложение строк на подстроки чем в (37)



Функция СтрокуВСписок(Стр1,Раздел)
   Стр=СтрЗаменить(Стр1,Раздел,Символы.ПС);
   ЧислоСтрок=СтрЧислоСтрок(Стр);
   СписокСтрок=Новый СписокЗначений;
   Если ЧислоСтрок>0 Тогда
       Для н=1 ПО ЧислоСтрок Цикл
           СписокСтрок.Добавить(СтрПолучитьСтроку(Стр,н));
       КонецЦикла;      
   КонецЕсли;
   Возврат СписокСтрок;
КонецФункции
39 Kreont
 
04.08.10
12:43
Мне вот интересно, а сам он "Тем-оглы Боурамали Эли Оглы" знает как инициалы его записать? :)
Основная теорема систематики: Новые системы плодят новые проблемы.