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

13.08.14

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

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

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

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

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


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

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

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

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

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


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

См. также

SALE! 20%

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122170    670    389    

714

Начните уже использовать хранилище запросов

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

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

11.10.2023    16186    skovpin_sa    14    

98

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8821    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

MS SQL Server: изучаем планы запросов

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

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

20.06.2023    16006    Филин    37    

113

Все консоли запросов для 1С

Запросы Инструментарий разработчика Бесплатно (free)

Список всех популярных обработок.

17.03.2023    35544    kuzyara    84    

179

Идентификатор объекта в запросе. Вы этого хотели?

Запросы Механизмы платформы 1С Платформа 1С v8.3 Запросы Бесплатно (free)

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    39665    dsdred    26    

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

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