В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложнаяили косвенная рекурсия), например, функция вызывает функцию , а функция — функцию . Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.
Для справки, рекурсия — это способность процедуры или функции вызывать во время исполнения саму себя. Использование рекурсии — дело вполне обычное для высокоуровневых языков программирования. Вполне логично и естественно, что в 1С рекурсивный вызов процедур и функций тоже исправно работает.
Недавно в процессе написания одного отчета у меня возникла необходимость получить для элемента справочника родителя самого верхнего (нулевого) уровня. На скриншоте, представленном ниже, для выделенного элемента справочника «Миксер Sоlас мод. 545» родителем нулевого уровня будет группа «Бытовая техника».
В моем случае справочник был совсем другой, но это не важно. Подобные задачи замечательно решаются путём создания рекурсивной функции:
Функция НулевойРодитель(ЭлементСправочника) Если ЭлементСправочника.Родитель.Пустая() Тогда Возврат ЭлементСправочника; Иначе Возврат НулевойРодитель(ЭлементСправочника.Родитель); КонецЕсли; КонецФункции
Достоинства рекурсии — компактность и универсальность кода.
Где еще есть место для использования рекурсии? Вычисление рекуррентных формул. Вот пример функции для вычисления факториала числа N:
Функция Факториал(N) Если N < 0 Или N <> Цел(N) Тогда //отсекаем ненатуральные числа Возврат Неопределено; ИначеЕсли N = 0 Тогда Возврат 1; Иначе Возврат N * Факториал(N - 1); КонецЕсли; КонецФункции
Не забывайте об использовании рекурсивных функций. Там, где они необходимы, вряд ли можно найти более лаконичное решение.