В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия)
Рассмотрим на примере.
В справочнике Номенклатура для групп и элементов выведен реквизит "Вывод". Необходимо чтобы при изменении реквизита "Вывод" для группы (папки), элементам и группам находящимся в этой папке, присваивалось такое же значение реквизита.
Код получается вот такой:
Процедура ВыводПриИзменении(Элемент) // событие при изменении реквизита "Вывод" ИзменитьВыводАссортиментаУподчиненныхЭлементов(); КонецПроцедуры Процедура ИзменитьВыводАссортиментаУподчиненныхЭлементов(родитель=неопределено) Если родитель=неопределено тогда родитель=ЭтотОбъект.Ссылка; конецЕсли; выборка=ВыборкаПодчиненныхЭлементов(Родитель); Пока выборка.Следующий() цикл Если выборка.ссылка.этоГруппа тогда ИзменитьВыводАссортиментаУподчиненныхЭлементов(выборка.ссылка);//Вызываем рекурсивно КонецЕсли; элНом=выборка.ссылка.получитьОбъект(); //+ указываем какие реквизиты нужно поменять элНом.Вывод=Вывод; //- указываем какие реквизиты нужно поменять элНом.записать(); конецЦикла; конецПроцедуры Функция ВыборкаПодчиненныхЭлементов(родитель) запрос=новый запрос; запрос.Текст= "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Родитель = &Родитель"; запрос.УстановитьПараметр("родитель",Родитель); выборка=запрос.Выполнить().Выбрать(); возврат выборка; конецФункции
Процедуру ИзменитьВыводАссортиментаУподчиненныхЭлементов(родитель=неопределено) вызываем рекурсивно из самой себя.
Можно было конечно сразу при первом вызове из события указать "ИзменитьВыводАссортиментаУподчиненныхЭлементов(ЭтотОбъект.ссылка)" и тогда бы не пришлось у процедуры писать "родитель=неопределено", но это уже на Ваше усмотрение.
И так и так корректно.