Имя: Пароль:
1C
1С v8
Покритикуйте код
0 SeregaMW
 
08.09.11
09:50
а=0;
ФамилияФлаг=0 ;
ФлагОтчества = 0;
захват =0;
Пока а< 50 Цикл  
   а=а+1;
   ФамилияСотр = Сред(Автор.Сотрудник.Наименование,а,1);    
   Если (ФамилияСотр=" ") и (ФамилияФлаг=0)тогда
       ФамилияФлаг=1;
       Фамилия = Лев(Автор.Сотрудник.Наименование,а-1);
       Имя= Сред(Автор.Сотрудник.Наименование,а+1,1);
   КонецЕсли;
   Если (ФамилияСотр=" ") тогда
       ФлагОтчества = ФлагОтчества+1;
   КонецЕсли;
   Если (ФлагОтчества =2) и (захват =0) тогда
       Отчество =  Сред(Автор.Сотрудник.Наименование,а+1,1);
       захват =1;
   КонецЕсли;
КонецЦикла;    
ОбластьМакета.Параметры.Сотрудник = Фамилия+" "+Имя+". "+Отчество+".";
1 Maxus43
 
08.09.11
09:51
велосипед? Разложить строку на массив подстрок давно придуман в типовых
2 butterbean
 
08.09.11
09:52
код гамно
3 asady
 
08.09.11
09:53
а=0;
ФамилияФлаг=0 ;
ФлагОтчества = 0;
захват =0;
Сотр=Автор.Сотрудник;
Наим = Сотр.Наименование;
Пока а< 50 Цикл  
   а=а+1;
   ФамилияСотр = Сред(Наим,а,1);    
   Если (ФамилияСотр=" ") и (ФамилияФлаг=0)тогда
       ФамилияФлаг=1;
       Фамилия = Лев(Наим,а-1);
       Имя= Сред(Наим,а+1,1);
   КонецЕсли;
   Если (ФамилияСотр=" ") тогда
       ФлагОтчества = ФлагОтчества+1;
   КонецЕсли;
   Если (ФлагОтчества =2) и (захват =0) тогда
       Отчество =  Сред(Наим,а+1,1);
       захват =1;
   КонецЕсли;
КонецЦикла;    
ОбластьМакета.Параметры.Сотрудник = Фамилия+" "+Имя+". "+Отчество+".";

это без разбора самого алгоритма - навскидку
4 Stepa86
 
08.09.11
09:53
в УПП есть:



// Функция формирует фамилию и инициалы либо по наименованию элемента спр-ка ФизическиеЛица
//  либо по переданным строкам.
//  Если передан Объект, то извлеченная из него строка считается совокупностью
//  Фамилия + Имя + Отчество, разделенными пробелами.
//
// Параметры
//  Объект        - строка или ссылка или объект элемента спр-ка ФизическиеЛица.
//  Фамилия        - фамилия физ. лица.
//  Имя            - имя физ. лица.
//  Отчество    - отчество физ. лица.
//
// Возвращаемое значение
//  Фамилия и Инициалы одной строкой. Побочные эффекты - переданная целая строка
//  Побочные эффекты - переданная целая строка разбивается на подстроки, соответствующие
//  отдельным Фамилии,Имени и Отчеству
//
Функция ФамилияИнициалыФизЛица(Объект = "", Фамилия = " ", Имя = " ", Отчество = " ") Экспорт

   ТипОбъекта = ТипЗнч(Объект);
   
   СписокТиповСсылок    = ОбщегоНазначенияПереопределяемый.ВернутьСписокТиповСсылокДляФормированияФИО();
   СписокТиповОбъектов    = ОбщегоНазначенияПереопределяемый.ВернутьСписокТиповОбъектовДляФормированияФИО();
   
   Если ТипОбъекта = Тип("Строка") Тогда
       ФИО = РазложитьСтрокуВМассивПодстрок(СокрЛП(Объект)," ");
       
   ИначеЕсли ТипОбъекта <> Тип("Неопределено") И (СписокТиповСсылок.СодержитТип(ТипОбъекта) Или СписокТиповОбъектов.СодержитТип(ТипОбъекта)) Тогда
       Если СписокТиповСсылок.СодержитТип(ТипОбъекта) Тогда

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

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

5 Segate
 
08.09.11
09:54
Нафег оно вообще нужно?
В типовой жеж есть все
6 Мимохожий Однако
 
08.09.11
09:54
(0)Потренируйся теперь с падежами без использования ВК от 1С.
7 Maxus43
 
08.09.11
09:55
мой гений дарит вам (с) Сирожа :

Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
   
   МассивСтрок = Новый Массив();
   Если Разделитель = " " Тогда
       Стр = СокрЛП(Стр);
       Пока Истина Цикл
           Поз = Найти(Стр,Разделитель);
           Если Поз=0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз-1));
           Стр = СокрЛ(Сред(Стр,Поз));
       КонецЦикла;
   Иначе
       ДлинаРазделителя = СтрДлина(Разделитель);
       Пока Истина Цикл
           Поз = Найти(Стр,Разделитель);
           Если Поз=0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз-1));
           Стр = Сред(Стр,Поз+ДлинаРазделителя);
       КонецЦикла;
   КонецЕсли;
   
КонецФункции // глРазложить
8 SeregaMW
 
08.09.11
09:57
(5) в АльфеАвто не нашел
9 Поручик
 
08.09.11
10:00
(8) Всё что вверху, шляпа. Учись
http://infostart.ru/public/71130/#Pro_bystrye_massivy
10 Fragster
 
гуру
08.09.11
10:03
кто-нидудь на govnokod.ru запостил уже?
11 asady
 
08.09.11
10:04
(10) чел учится - а ты его по рукам....
12 SeregaMW
 
08.09.11
10:07
(10) Предложи свой вариант!
13 butterbean
 
08.09.11
10:09
(12) ФИО = Автор.Сотрудник.Наименование;
ПозПрб = Найти(ФИО," ");
Фамилия = Лев(ФИО,ПозПрб - 1);
ФИО = Сред(ФИО, ПозПрб + 1);
Имя = Сред(ФИО,1);
ПозПрб = Найти(ФИО," ");
Отчество = Сред(ФИО,ПозПрб+1,1);
ОбластьМакета.Параметры.Сотрудник = Фамилия+" "+Имя+". "+Отчество+".";
14 Fragster
 
гуру
08.09.11
10:09
(12) в (9) очень быстрый вариант (сам использую), в типовых РазложитьСтрокуВМассивПодстрок кажися называется
15 Maxus43
 
08.09.11
10:09
(12) сравни производительность (0) и (7) кстати, погляди как оно
16 Jstunner
 
08.09.11
10:10
(7)


Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
   
   Т = Новый ТекстовыйДокумент;
   Т.УстановитьТекст(СтрЗаменить(Стр, Разделитель, Символы.ПС));
   М = Новый Массив;
   Для Н=1 По Т.КоличествоСтрок() Цикл
       М.Добавить(Т.ПолучитьСтроку(Н));
   КонецЦикла;
   Возврат М;
   
КонецФункции
17 sttt
 
08.09.11
10:11
Результат = СтрЗаменить(Имя, " ", Символы.ПС);

Сообщить(СтрПолучитьСтроку(Результат, 1)); // фамилия
Сообщить(СтрПолучитьСтроку(Результат, 2)); // Имя
Сообщить(СтрПолучитьСтроку(Результат, 3)); // Отчество
18 Stepa86
 
08.09.11
10:11
еси чо, разложение через ЗначениеИзСтрокиВнутр( не работает на тонком и веб клиентах
19 Fragster
 
гуру
08.09.11
10:12
(15) в (9) - вообще самолет, особенно когда тысячи кусков в строке... да, серийные номера через запятую в документах достались в наследство...
20 Maxus43
 
08.09.11
10:12
(16) это типовой УПП в (7)
21 Fragster
 
гуру
08.09.11
10:12
(18) написать &Сервер перед функцией не предлагать?
22 Stepa86
 
08.09.11
10:13
(21) я как раз намекаю, чтоб не забыли. Сам вот так написал:



Функция РазборСтроки(знач Стр, Разделитель = "," ) Экспорт
   
   #Если Не ( ТонкийКлиент ИЛИ ВебКлиент ) Тогда
       
       // РазбираемаяСтрока - строка исходного текста
       // Разделитель - разделитель элементов строки
       Возврат ЗначениеИзСтрокиВнутр("{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{0,{""S"",""" + СтрЗаменить(СтрЗаменить( Стр , """", """"""), Разделитель, """},{""S"",""") + """}}}");
       
       //более шустрое решение из http://infostart.ru/public/71130/
       
   #Иначе
       
       МассивЗначений = Новый Массив;
       
       Символ = Найти(Стр, Разделитель);
       
       Пока Символ > 0 Цикл
           
           МассивЗначений.Добавить(Лев(Стр, Символ - 1));
           
           Стр = Прав(Стр, СтрДлина(Стр) - Символ);
           
           Символ = Найти(Стр, Разделитель);
           
       КонецЦикла;
       
       МассивЗначений.Добавить(Стр);
       
       Возврат МассивЗначений;
       
   #КонецЕсли
   
КонецФункции

23 Fragster
 
гуру
08.09.11
10:14
(22) не, именно перед самой функцией
24 Fragster
 
гуру
08.09.11
10:14
&Сервер
Функция РазборСтроки(знач Стр, Разделитель = "," ) Экспорт
...
25 Fragster
 
гуру
08.09.11
10:14
и массивы и строки прекрасно ходят между клиентом и сервером
26 Stepa86
 
08.09.11
10:15
(23) это тогда бегание на сервер скушать может весь эффект, да и расположена она у меня в общем модуле + в Толстом то работает
27 Fragster
 
гуру
08.09.11
10:16
(26) поверь мне, не скушает, если (19), например... для (0) - пофиг, да
28 Maxus43
 
08.09.11
10:17
(24) тогда уж внеконтекстный вызов надо
29 Fragster
 
гуру
08.09.11
10:18
(28) внеконтекстный на тонко клиенте ошибку выдаст
30 Stepa86
 
08.09.11
10:18
(27) регэкспами не пробовал строку разбивать? интересно шустрее или медленнее они, чем (9)
31 Fragster
 
гуру
08.09.11
10:18
(30) медленнее, я пробовал
32 Fragster
 
гуру
08.09.11
10:19
если что - регэксп был
"[^"+Разделитель+"]+"