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