рубрики: Разное | Дата: 16 февраля, 2017
В этой статье рассмотрим такое понятие как рекурсия и приведем пример, где ее можно использовать при программировании на языке 1С. Рекурсия – это такая конструкция кода при которой процедура или функция вызывает сама себя. Соответственно такая процедура или функция называется рекурсивной.
Один из известных примеров использования рекурсии в языке 1С, который описан на диске ИТС – это обход результата запроса с использованием параметра ПоГруппировкамСИерархией. При этом и итоги в тексте запроса должны быть иерархические. Еще один случай, где достаточно часто приходится прибегать к рекурсии – это работа с деревом значений. То есть на этих двух примерах мы видим, что рекурсия бывает необходима когда у нас есть некая иерархическая структура, в которой часто неизвестно количество уровней вложенности. И нам надо каким-либо образом обработать все подчиненные элементы некоторого узла. Или наоборот подняться от нижнего уровня до самого верхнего.
Рассмотрим пример с использованием рекурсивного обхода дерева значений. Пусть у нас есть обработка на управлямой форме с табличной частью, в которой будем редактировать штатное расписание, представленное в виде дерева значений.
А теперь сделаем так, что при изменении поля Организация у элемента верхнего уровня, для всех подчиненных элементов будет проставлятся та же самая организация. Количество уровней вложенности нам заранее неизвестно. Если попытаться реализовать это без использования рекурсии, код получится достаточно объемный и запутанный. С рекурсивной же функцией все делается элементарно просто
&НаКлиенте
Процедура ЗаполнитьОрганизациюРекурсивно(СтрокаДерева, Организация)
НаборСтрок = СтрокаДерева.ПолучитьЭлементы();
Для каждого ТекущаяСтрока Из НаборСтрок Цикл
ТекущаяСтрока.Организация = Организация;
ЗаполнитьОрганизациюРекурсивно(ТекущаяСтрока, Организация);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ДеревоШтатногоРасписанияОрганизацияПриИзменении(Элемент)
СтрокаДерева = Элементы.ДеревоШтатногоРасписания.ТекущиеДанные;
Организация = СтрокаДерева.Организация;
ЗаполнитьОрганизациюРекурсивно(СтрокаДерева, Организация);
КонецПроцедуры
Как видно из кода рекурсивной здесь является процедура ЗаполнитьОрганизациюРекурсивно()
Проверяем работу. Открываем обработку и вводим строки как показано на рисунке
А теперь введем в самую верхнюю строчку название организации и увидим, что все подчиненные элементы заполняться той же самой организацией
Добавить комментарий