Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
13 дек 2024, 06:41

Заполнение дерева значений рекурсией

Автор Инокентий, 20 фев 2023, 15:21

0 Пользователей и 2 гостей просматривают эту тему.

Инокентий

Всем привет, подскажите пожалуйста, как можно заполнить дерево значений по результату запроса.
"| ВЫБРАТЬ
   | Спецификация.Владелец КАК Владелец,
   | Спецификация.НаСколькоШтук,
   | СпецификацияИнгридиенты.Номенклатура КАК Номенклатура,
   | СпецификацияИнгридиенты.Количество
   |ИЗ
   | Справочник.Спецификация.Ингридиенты КАК СпецификацияИнгридиенты
   | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Спецификация КАК Спецификация
   | ПО СпецификацияИнгридиенты.Ссылка = Спецификация.Ссылка
   |СГРУППИРОВАТЬ ПО 
   | СпецификацияИнгридиенты.Номенклатура,
   | Спецификация.Владелец,
   | Спецификация.НаСколькоШтук,
   | СпецификацияИнгридиенты.Количество"
 
  );

antoneus

Здесь результат запроса - плоская таблица. Какое дерево-то нужно?

Инокентий

antoneus, Здесь у каждой номенклатуры в поле родитель еще номенклатура. Нужно заполнить дерево значений, для построения цепочки производства(что из чего последовательно производится). И из этого дерева нужно выбрать все листья, чтобы составить список, сколько материалов нужно

antoneus

Так что ли?

"| ВЫБРАТЬ
|    СпецификацияИнгридиенты.Ссылка.Владелец КАК Владелец,
|    СпецификацияИнгридиенты.Ссылка.НаСколькоШтук,
|    СпецификацияИнгридиенты.Номенклатура КАК Номенклатура,
|    СпецификацияИнгридиенты.Количество
|ИЗ
|    Справочник.Спецификация.Ингридиенты КАК СпецификацияИнгридиенты
|ИТОГИ ПО 
|    СпецификацияИнгридиенты.Ссылка.Владелец";

ДеревоЗначений = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией)

Инокентий

antoneus, А можно как нибудь сделать это с помощью рекурсии?

antoneus

Нет, здесь рекурсия не нужна, т.к. известно число уровней (2), да и запрос же сам уже все делает.

Инокентий

antoneus, в цепочке производства может быть сколько угодно уровней, поэтому и спрашиваю

antoneus

Ну примерно так.

Процедура ЗаполнитьСпецификации(СтрокаДерева)
    Ингредиенты = ПолучитьИнгредиенты(СтрокаДерева.Номенклатура);//получаем массив ингредиентов для тек.номенклатуры запросом
    Для каждого Ингредиент из Ингредиенты Цикл
        НовСтрока = СтрокаДерева.Строки.Добавить();
        НовСтрока.Номенклатура = Ингредиент;
        ЗаполнитьСпецификации(НовСтрока);
    КонецЦикла;
КонецПроцедуры

Процедура ЗаполнитьДерево()
    Дерево = Новый ДеревоЗначений;
    Дерево.Колонки.Добавить("Номенклатура");
    Для каждого Номенклатура из СписокНоменклатуры Цикл
        НовСтрока = Дерево.Строки.Добавить();
        НовСтрока.Номенклатура = Номенклатура;
        ЗаполнитьСпецификации(НовСтрока);
    КонецЦикла;
КонецПроцедуры

Андрей Бутенко8

antoneus, может быть глупый вопрос... А разве дерево заполнится по итогу процедуры?

antoneus


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск