Имя: Пароль:
1C
1С v8
Подскажите по рекурсивной функции
0 егаис
 
16.05.22
09:29
&НаСервере
Функция ВернутьДни(Знач ВыбПодразделение)
    Если ВыбПодразделение.Родитель.Пустая() Тогда  
        Возврат ВыбПодразделение.Тест;
    Иначе
        Если ВыбПодразделение.Тест = 0 Тогда  
            ВернутьДни(ВыбПодразделение.Родитель);
        Иначе
            Возврат ВыбПодразделение.Тест;  //значение
        КонецЕсли;    
    КонецЕсли;    
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)
    ВернутьДни(Подразделение);
КонецПроцедуры


Каким образом выскочить из рекурсии, если условие сработало на некоторой итерации?
Значение здесь получаем
Возврат ВыбПодразделение.Тест;  //значение
но дальше возврат на предыдущий шаг, возвращает хрень.
1 егаис
 
16.05.22
09:32
вешать какую-то переменную, типа ЗначениеВыбрано = Истина?
2 Chai Nic
 
16.05.22
09:32
А опиши суть задачи. По предоставленному фрагменту ничего понять невозможно.
3 егаис
 
16.05.22
09:33
(2) справочник подразделений в ЗУП. Есть числовое поле. Если оно заполнено у элемента, возвращаем его, если нет - у родителя
4 RomanYS
 
16.05.22
09:34
(0) по сути вопроса выглядит нормально
&НаСервереБезКонтекста здесь напрашивается, но вопрос конечно не решит
5 Chai Nic
 
16.05.22
09:35
(3) "Если оно заполнено у элемента, возвращаем его, если нет - у родителя"
И где здесь применение рекурсии? Подъем "снизу вверх" - чистейшая итерация.
6 егаис
 
16.05.22
09:36
(5) иерархия может быть большой, предлагаешь все время на пустого родителя проверять?
7 Chai Nic
 
16.05.22
09:38
(6) Как вам здесь рекурсия поможет? Если хотите оптимизацию при повторных вызовах - используйте кэширование.
8 Irbis
 
16.05.22
09:38
(6) А уровень элемента запросить религия не позволяет?
9 егаис
 
16.05.22
09:39
(8) рассматриваю и такой вариант, в цикле по уровню можно проверить
Почему рекурсия-то не подходит?
10 Irbis
 
16.05.22
09:40
(9) Потому что тупая трата машинных ресурсов. Вместо иттерационного цикла с прерыванием в нужном месте.
11 егаис
 
16.05.22
09:41
(10) уговорил, перепишем функцию )
12 Многолетний Апельсин
 
16.05.22
09:43
Вместо
ВернутьДни(ВыбПодразделение.Родитель);
Написать
Возврат ВернутьДни(ВыбПодразделение.Родитель);
13 егаис
 
16.05.22
09:46
(12) бинго! Спасибо!
14 Chai Nic
 
16.05.22
09:51
Ещё и не так бывает, когда функции называть как процедуры.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.