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

13.08.14

Разработка - Универсальные функции

Обход документов, входящих в структуру подчинённости.
Есть документ, у него ссылка на документ родитель и так до бесконечности... 

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

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

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


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

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

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

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

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


Структура подчиненности дерево подчиненности обход

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169274    937    403    

905

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6338    XilDen    36    

83

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    23945    dimanich70    81    

147

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    19943    skovpin_sa    15    

106

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    16140    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4053    66    progmaster    9    

4

Запросы HighLoad оптимизация Программист Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    30789    Филин    37    

119
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. AlX0id 13.08.14 20:20 Сейчас в теме
Не понял, в чем прикол считать сумму отдельно от рекурсии..
2. human_new 696 13.08.14 20:48 Сейчас в теме
(1) AlX0id, да там ещё условия на эти проекты будут накладываться, решил разделить. А так конечно лучше считать в рекурсии
3. smilebringer 13.08.14 20:48 Сейчас в теме
Поправьте меня, но для такой задачи подойдет критерий отбора, и он решит ее очень просто
4. human_new 696 13.08.14 22:15 Сейчас в теме
(3) smilebringer, Критерий отбора - это конечно клёвая вещь, но я не очень понимаю, чем она должна помощь, все равно рекурсия с запросом из критерия отбора, который тоже надо писать иначе получишь только 1 уровень подчиненности. Так и сделано в стандарте, когда выводишь структуру подчиненности. Вот если бы был вариант одним запросом, тогда конечно было бы круто.
5. nSpirit2 13.08.14 22:28 Сейчас в теме
Ну и чем ваше решение выгодней запросов в циклах?) Вы правда думаете что это решение адекватное в плане 1С? Можете предложить жизненный пример подобной задачи?
human_new; +1 Ответить
6. human_new 696 14.08.14 10:14 Сейчас в теме
(5) nSpirit2, так я и не настаиваю на том, что можно одним запросом получать всю иерархию, но будет ли использоваться критерий отбора или нет - тоже не вижу разницы. А на счет "в плане 1С", как раз только в 1с нужно городить огород, т.к. таблицы то нужной нет. Вот я и предложил вариант "огорода".
7. nSpirit2 14.08.14 11:09 Сейчас в теме
(6) Про критерии отбора вынужден согласиться. Запросы к ним совсем не оптимальны на сколько я понимаю логику их работы то фактической таблички критерия не существует и при запросе она начинает строиться это не очень быстрый механизм так то.

Я имею ввиду что при возникновении такой задачи можно заранее избежать необходимость поиска документов по бесконечному дереву. Не пытаясь решить всю задачу целиком а модифицировав конфигурацию под конкретный вариант БП клиента. Чтобы такой задачи не возникало. Ну и вы ведь понимаете что у 1с есть ограничение стека рекурсии так что бесконечное дерево рекурсией в 1с к сожалению не построить (
8. human_new 696 14.08.14 13:51 Сейчас в теме
(7) nSpirit2, это да, лучше построить табличку и хранить сразу дерево, что бы можно было спускаться к листикам, а не только подниматься к корню.
nSpirit2; +1 Ответить
Оставьте свое сообщение