Имя: Пароль:
1C
1С v8
8.2. Строку с ФИО разобрать по отдельности. Как сделать одной функцией?
0 loonypy
 
16.12.11
17:17
Например, "Петров Иван Михайлович". Нужно разобрать по полям: Фамилия, Имя, Отчество.
Функции 1с не позволяют вернуть несколько значений. Как быть?
1 Живой Ископаемый
 
16.12.11
17:18
о... не позволяет несколько
2 Марина Викторовна
 
16.12.11
17:18
структуру возвращать?
3 1nf
 
16.12.11
17:19
Структура там какую заюзать, не?
4 Живой Ископаемый
 
16.12.11
17:19
5 1nf
 
16.12.11
17:24
автор, ну ты там не пропадай, скажи для разнообразия что тебе структуры и массивы не подходят, а то до сотки не дотянем
6 loonypy
 
16.12.11
17:33
>>структуру возвращать
не подумал.
Буду структуру использовать, не массив.
Всем спасибо за подсказку.

>>автор, ну ты там не пропадай, скажи для разнообразия что тебе структуры и массивы не подходят, а то до сотки не дотянем
Да вот, не судьба. Будет время в политике накатаю пост, тогда точно дотянем.
7 rs_trade
 
16.12.11
17:34
(4) и не лень же скриншоты с роликами делать каждый раз
8 Живой Ископаемый
 
16.12.11
17:38
2(7) лозунг этой фишки - "говори меньше, скажи больше"
я его разделяю.
9 zak555
 
16.12.11
17:41
(0) конфа ?
10 zak555
 
16.12.11
17:49
// Функция формирует фамилию и инициалы либо по наименованию элемента спр-ка ФизическиеЛица
//  либо по переданным строкам.
//  Если передан Объект, то извлеченная из него строка считается совокупностью
//  Фамилия + Имя + Отчество, разделенными пробелами.
//
// Параметры
//  Объект        - строка или ссылка или объект элемента спр-ка ФизическиеЛица.
//  Фамилия        - фамилия физ. лица.
//  Имя            - имя физ. лица.
//  Отчество    - отчество физ. лица.
//
// Возвращаемое значение
//  Фамилия и Инициалы одной строкой. Побочные эффекты - переданная целая строка
//  Побочные эффекты - переданная целая строка разбивается на подстроки, соответствующие
//  отдельным Фамилии,Имени и Отчеству
//
Функция ФамилияИнициалыФизЛица(Объект = "", Фамилия = " ", Имя = " ", Отчество = " ") Экспорт

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

КонецФункции
11 zak555
 
16.12.11
17:52
хотя по хорошему надо брать из РС
12 loonypy
 
16.12.11
17:57
Кроме пробелов могут быть точки и всякие не буквенные символы. Например:
Малышева Ольга Юрьевна*
13 Живой Ископаемый
 
16.12.11
17:58
(12) м... Функция обязана выполняться например на стороне сервера который работает на Линуксе, или на Винде под сильно ограниченным юзером?
14 zak555
 
16.12.11
17:58
(12) см. в (9)
15 loonypy
 
16.12.11
18:06
>>Функция обязана выполняться например на стороне сервера который работает на Линуксе, или на Винде под сильно ограниченным юзером?
16 Живой Ископаемый
 
16.12.11
18:07
2(15) и какой ответ?
Если нет, и среда исполнения - обычная 32-битная винда, тогда вот:
http://screencast.com/t/JlpmqZTq2Fj



   RegExp = Новый COMОбъект("VBScript.RegExp");
   Результат = Новый Массив();
   
   RegExp.IgnoreCase = Ложь; //Игнорировать регистр
   RegExp.Global = Истина; //Поиск всех вхождений шаблона
   RegExp.MultiLine = Ложь; //Многострочный режим
   
   RegExp.Pattern = "(?:^|;)(\""(?:[^\""]+|\""\"")*\""|[^;]*)"; //вот наш супер шаблон
   //RegExp.Pattern = ";|;|;|;|;;|;|;|;|;|;|;|;|;;|;|;"; //вот наш супер шаблон
   Matches=RegExp.Execute(Стр);
   ЧислоВхождений=Matches.Count();
   //Сообщить(Стр,СтатусСообщения.Важное);
   Если ЧислоВхождений>0 Тогда
       Для к = 0 По ЧислоВхождений-1 Цикл
           Match = Matches.Item(к);
           
           SubMatches = Match.SubMatches;
           ЧислоПодвыражений=SubMatches.Count();
           Для н = 0 По ЧислоПодвыражений-1 Цикл
               SubMatch=SubMatches.Item(н);
               Если SubMatch="" Тогда
                   //Продолжить;
               КонецЕсли;    
               Результат.Добавить(SubMatch);
               //Сообщить("Подстрока: "+SubMatch);
           КонецЦикла;    
       КонецЦикла;
   Иначе
       //Сообщить("Вхождений шаблона не найдено");
   КонецЕсли;
   Возврат Результат;



Шаблон нужно доработать, потому что у меня он умеет только именно знаки препинания
17 loonypy
 
16.12.11
18:09
ой. Конфа на том же компьютере, что и эта функция. Винда, права вроде не сильно урезаны. А что, какие-то нюансы есть? Скорость работы?

>>см. в
Нашел описание РазложитьСтрокуВМассивПодстрок.
18 zak555
 
16.12.11
18:09
(16) так в типовых фио хранится по отдельности в рс
зачем мудрить ?
19 Живой Ископаемый
 
16.12.11
18:10
2(17) множество! тысячи их... не скорость, а вообще принципиальная возможность работы или не работы
20 loonypy
 
16.12.11
18:14
>>так в типовых фио хранится по отдельности в рс
зачем мудрить ?
Загрузить с экселя надо, а там каша. Потом еще строку с датой конвертить в дату придется, а там и через пробел, и через -.
21 Живой Ископаемый
 
16.12.11
18:15
а что, файлов много? если один, то может сначала обработать все в Екселе?
22 loonypy
 
16.12.11
18:43
>>а что, файлов много? если один, то может сначала обработать все в Екселе?
файлов 2, в каждом туча записей.
Про RegExp в гугле читаю. Однако не кислый размах - подключать что-то внешнее по отношению к платформе для своих нужд. Или мне только кажется, что это не такие уж и большие накладные расходы?
23 Живой Ископаемый
 
16.12.11
18:45
2(22) дык потому и спрашиваю об условиях и повторяемости... у меня этот код постоянно нужен потому что клиент-банк выгружает файл ЦВС... если все это нужно однажды - то ну этот РегЭксп, ексель сам сможет все сделать.
24 loonypy
 
16.12.11
19:08
>>ексель сам сможет все сделать.
Начальник говорит, что эта выгрузка нужна только на один раз, но вот количество строк в этих файлах очень много. Так что, если вы про ручную обработку, то это не подходит.  
Нашел описание "РазложитьСтрокуВМассивПодстрок". Там только на один разделитель проверяет. В моем примере разделителей может быть несколько.
25 catena
 
16.12.11
19:31
(24) Мы не ищем легких путей? Ради одного раза я бы в екселе контрл+H - максимум за 10 минут любые строки приводятся к единому формату.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс