Каталог решений - Обход подчиненных документов

Обход подчиненных документов

Обход подчиненных документов

В наличии

Обход документов, входящих в структуру подчинённости.

Категория:

Описание

Есть документ, у него ссылка на документ родитель и так до бесконечности… 

Требуется найти сумму всех документов, входящих в дерево подчиненности. 
Пример: Есть документ «Проект договора» на основании проекта договора может быть создано несколько Доп. соглашений, На основании доп соглашений могут быть созданы ещё доп соглашения(Структура подчиненности). Если сумма договора и доп соглашений превысит в общем пять миллионов, то проект должен быть согласован генеральным директором.

Можно построить дерево подчиненности, а потом его обойти, а можно обойти запросом в рекурсивном цикле.

Вот пример процедуры, которая находит сумму по всем документам проекта договора:
 

&НаСервере
Функция ПолучитьСуммуПоВсемПроектамДогНаСервере(ПроектДоговора)
	МасДог = Новый Массив;
	МасДог.Добавить(ПроектДоговора);
	ПолучитьПроектыДогРекурсивно(МасДог);
	СуммаПоВсемПроектамДог = 0;
	Для каждого Проект из МасДог Цикл
		СуммаПоВсемПроектамДог = СуммаПоВсемПроектамДог + Проект.СуммаВзаиморасчеты;
		Сообщить(Проект);
	КонецЦикла;
	Сообщить("Сумма по всем проектам = " + СуммаПоВсемПроектамДог);
	Возврат  СуммаПоВсемПроектамДог;
	
КонецФункции


&НаСервере
Процедура ПолучитьПроектыДогРекурсивно(МасДог)
	
			
	//Получим всех детей и всех родителей
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	бит_ПроектДоговора.Ссылка
		|ПОМЕСТИТЬ Вт_Рез
		|ИЗ
		|	Документ.бит_ПроектДоговора КАК бит_ПроектДоговора
		|ГДЕ
		|	бит_ПроектДоговора.ОсновнойДоговор В(&МасДог)
		|	И бит_ПроектДоговора.ПометкаУдаления = ЛОЖЬ
		|	И НЕ бит_ПроектДоговора.Ссылка В (&МасДог)
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	бит_ПроектДоговора.ОсновнойДоговор.Ссылка
		|ИЗ
		|	Документ.бит_ПроектДоговора КАК бит_ПроектДоговора
		|ГДЕ
		|	бит_ПроектДоговора.ОсновнойДоговор.ПометкаУдаления = ЛОЖЬ
		|	И бит_ПроектДоговора.Ссылка В(&МасДог)
		|	И НЕ бит_ПроектДоговора.ОсновнойДоговор.Ссылка В (&МасДог)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	Вт_Рез.Ссылка
		|ИЗ
		|	Вт_Рез КАК Вт_Рез";

	Запрос.УстановитьПараметр("МасДог", МасДог);

	РезультатЗапроса = Запрос.Выполнить();

	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

	Если ВыборкаДетальныеЗаписи.Количество() > 0 Тогда 
	
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			 МасДог.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
		КонецЦикла;
		ПолучитьПроектыДогРекурсивно(МасДог); 
	//Иначе
		//Возврат МасДог;
	КонецЕсли;
		
	
КонецПроцедуры
has been added to your cart:
Оформление заказа