Дано: дерево на форме, числовые значения в листьях меняются случайным образом. Необходимо находить сумму числовых значений всех листьев и фиксировать в каждой ветке.

Факт изменения листьев известен.

Пробовал на клиенте бегать по дереву при каждом изменении - долго, даже зная ветку, в листьях которой произошло изменение листьев, пробовал выгружать в ТЗ плоский список с данными листьев - еще медленнее, т.к. очень много серверных вызовов генерируется.

Как это можно сделать?
---
Так может не надо пересчитывать всю ветку и все родительские ветки вверх по иерархии?
Может при начале изменения запоминать состояние листочка, после изменения получать дельту, и это дельту вверх по иерархии применить только к родителям?
---
Я имел в виду, что в дереве для значения предусмотреть 2 реквизита - текущее и старое.
Пользователи что-то отметили, когда алгоритм меняет значения в листе, считать дельту и менять на нее значение родителя.

Хранить старое значение бывает проще, чем запоминать текущее перед изменением.
---
Дерево большое? Сколько листьев на ветках?
---
большое, на чем проверял - было 869 элементов в одной ветке.
---
долго - это сколько в секундах?
---
на память не вспомню, но это прям самая долгая операция, более 85% общего времени из вообще всех операций, судя по замеру производительности. Счет идет на 10ки секунд.
---
что-то долговато...
---
Счет идет на 10ки секунд. Ну это что-то совсем непонятное...
---
а чего не понятного? Изменились условно 2 листа ветки, нужно по всем листьям ветки пробежаться, изменился еще один лист - опять бежим по всем листьям ветки. Когда листьев в ветке в районе 1к, то будет в районе 1М итераций обновления 1ой ветки.
---
Так может не надо пересчитывать всю ветку и все родительские ветки вверх по иерархии?
Может при начале изменения запоминать состояние листочка, после изменения получать дельту, и это дельту вверх по иерархии применить только к родителям?
---
хм, спасибо, попробую реализовать
---
Или просто храните 2 значения - текущее и старое.
Сначала значения заполняются одинаково, а при изменении текущего получаем дельту со старым, правим все что нужно, и старое заполняем текущим.
---
там еще есть небольшая сложность: могут меняться не все листья, а часть и по неизменной части суммы хотелось бы оставлять.

Условно: отметили галочками изменяемые листья/ветку целиком, она начала меняться, то что отмечали до этого не должно меняться
---
Я имел в виду, что в дереве для значения предусмотреть 2 реквизита - текущее и старое.
Пользователи что-то отметили, когда алгоритм меняет значения в листе, считать дельту и менять на нее значение родителя.

Хранить старое значение бывает проще, чем запоминать текущее перед изменением.
---
Хранить старое значение бывает проще, чем запоминать текущее перед изменением. Обычная переменная в клиентском контексте модуля формы, ничего сложного...
---
Ну например в событии ПриИзменении старого значения нет. А если значение вручную меняет пользователь, проще отловить все в ПриИзменении.
---
в моем случае значения меняются машиной, просто по правилам хорошего тона хотелось бы отображать пользователю итог по ветке дерева для наглядности
---
Если мы говорим про дерево - то это таблица формы. Там есть ПередНачаломИзменения.
---
Ну или так, да.
---
да, спасибо, идея понятна.

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