ДеревоЗначений

1. wasd_Raziel@mail.ru 3 13.12.22 21:51 Сейчас в теме
На форме выводится дерево значений (иерархия номенклатуры) с ценой.
Уровни вложенности динамические где 2, где 3, де 10 и т.п.
Как обновить сумму в группах(верхних уровнях) если цена конкретной позиции на форме изменена?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. lmnlmn 69 14.12.22 09:42 Сейчас в теме
(1) Если хочется заморочиться, то можно отслеживать изменения числа в узле дерева и пересчитывать только ветку от него до корня. Но про удаление/добавление узла еще надо не забыть.
wasd_Raziel@mail.ru; +1 Ответить
13. DBV 15.12.22 09:11 Сейчас в теме
(1)
Процедура РассчитатьСуммуЦенПодчиненныхСтрок(СтрокаРодитель)
	
	СтрокаРодитель.Цена = СтрокаРодитель.Строки.Итог("Цена", Ложь);
	Для Каждого СтрокаДерева Из СтрокаРодитель.Строки Цикл
		РассчитатьСуммуЦенПодчиненныхСтрок(СтрокаДерева);	
	КонецЦикла;		
	
КонецПроцедуры
2. пользователь 13.12.22 21:55
Сообщение было скрыто модератором.
...
4. wasd_Raziel@mail.ru 3 13.12.22 21:59 Сейчас в теме
(2)Каждый верхний уровень это сумма цен нижних
5. пользователь 13.12.22 22:10
Сообщение было скрыто модератором.
...
7. user1863362 13.12.22 23:01 Сейчас в теме
(4) Александр Валерьевич, ну как же так, миллионами ворочаете, а цены складываете...

Ну пересчитайте вы все дерево рекурсивно - если это не лист, то сложить все числа на одном, низлежащем уровне и присвоить сумму текущему узлу.
8. пользователь 13.12.22 23:05
Сообщение было скрыто модератором.
...
9. wasd_Raziel@mail.ru 3 14.12.22 06:07 Сейчас в теме
(7) Что за агрессия не понимаю, какими миллионами ворочаю?
Ну впервые с деревом работаю, раньше как то не приходилось сталкиваться.
Я написал рекурсию:
Процедура ОбходДерева(СтрокиДерево)
Для Каждого стрДерева из СтрокиДерево Цикл
Если стрДерева.Колонки.Количество() <> 0 Тогда
ОбходДерева(стрДерева.Строки);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Запустил, смотрю 1 итерацию, что СтрокиДерево содержит нулевой уровень, а стрДерева.Строки уровень 1, ну вроде все норм.
Дальше рекурсия и мы получаем, что СтрокиДерево содержат 1 уровень, а стрДерева.Строки уже 2 уровень.
Дальше рекурсия: СтрокиДерево содержат уровень 2, стрДерева.Строки = 0, так как последний уровень, на котором произошло изменение. Вот тут я могу сложить цены 2-го уровня. А как на 1 и 0 уровень передать в этот момент чета не догоняю.

Я последние 3 недели работаю по 15-17 часов в день без выходных, может уже просто устал, но это не повод вместо помощи высмеивать.
Тут я так понимаю помощи не ждать, одни насмешки. Сам разберусь.
10. Zevzm 14.12.22 08:24 Сейчас в теме
(9) Попробуйте как-то так:
Процедура РасчитатьСуммыПоУзламДерева(СтрокиДерева) Экспорт 
	
	Для Каждого СтрокаДерева Из СтрокиДерева Цикл
		Если СтрокаДерева.Строки.Количество() > 0 Тогда
			СтрокаДерева.Сумма = 0;
		КонецЕсли;
		РасчитатьСуммыПоУзламДерева(СтрокаДерева.Строки);
		Если СтрокаДерева.Строки.Количество() > 0 Тогда
			Для каждого СтрокаИзСтрок Из СтрокаДерева.Строки Цикл
				СтрокаДерева.Сумма = СтрокаДерева.Сумма + СтрокаИзСтрок.Сумма;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
Показать
11. user1863362 14.12.22 08:29 Сейчас в теме
(9)
3 недели работаю по 15-17 часов в день без выходных
Здесь нужен ещё пассаж про голодную белокурую дочку и престарелых родителей.
А так ничего, сойдет. У нас тут теперь капитализм и всё такое.
14. alul 16.12.22 13:15 Сейчас в теме
(9) Создайте массив, ну и пусть в массиве каждое новое значение - итог по уровню МассивИтогиПоУровням[Уровень] . Завершение перебора (ИТОГО) по каждому уровню закидываем на предыдущий уровень
МассивИтогиПоУровням[Уровень-1] = МассивИтогиПоУровням[Уровень-1] + МассивИтогиПоУровням[Уровень]
Как хранить массив право за Вами.
3. wasd_Raziel@mail.ru 3 13.12.22 21:58 Сейчас в теме
Т.е. пример:
Наименование | Цена
Товары | 100
- Эл.компоненты | 60
-- Чип К1023 | 40
-- Чип К1956 | 20
- Прочее | 40
-- Коннектор | 40

меняем на форме у чип К1023 цену на 80 и получаем новое дерево:
Наименование | Цена
Товары | 140
- Эл.компоненты | 100
-- Чип К1023 | 80
-- Чип К1956 | 20
- Прочее | 40
-- Коннектор | 40
6. пользователь 13.12.22 22:11
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот