|
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 минут любые строки приводятся к единому формату.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |