В этой статья продолжим знакомиться с рекурсией. Разберем более интересный вид рекурсии: рекурсию процедур и функций. В предыдущей статье мы познакомились с рекурсией переменных.
И так, процедура или функция называются рекурсивными, когда они вызывают самих себя. Например, рекурсивная процедура будет выглядеть так:
Процедура прРекурсивная()
//какой-то код
прРекурсивная ();
КонецПроцедуры
А рекурсивная функция будет выглядеть следующим образом:
Функция фРекурсивная(ПеремА,ПеремБ,…)
//какой-то код
фП = фРекурсивная(ПеремС,ПеремД,…);
// какой-то код
КонецФункции
Есть явная рекурсия, которая показана в предыдущих примерах, а может быть неявная: когда процедура или функция будут вызывать процедуру или функцию, которые будут использовать первоначальную процедуру
Процедура прРекурсия()
ВызовРекурс();
КонецПроцедуры
Процедура ВызовРекурс()
прРекурсия();
КонецПроцедуры
Ещё важно помнить о таком не очень приятном событии, как бесконечная рекурсия
Есть разные способы борьбы с бесконечной рекурсией. Как вариант, передавать в рекурсивную процедуру или функцию счетчик, который при каждой рекурсии увеличиваем на 1. И в случае, когда счетчик достигает какого-нибудь значения, останавливаем рекурсию.
Процедура ВызовРекурсивнойФункции()
Счетчик = 0;
ПеремР = фРекурсивная(1,2,Счетчик);
КонецПроцедуры
Функция фРекурсивная(ПеремА,ПеремБ,Счетчик)
Счетчик = Счетчик + 1;
Если Счетчик = 100 Тогда
Возврат Новый Структура(«ПеремА,ПеремБ»,ПеремА,ПеремБ);
КонецЕсли;
Возврат фРекурсивная(ПеремА +1,ПеремБ + 2,Счетчик);
КонецФункции
В этом примере, мы будем каждый раз входить в рекурсию и увеличивать счетчик, пока он не станет равен 100, после мы выйдем из нее.
Посмотрите, как отрабатывает наша рекурсивная функция
И рассмотрим один прикладной пример: узнаем с помощью рекурсивного вызова функции самую верхнюю группу какого-нибудь справочника. Пример я буду делать на демонстрационной конфигурации «Управляемое приложение 1С»
&НаСервереБезКонтекста
Функция ВернутьРодителя(Товар)
Если Товар.Уровень() = 0 Тогда
Возврат Товар;
КонецЕсли;
Возврат ВернутьРодителя(Товар.Родитель);
КонецФункции
&НаСервере
Процедура УзнатьГлавногоРодителяНаСервере()
Если Товар.Уровень() = 0 Тогда
Сообщить(«Товар (группа) верхнего уровня»);
КонецЕсли;
ГлавныйРодитель = ВернутьРодителя(Товар);
Сообщить(ГлавныйРодитель);
КонецПроцедуры
&НаКлиенте
Процедура УзнатьГлавногоРодителя(Команда)
Если Не ЗначениеЗаполнено(Товар) Тогда
Сообщить(«ЗаполнитеТовар»);
Возврат;
КонецЕсли;
УзнатьГлавногоРодителяНаСервере();
КонецПроцедуры
В этом коде рекурсивной является функция ВернутьРодителя, в неё мы каждый раз передаем родителя номенклатуры, пока не достигнем самого верхнего уровня.
Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:
Книга «Программировать в 1С за 9 шагов»
Изучите программирование в 1С с помощью моей книги «Программировать в 1С за 9 шагов»
- Без сложных технических терминов.
- Более 500 страниц практического материала.
- Каждое задание сопровождается рисунком (скриншот).
- Сборник задач для домашней проработки.
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
Промо-код на скидку в 16%: vCph8bW3rE
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009