Имя: Пароль:
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) Учту, использовал это наименование т.к. поле в документе называется "Контрагент", а так оно для физ лиц, немного оптимизировал код поставил переменные для функции поиска во всем коде, благодарю!
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший