Профессия — 1С » Рекурсия

Профессия — 1С

Рукопашный бой Карташ

Категории

-->

Рекурсия

рубрики: Разное | Дата: 16 февраля, 2017

В этой статье рассмотрим такое понятие как рекурсия и приведем пример, где ее можно использовать при программировании на языке 1С. Рекурсия – это такая конструкция кода при которой процедура или функция вызывает сама себя. Соответственно такая процедура или функция называется рекурсивной.

Один из известных примеров использования рекурсии в языке 1С, который описан на диске ИТС – это обход результата запроса с использованием параметра ПоГруппировкамСИерархией. При этом и итоги в тексте запроса должны быть иерархические. Еще один случай, где достаточно часто приходится прибегать к рекурсии – это работа с деревом значений. То есть на этих двух примерах мы видим, что рекурсия бывает необходима когда у нас есть некая иерархическая структура, в которой часто неизвестно количество уровней вложенности. И нам надо каким-либо образом обработать все подчиненные элементы некоторого узла. Или наоборот подняться от нижнего уровня до самого верхнего.

Рассмотрим пример с использованием рекурсивного обхода дерева значений. Пусть у нас есть обработка на управлямой форме с табличной частью, в которой будем редактировать штатное расписание, представленное в виде дерева значений.


А теперь сделаем так, что при изменении поля Организация у элемента верхнего уровня, для всех подчиненных элементов будет проставлятся та же самая организация. Количество уровней вложенности нам заранее неизвестно. Если попытаться реализовать это без использования рекурсии, код получится достаточно объемный и запутанный. С рекурсивной же функцией все делается элементарно просто




&НаКлиенте
Процедура ЗаполнитьОрганизациюРекурсивно(СтрокаДерева, Организация)

	НаборСтрок = СтрокаДерева.ПолучитьЭлементы();
	Для каждого ТекущаяСтрока Из НаборСтрок Цикл

		ТекущаяСтрока.Организация = Организация;
		ЗаполнитьОрганизациюРекурсивно(ТекущаяСтрока, Организация);

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ДеревоШтатногоРасписанияОрганизацияПриИзменении(Элемент)

	СтрокаДерева	= Элементы.ДеревоШтатногоРасписания.ТекущиеДанные;
	Организация		= СтрокаДерева.Организация;

	ЗаполнитьОрганизациюРекурсивно(СтрокаДерева, Организация);

КонецПроцедуры

Как видно из кода рекурсивной здесь является процедура ЗаполнитьОрганизациюРекурсивно()
Проверяем работу. Открываем обработку и вводим строки как показано на рисунке


А теперь введем в самую верхнюю строчку название организации и увидим, что все подчиненные элементы заполняться той же самой организацией

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

   

2014 - 2024г. Профессия — 1С. Обмен опытом по программированию в 1С