Обход дерева значений в 1С с удалением строк

Дерево значений весьма специфичный тип данных в 1С. По сути это таже самая таблица значений но которая имеет свойства иерархичности (древовидности). Соответственно обход дереве не такая и тривиальная задача как кажется на первый взгляд. Ведь нужно обходить древо рекурсивно.

В одной из задач мне понадобилось обойти дерево и удалить из него строки с пустыми значениями. Так как я не особо часто работал с деревом значений, то я принялся реализовывать эту задачу в упор, просто обходя дерево и удаляя строки, однако в таком случае меня ждал провал. При удалении строки из дерева, количество элементов меняется, соответственно индекс обхода цикла сбивается и остаются не удаленные строки. К сожалению я не сразу понял, это и уйму времени потратил на поиск верного решения. Ниже привожу работающий у меня код. На уникальность не претендую, обход дерева значений рекурсивно нашел в интернете и переделал на свой лад.

&НаСервере
Процедура склад_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	//Вставить содержимое обработчика
	ДеревоЗнач = РеквизитФормыВЗначение("ДеревоВыбора");
	ОбходДереваДетально(ДеревоЗнач);
	ЗначениеВРеквизитФормы(ДеревоЗнач, "ДеревоВыбора");
	
КонецПроцедуры

//Рекурсивная процедура
&НаСервере

Процедура ОбходДереваДетально(ПереданноеДер)
	Тз = Новый Массив;

	Для Каждого СтрПолученногоДерева Из ПереданноеДер.Строки Цикл
				
		СтрПолученногоДерева.Маркируемый = СтрПолученногоДерева.Характеристика.ор_МаркируемыйТовар;
		Если СтрПолученногоДерева.Строки.Количество()>0 Тогда
			ОбходДереваДетально(СтрПолученногоДерева);		
		Иначе
			Если СтрПолученногоДерева.Остаток = 0 Тогда 
				Тз.Добавить(СтрПолученногоДерева);
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;
	
	Для Каждого строкаКУдалению Из Тз Цикл
		ПереданноеДер.Строки.Удалить(строкаКУдалению);
	КонецЦикла;
	Тз.Очистить();

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

Думаю по коду и так все понятно. Все операции производим на сервере, а потому получаем значения реквизита формы. Передаем на сервер. Там обходим и строки к удалению помещаем в пустой массив. Дальше обходим массив и удаляем строки из нашего дерева. Следующим шагом перемещаем значение дерева опять на форму.

Вам также может понравиться

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

Ваш адрес email не будет опубликован.

Яндекс.Метрика