Имя: Пароль:
1C
1С v8
рекурсивный вызов функции
0 rosveta
 
24.12.14
10:00
Добрый день. Не могу решить проблему. Есть функция, которая должна проверять реквизит всех родителей элемента. УТ 11, клиент-сервер

&НаСервере
Функция ПроверитьРодителейГруппы(Группа)
    
    Если ЗначениеЗаполнено(Группа.Родитель) Тогда
        Если Группа.Родитель.РС_ВыгружатьНаСайт Тогда
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "Корневой каталог уже выгружается";
            Сообщение.Сообщить();
            Возврат Истина;
        Иначе
            ПроверитьРодителейГруппы(Группа.Родитель);;
        КонецЕсли;
    Иначе
        Возврат Ложь;
    КонецЕсли;
    
КонецФункции


Проблема в том, что когда функция попала уже в Возврат Ложь
http://clip2net.com/s/39m037W

После этого функция еще попадает в другое место
http://clip2net.com/s/39m0dY7
Подскажите, в чем ошибка?
1 vicof
 
24.12.14
10:01
Ни в чем, выходит из рекурсии.
2 Asmody
 
24.12.14
10:03
Иначе
    Возврат ПроверитьРодителейГруппы(Группа.Родитель);
3 xXeNoNx
 
24.12.14
10:04
Функция ПроверитьРодителейГруппы(Группа)

Если НЕ ЗначениеЗаполнено(Группа) Тогда
   возврат Ложь;
КонецЕсли;
ПроверитьРодителейГруппы(Группа.Родитель);

КонецФункции
4 xXeNoNx
 
24.12.14
10:05
(3) И вообще, почему функция, а не процедура?
5 igork1966
 
24.12.14
10:06
Рекурсивная функция не использующая результат ее вызова... мне трудно такую представить...
6 igork1966
 
24.12.14
10:06
(4) => (5) + (2)
7 rosveta
 
24.12.14
10:07
(2), Спасибо! Ваш вариант сработал.
(3), Думаю, что и Ваш тоже сработает.
(4), потому что она вызывается в другом месте и в зависимости от того, что возвращается происходят дальнейшие действия
8 xXeNoNx
 
24.12.14
10:08
Функция ПроверитьРодителейГруппы(Группа)

Если НЕ ЗначениеЗаполнено(Группа) Тогда
   возврат Ложь;
ИНАЧЕЕСЛИ Группа.Родитель.РС_ВыгружатьНаСайт Тогда
   возврат Истина;
КонецЕсли;
ПроверитьРодителейГруппы(Группа.Родитель);

КонецФункции
9 Asmody
 
24.12.14
10:18
При использовании рекурсии всегда проверяйте точки выхода. Если сомневаетесь, сократите точку выхода до одной, например, введя переменную Результат.
10 rosveta
 
24.12.14
10:22
(9), Спасибо за совет.
11 igork1966
 
24.12.14
10:24
(8) Вот настойчивый. Рекурсивная функция не использующая результат вызова НОНСЕНС.
12 rosveta
 
24.12.14
10:29
(3), (8)- Все-таки не подходит.
13 rosveta
 
24.12.14
10:30
&НаСервере
Функция ПроверитьРодителейГруппы(Группа)
    
    Если ЗначениеЗаполнено(Группа.Родитель) Тогда
        Если Группа.Родитель.РС_ВыгружатьНаСайт Тогда
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "Корневой каталог уже выгружается";
            Сообщение.Сообщить();
            Возврат Истина;
        Иначе
            Возврат ПроверитьРодителейГруппы(Группа.Родитель);
        КонецЕсли;
    Иначе
        Возврат Ложь;
    КонецЕсли;
    
КонецФункции


Этот вариант работает