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