Имя: Пароль:
1C
1С v8
Как подсчитать кол-во пробелов в полученных данных
0 Grinpic
 
02.09.15
12:01
Здравствуйте!
Версия 1с 8.3
Мне необходимо подсчитывать колличество пробелов в данных взятых из dbf, а точнее именно поля FIO, в базе данных имеется -Фамилия Имя -
мне нужно сделать условие, что если Фамилия Имя =1 пробел тогда добавить + "Отчество", Если из базы Пришло Фамилия тогда добавить +"Имя" + "Отчество",ну а условие на то что если не пришло ничего уже есть
Вот сам код:
Если операция.SDeb = "В подотчет" тогда
                    НовыйДок.ВидОперации = Перечисления.ВидыОперацийРКО.ВыдачаПодотчетномуЛицу;
                    НовыйДок.Выдать = ПоискФ(операция.FIO);
                    НовыйДок.Комментарий = операция.Komm;
                    НовыйДок.СуммаДокумента = операция.Summ;
                    НовыйДок.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("00-000002");
                    НовыйДок.СчетКасса = ПланыСчетов.Хозрасчетный.Касса;
                    //Добавляем контрагента, если нет в базе - создаем
                    Если ПоискФ(операция.FIO)<>Справочники.ФизическиеЛица.ПустаяСсылка() Тогда
                        НовыйДок.Контрагент = ПоискФ(операция.FIO);
                        //Сообщить("Контрагент имеется в базе");                    
                    Иначе
                        Если операция.FIO <> "" тогда
                            СтрокаКон = Справочники.ФизическиеЛица.СоздатьЭлемент();
                              СтрокаКон.Родитель = Справочники.Контрагенты.НайтиПоНаименованию("Новые контрагенты");
                              СтрокаКон.ФИО = операция.FIO;
                            СтрокаКон.ИНН = операция.INN;
                            СтрокаКон.Записать();
                            НовыйДок.Контрагент = ПоискФ(операция.FIO);
                            Если ПоискФ(операция.FIO)<>Справочники.ФизическиеЛица.ПустаяСсылка() Тогда
                                  //Сообщить("Контрагент добавился в базу");
                            Иначе Сообщить ("Ошибка физ лицо не добавилось");
                            КонецЕсли;
                        Иначе Сообщить("Нет FIO в ptov.dbf документ " + операция.Nnom + " не будет проведен");
                              
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;

Прошу вашей помощи!
1 Simod
 
02.09.15
12:07
См. СП: СтрЧислоВхождений()
2 Grinpic
 
02.09.15
12:12
(1) Благодарю, сейчас испробую!
3 Simod
 
02.09.15
12:25
Код конечно трэшевый:
1) Многократно вызывается функция ПоискФ();
2) Не проверяются результаты НайтиПоКоду(), НайтиПоНаименованию(). Да и вообще их не должно быть: либо предопределенные элементы, либо реквизиты на форме обработки (с проверкой выбора), либо еще как-то сохраненные ССЫЛКА на объекты;
3) После СтрокаКон.Записать() у тебя есть ссылка на элемент. Искать по ФИО через ПоискФ() не надо;
4) Прверку операция.FIO <> "" надо выполнять в первую очередь;

ФИО м/б в формате Иванов[][]Иван - 2 пробела, поэтому надо предварительно обработать:

ФИО = СокрЛП(ФИО);
Пока СтрНайти(ФИО, "  ") > 0 Цикла
    ФИО = СтрЗаменить(ФИО, "  ", " ");
КонецЦикла;

Ну и по-мелочи еще много..
4 Grinpic
 
02.09.15
12:59
Использую НайтиПоКоду(), НайтиПоНаименованию() т.к. мне нужно получить ссылку
Так же в поле контрагент мне нужно получить ссылку физического лица, поэтому я и ищу по реквизиту в функции:
Функция ПоискФ(FIO)
    //Поиск физ лица
    Контрагент = Справочники.ФизическиеЛица;
    НайденнаяСсылка = Контрагент.НайтиПоРеквизиту("ФИО", FIO);
    Если НайденнаяСсылка <> Контрагент.ПустаяСсылка() Тогда
           Возврат НайденнаяСсылка;
        Иначе Возврат НайденнаяСсылка;
    КонецЕсли;
    
КонецФункции

3) После СтрокаКон.Записать() у тебя есть ссылка на элемент. Искать по ФИО через ПоискФ() не надо
-
А как мне добавить в поле ссылку на данное физическое лицо, понятно что нужно поменять т.к. я уже изменил поле и сравнивать его с базой смысла нет,
вот что добавил:
Если операция.FIO <> "" тогда
                            СтрокаКон = Справочники.ФизическиеЛица.СоздатьЭлемент();
                              СтрокаКон.Родитель = Справочники.Контрагенты.НайтиПоНаименованию("Новые контрагенты");
                            
                            СтрокаКон.ФИО = операция.FIO;
                            Если СтрЧислоВхождений(СтрокаКон.ФИО," ")=1 тогда
                                СтрокаКон.ФИО = операция.FIO + " Отчество";
                            КонецЕсли;
                            Если СтрЧислоВхождений(СтрокаКон.ФИО," ")=0 тогда
                                СтрокаКон.ФИО = операция.FIO + " Имя"+" Отчество";
                            КонецЕсли;
                            FIO = СтрокаКон.ФИО;
                            СтрокаКон.ИНН = операция.INN;
                            СтрокаКон.Записать();
                            НовыйДок.Контрагент = ПоискФ(FIO);
5 Simod
 
02.09.15
14:29
(4)
3)
СтрокаКон.Записать();
НовыйДок.Контрагент = СтрокаКон.Ссылка;

Привыкай сразу давать нормальные имена переменным:
Контрагент = Справочники.ФизическиеЛица;
6 Grinpic
 
02.09.15
15:28
(5) Учту, использовал это наименование т.к. поле в документе называется "Контрагент", а так оно для физ лиц, немного оптимизировал код поставил переменные для функции поиска во всем коде, благодарю!