Имя: Пароль:
1C
1С v8
Вопрос по разбивке фио
,
0 елкина
 
13.09.13
09:53
Добрый день. Меня попросили спросить у вас вот такую проблемку.

Есть вот это
Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МВТ;
    Запрос.УстановитьПараметр("ДатаНачала",НачалоДня(Объект.ДатаНачала));
    Запрос.УстановитьПараметр("ДатаОкончания",КонецДня(Объект.ДатаОкончания));
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ВТ.УлицаНаименование КАК УлицаНаименование,
        |    ВТ.ДомНомер КАК ДомНомер,
        |    ВТ.ПомещениеНомер КАК ПомещениеНомер,
        |    ВТ.ФИО,
        |    ВТ.Пол,
        |    ВТ.ДатаРождения,
        |    ВТ.УдостоверениеВид,
        |    ВТ.УдостоверениеСерия,
        |    ВТ.УдостоверениеНомер,
        |    ВТ.УдостоверениеДатаВыдачи,
        |    ВТ.УдостоверениеКемВыдано,
        |    ВТ.ДатаПрописки,
        |    ВТ.ДатаВыписки
        |ИЗ
        |    ВТ КАК ВТ
        |ГДЕ
        |    (ВТ.ДатаВыписки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
        |            ИЛИ ВТ.ДатаВыписки МЕЖДУ &ДатаНачала И &ДатаОкончания)
        |
        |УПОРЯДОЧИТЬ ПО
        |    УлицаНаименование,
        |    ДомНомер,
        |    ПомещениеНомер";

    t = ";";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Строка = Стр(Выборка.УлицаНаименование)+t
               + Стр(Выборка.ДомНомер)+t
               + Стр(Выборка.ПомещениеНомер)+t
               + Стр(Выборка.ФИО)+t
               + Формат(Выборка.ДатаРождения, "ДФ=yyyy-MM-dd")+t
               + Лев(Выборка.Пол,1)+t
               + Стр(Выборка.УдостоверениеВид)+t
               + Стр(Выборка.УдостоверениеСерия)+t
               + Стр(Выборка.УдостоверениеНомер)+t
               + Формат(Выборка.УдостоверениеДатаВыдачи, "ДФ=yyyy-MM-dd")+t
               + Стр(Выборка.УдостоверениеКемВыдано)+t
               + Формат(Выборка.ДатаПрописки, "ДФ=yyyy-MM-dd")+t
               + Формат(Выборка.ДатаВыписки, "ДФ=yyyy-MM-dd")+t;

        Объект.Текст.ДобавитьСтроку(Строка);
    КонецЦикла;


Вопрос вот в чем как в данном коде сделать так что бы ФИО разбивалось на 3 отдельных Фамилия Имя Отчество ну и так же выводилось через ;

Очень прошу помочь и не смеяться. ;)
1 cw014
 
13.09.13
09:55
Поз = Найти(ФИО," ");
Фамилия = Лев(ФИО, Поз-1);
Остаток = Сред(ФИО, Поз+1);

Повторить три раза
2 Тролль главный
 
13.09.13
09:56
в типовых есть РС ФИО физ лиц, там все уже разбито
3 mikecool
 
13.09.13
09:57
ФИО = СтрЗаменить(ФМО, " ", ";");
4 catena
 
13.09.13
09:57
+ СтрЗаменить(Стр(Выборка.ФИО)," ",";")+t

Ну, это если нет всяких двойных имен-фамилий.
5 IШаман
 
13.09.13
09:57
+(1) Еще надо учесть что пробелов может быть несколько.
6 cw014
 
13.09.13
09:58
Можно так:
ФИОСтр = СтрЗаменить(ФИО, " ", Символы.ПС);
Фамилия = СтрПолучитьСтроку(ФИОСТР,1);
Имя = СтрПолучитьСтроку(ФИОСТР,2);
Отчество = СтрПолучитьСтроку(ФИОСТР,3);
7 фобка
 
13.09.13
09:59
А еще есть ФИО без отчеств, а есчо есть сложно составные (арабские всякие)
8 елкина
 
13.09.13
10:01
ой а можно это в тот код подставить я просто не сама все делаю 8) учусь. хотела бы наглядности.
9 Леопольд Роскошный
 
13.09.13
10:05
Функция ФамилияИнициалыФизЛица(Объект = "", Фамилия = " ", Имя = " ", Отчество = " ") Экспорт

типовая, там все есть.
10 catena
 
13.09.13
10:07
(9)Такие смешные. Видите из ВТ данные собираются, может это внешний источник и нет там никакого объекта.
11 елкина
 
13.09.13
10:32
Спасибо огромное .помогло.
12 mikecool
 
13.09.13
10:55
(10) в объект можно и строку запихать емнип
13 елкина
 
13.09.13
10:57
А вот как сделать что бы фамилия имя отчество были  еще и в "" "фамилия";"имя";"отчество";
14 catena
 
13.09.13
11:23
(13) Фамилия = """"+Фамилия+""""
15 IKSparrow
 
13.09.13
11:34
Из штатной конфы:

// Функция формирует список значений из строки с разделителями.
//
// Параметры
//  СтрокаТекста - строка текста с разделителями
//  Разделитель - Строка, разделитель в тексте
//  НаличиеКавычек - Булево, есть ли кавычки вокруг значений в строке
//
// Возвращаемое значение:
//   СписокЗначений
//
Функция _ИзСтрокиСРазделителями(СтрокаТекста, Разделитель, НаличиеКавычек, НеУчитывтьТекстСТабуляциями = Ложь) Экспорт
    НаименованиеПрограммы = "";
    ФорматФайла = "";
    
    Если НЕ НеУчитывтьТекстСТабуляциями И ФорматФайла = "ТекстCТабуляциями" Тогда
        НаличиеКавычек = Ложь;
        Разделитель = Символы.Таб;
    КонецЕсли;
    
    СписокДанных = Новый СписокЗначений;
    
    ПрошлыйРазделитель = 0;
    КоличествоСимволов = 0;

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

        КоличествоСимволов = КоличествоСимволов + 1;
    
    КонецЦикла;

    ВыбранноеЗначение = Сред(СтрокаТекста,(ПрошлыйРазделитель + 1));
    Если НаличиеКавычек Тогда
        ВыбранноеЗначение = Сред(ВыбранноеЗначение, 2, (СтрДлина(ВыбранноеЗначение) - 2));
    КонецЕсли;
    Если НаименованиеПрограммы = "TheBAT" Тогда
        ВыбранноеЗначение = СтрЗаменить(ВыбранноеЗначение, "\22", """");
        ВыбранноеЗначение = СтрЗаменить(ВыбранноеЗначение, "\2C", "");
    ИначеЕсли НаименованиеПрограммы = "MSOutlook" И НЕ НеУчитывтьТекстСТабуляциями И ФорматФайла = "ТекстCТабуляциями" Тогда
        ВыбранноеЗначение = СтрЗаменить(ВыбранноеЗначение, (""""""), """");
        Если Сред(ВыбранноеЗначение, 1, 1) = """" Тогда
            ВыбранноеЗначение = Сред(ВыбранноеЗначение, 2);
        КонецЕсли;
        Если Сред(ВыбранноеЗначение, СтрДлина(ВыбранноеЗначение), 1) = """" Тогда
            ВыбранноеЗначение = Сред(ВыбранноеЗначение, 1, (СтрДлина(ВыбранноеЗначение) - 1));
        КонецЕсли;
    КонецЕсли;
    СписокДанных.Добавить(ВыбранноеЗначение);
    
    Возврат СписокДанных;

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

// Функция преобразует значения списка значений в строку с разделителями.
//
// Параметры
//  СписокЭлементов - список значений для преобразования
//  Разделитель - строка, разделитель для элементов строки
//  НаличиеКавычек - булево, нужно ли заключать элемент строки в кавычки
//
// ВозвращаемыеЗначения
//  Строка
//
Функция _ВСтрокуСразделителями(СписокЭлементов, Разделитель, НаличиеКавычек) Экспорт
    ФорматФайла = "";
    НаименованиеПрограммы = "";

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

    Возврат СтрокаВозврата;

КонецФункции
16 IKSparrow
 
13.09.13
11:35
Блин, как тэг кода применять
17 елкина
 
13.09.13
11:44
(4) сделала так получила данные на выходе

"тест Улица";"11";"111";"Иванова;Иванна;Ивановна ";2099-99-99;;"";"";"";;"";2001-00-00;2000-00-00;


на примере того кода покажите как ф И О обнести "" и через ;
p.s просто данная табличка должна выходить в exel с разделителями ;
18 Balabass
 
13.09.13
11:52
Мда...
Мистяне нынче не те.
(0) Фотка где?
19 catena
 
13.09.13
12:02
(18)шшш, там кузнец есть...
20 елкина
 
13.09.13
12:13
не кузнец а мой брат ;) будет вам фотка помогите решить поблему..
помогите добиться вида
"тест Улица";"11";"111";"Иванова";"Иванна";"Ивановна" ;2099-99-99;;"";"";"";;"";2001-00-00;2000-00-00;
21 Balabass
 
13.09.13
12:16
(19) ?
22 Balabass
 
13.09.13
12:19
(20) ТАк сказали же что нужно сделать? не?
23 елкина
 
13.09.13
12:36
Строка = Стр(Выборка.УлицаНаименование)+t
               + Стр(Выборка.ДомНомер)+t
               + Стр(Выборка.ПомещениеНомер)+t
    тут фамилия    надо        + СтрЗаменить(Стр(Выборка.ФИО)," ",";")+t
           тут  надо имя    + СтрЗаменить(Стр(Выборка.ФИО)," ",";")+t
      тут надо отчество         + СтрЗаменить(Стр(Выборка.ФИО)," ",";")+t  
               + Формат(Выборка.ДатаРождения, "ДФ=yyyy-MM-dd")+t
               + Лев(Выборка.Пол,1)+t
               + Стр(Выборка.УдостоверениеВид)+t
               + Стр(Выборка.УдостоверениеСерия)+t
               + Стр(Выборка.УдостоверениеНомер)+t
               + Формат(Выборка.УдостоверениеДатаВыдачи, "ДФ=yyyy-MM-dd")+t
               + Стр(Выборка.УдостоверениеКемВыдано)+t
               + Формат(Выборка.ДатаПрописки, "ДФ=yyyy-MM-dd")+t
               + Формат(Выборка.ДатаВыписки, "ДФ=yyyy-MM-dd")+t;


вот как именно 3 сделать? т.к потом создается таблица и если не будет 3х то все ФИО даже разобранное по частям суется в одну колонку. /me нервно хихикает.
24 catena
 
13.09.13
12:41
ФИОСтр = СтрЗаменить(ФИО, " ", Символы.ПС);
ФИОстр = СтрЗаменить(ФИО, """", "");
Фамилия = """"+СтрПолучитьСтроку(ФИОСТР,1)+"""";
Имя = """"+СтрПолучитьСтроку(ФИОСТР,2)+"""";
Отчество = """"+СтрПолучитьСтроку(ФИОСТР,3)+"""";

А потом уже в троку вместо

+ Стр(Выборка.ФИО)+

Пихать

+ Фамилия + ";" +
+ Имя + ";" +
+ Отчество+ ";" +
25 елкина
 
13.09.13
12:50
(24) не хочет 8( не могли бы вы на примере (0)  показать .... чеснослово последний раз прошу ;) я просто учусь а тут такое задали .....
26 Леопольд Роскошный
 
13.09.13
12:55
(12) точно!
27 catena
 
13.09.13
12:59
(25)Что именно не хочет-то? Сперва вычисляете фамилию-имя-отчетсво, потом подставляете их при собирании строки. Всё.
28 catena
 
13.09.13
12:59
Только наоборот
ФИО = СтрЗаменить(ФИО, """", "");
ФИОСтр = СтрЗаменить(ФИО, " ", Символы.ПС);
Фамилия = """"+СтрПолучитьСтроку(ФИОСТР,1)+"""";
Имя = """"+СтрПолучитьСтроку(ФИОСТР,2)+"""";
Отчество = """"+СтрПолучитьСтроку(ФИОСТР,3)+"""";
29 Infsams654
 
13.09.13
13:12
(28) ну-ну, у азербайджанцев отчество 2-ное, например: Могай Оглы. Так в паспорте и написано (бывают варианты "Могай-Оглы", "Могай - Оглы"), так, что с разделением через пробел не прокатит.
30 catena
 
13.09.13
13:16
(29)А я про это еще в первом сообщение уточнила. Но в этих случаях если вручную ФИО не разбито по нужным полям, программно никак не разделить.
31 catena
 
13.09.13
13:20
(29)У меня самой таких оглы-улы-жан-кыз дофига :(
32 Бледно Золотистый
 
13.09.13
13:21
(29) Это что, вон у испанцев - Мария де Монтсеррат Вивиана Консепсьон Кабалье-и-Фолк
33 елкина
 
13.09.13
13:37
.......при формировании выходного файла теперь ругается что "Преобразование значений к типу Число не может быть выполнено"
34 елкина
 
13.09.13
14:43
Собственно вот так получилось


    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МВТ;
    Запрос.УстановитьПараметр("ДатаНачала",НачалоДня(Объект.ДатаНачала));
    Запрос.УстановитьПараметр("ДатаОкончания",КонецДня(Объект.ДатаОкончания));
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ВТ.УлицаНаименование КАК УлицаНаименование,
        |    ВТ.ДомНомер КАК ДомНомер,
        |    ВТ.ПомещениеНомер КАК ПомещениеНомер,
        |    ВТ.ФИО,
        |    ВТ.Пол,
        |    ВТ.ДатаРождения,
        |    ВТ.УдостоверениеВид,
        |    ВТ.УдостоверениеСерия,
        |    ВТ.УдостоверениеНомер,
        |    ВТ.УдостоверениеДатаВыдачи,
        |    ВТ.УдостоверениеКемВыдано,
        |    ВТ.ДатаПрописки,
        |    ВТ.ДатаВыписки
        |ИЗ
        |    ВТ КАК ВТ
        |ГДЕ
        |    (ВТ.ДатаВыписки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
        |            ИЛИ ВТ.ДатаВыписки МЕЖДУ &ДатаНачала И &ДатаОкончания)
        |
        |УПОРЯДОЧИТЬ ПО
        |    УлицаНаименование,
        |    ДомНомер,
        |    ПомещениеНомер";

    
t = ";";
    
Выборка = Запрос.Выполнить().Выбрать();
ФИО = СтрЗаменить(ФИО, """", "");
ФИОСтр = СтрЗаменить(ФИО, " ", Символы.ПС);
Фамилия = """"+СтрПолучитьСтроку(ФИОСТР,1)+"""";
Имя = """"+СтрПолучитьСтроку(ФИОСТР,2)+"""";
Отчество = """"+СтрПолучитьСтроку(ФИОСТР,3)+"""";

Пока Выборка.Следующий() Цикл
        Строка =
               + Стр(Выборка.УлицаНаименование)+t
               + Стр(Выборка.ДомНомер)+t
               + Стр(Выборка.ПомещениеНомер)+t
               + Стр(Выборка.ФИО)+t
               + Лев(Выборка.Пол,1)+t
               + Фамилия + ";" +
               + Имя + ";" +
               + Отчество+ ";" +
               + Формат(Выборка.ДатаРождения, "ДФ=yyyy-MM-dd")+t
               + Стр(Выборка.УдостоверениеВид)+t
               + Стр(Выборка.УдостоверениеСерия)+t
               + Стр(Выборка.УдостоверениеНомер)+t
               + Формат(Выборка.УдостоверениеДатаВыдачи, "ДФ=yyyy-MM-dd")+t
               + Стр(Выборка.УдостоверениеКемВыдано)+t
               + Формат(Выборка.ДатаПрописки, "ДФ=yyyy-MM-dd")+t
               + Формат(Выборка.ДатаВыписки, "ДФ=yyyy-MM-dd")+t;
              
        Объект.Текст.ДобавитьСтроку(Строка);
    КонецЦикла;    





и не формируется файл csv ругается Преобразование значений к типу Число не может быть выполнено"
35 catena
 
13.09.13
14:45
(34)Знаешь, брось... Не твое...
36 anaed
 
13.09.13
14:51
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ФИО = СтрЗаменить(Выборка.ФИО, """", "");
ФИОСтр = СтрЗаменить(ФИО, " ", Символы.ПС);
Фамилия = """"+СтрПолучитьСтроку(ФИОСТР,1)+"""";
Имя = """"+СтрПолучитьСтроку(ФИОСТР,2)+"""";
Отчество = """"+СтрПолучитьСтроку(ФИОСТР,3)+"""";        
Строка =
               + Стр(Выборка.УлицаНаименование)+t
               + Стр(Выборка.ДомНомер)+t
               + Стр(Выборка.ПомещениеНомер)+t
               + Стр(Выборка.ФИО)+t
               + Лев(Выборка.Пол,1)+t
               + Фамилия + ";" +
               + Имя + ";" +
               + Отчество+ ";" +
               + Формат(Выборка.ДатаРождения, "ДФ=yyyy-MM-dd")+t
               + Стр(Выборка.УдостоверениеВид)+t
               + Стр(Выборка.УдостоверениеСерия)+t
               + Стр(Выборка.УдостоверениеНомер)+t
               + Формат(Выборка.УдостоверениеДатаВыдачи, "ДФ=yyyy-MM-dd")+t
               + Стр(Выборка.УдостоверениеКемВыдано)+t
               + Формат(Выборка.ДатаПрописки, "ДФ=yyyy-MM-dd")+t
               + Формат(Выборка.ДатаВыписки, "ДФ=yyyy-MM-dd")+t;
              
        Объект.Текст.ДобавитьСтроку(Строка);
    КонецЦикла;
37 anaed
 
13.09.13
14:52
и лучше послушать (35)
38 елкина
 
13.09.13
15:06
ну не все же сразу научились ходить и рождаемся мы не с 32 зубами.... я только учусь.
39 елкина
 
13.09.13
15:09
все я сделала как вы написали ....но ошибка никуда не делась...да и то что я написала не очень отличается от вашего 8(
40 catena
 
13.09.13
15:39
(39)В том-то и дело, что отличается не очень, а влияет очень. И копи-пастить с форума - это не учиться.

А в тексте ошибки как правило есть много дополнительной информации.
41 елкина
 
13.09.13
15:42
ладно. буду думать ну спасибо хоть так помогли.
42 елкина
 
13.09.13
16:01
Все разобралась ...... из за одного + вся заварушка все заработало громадное вам спасибо за советы.
43 Infsams654
 
13.09.13
16:16
(32) в паспорте РФ есть 3 поля: Фамилия, Имя, Отчество. Как разбивать "Мария де Монтсеррат Вивиана Консепсьон Кабалье-и-Фо" в эти поля - хз...
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс