Имя: Пароль:
1C
1С v8
Как сравнить два дерева значений?
0 Rizhij_Nikitos
 
26.07.21
18:25
Есть дерево значений, которое используется в форме для красивого отображения и работы с данными. При сохранении я сворачиваю его в табличную часть и сохраняю документ. Соответственно при запуске документа, я разворачиваю ТЧ и отображаю красивое дерево.

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

Сериализация дерева значений через СериализаторXDTO и ЗаписьXML выдает ошибку типа. Нельзя мол деревья.
Использование общего модуля с повторным использованием возвращаемых значений не позволяет прокидывать в свои функции значения типа ДеревоЗначений.
Если я создаю Соответствие, где ключом является ДеревоЗначений (сохраняю его в ХранилищеОбщихНастроек), получение по тому же дереву как по ключу, возвращает Неопределено.

Гугл ничего интересного не предлагает и я если честно в некотором тупике.

Готов выслушать ваши предложения.
1 mikecool
 
26.07.21
18:30
сравнивай только ветви
2 Rizhij_Nikitos
 
26.07.21
18:33
Можно более развернуто?
3 mikecool
 
26.07.21
18:34
(2) сохраняй в памяти измененные строки дерева, сравнивай потом только их
4 Rizhij_Nikitos
 
26.07.21
18:42
(3) Меня интересует скорее вопрос, не равны ли два дерева? Есть ли какие-то изменения в дереве? Какие конкретно меня не волнует. Не равны, значит заново преобразую в таблицу и кеширую.

Но этот вариант навел меня на мысль, что на форме можно подвесить обработчик изменения дерева и при вызове функции свертки, определять, был ли он задействован. То есть если на форме дерево изменили, значит надо сворачивать заново, а если не изменили, то я могу отдать кешированную свертку и не тратить на это время.
5 mikecool
 
26.07.21
18:43
"значит надо сворачивать заново" может проще при сохранении "свернуть" 1 раз?
6 Rizhij_Nikitos
 
26.07.21
18:44
(5) При сохранении я и так сворачиваю, меня больше волнует момент, когда человек поменял дерево, переключился на закладку с целевыми показателями, а мне их надо посчитать по текущему дереву.
7 mikecool
 
26.07.21
18:45
тогда булевый признак, сравнивать строку до и после изменения, если строки не равны , то взводи признак
8 Rizhij_Nikitos
 
26.07.21
18:47
Расчет показателей инкапсулирован и выполняется по табличному представлению дерева, чтобы можно было делать это не только из под формы, соответственно, когда я хочу посчитать показатели - из формы(по дереву) или извне(по табличному представлению дерева), я либо дерево преобразую к ТЗ и по нему считаю, либо ТЧ выгружаю в ТЗ и использую те же методы для расчета.
9 vde69
 
26.07.21
18:51
(4) кладёшь в двоичные данные, от них считаешь crc и сравниваешь с эталоном
10 Rizhij_Nikitos
 
26.07.21
18:55
(9) Я так понимаю, двоичные данные позволяют работать с файлами и потоками, которые источниками тоже являют собой файлы.
11 H A D G E H O G s
 
26.07.21
19:02
Древо1=Новый ДеревоЗначений;
    Древо1.Колонки.Добавить("Данные");
    Древо2=Новый ДеревоЗначений;
    Древо2.Колонки.Добавить("Данные");
    Древо3=Новый ДеревоЗначений;
    Древо3.Колонки.Добавить("Данные");
    НоваяСтрока=Древо1.Строки.Добавить();
    НоваяСтрока.Данные="Ооооо, моя оборона";
    НоваяСтрока=Древо2.Строки.Добавить();
    НоваяСтрока.Данные="Солнечный лучик стеклянного глаза";
    НоваяСтрока=Древо3.Строки.Добавить();
    НоваяСтрока.Данные="Ооооо, моя оборона";
    
    Сообщить(ЗначениеВСтрокуВнутр(Древо1)=ЗначениеВСтрокуВнутр(Древо2));
    Сообщить(ЗначениеВСтрокуВнутр(Древо1)=ЗначениеВСтрокуВнутр(Древо3));
12 Rizhij_Nikitos
 
26.07.21
19:38
(11) Победителя этому господину. Я уже переделал на ручной трекинг изменения дерева, но с этой штукой кэш заработал бы в своем первоначальном виде. Спасибо, не знал про такую функцию.
13 TormozIT
 
гуру
26.07.21
20:17
(12) И сериализатором бы ты дерево сравнил, но у тебя в нем очевидно есть доп. колонки, которые ты не хранишь в БД, а достраиваешь для отображения. Вот их и надо было удалить перед сериализацией.
А функция ЗначениеВСтрокуВнутр() хороша и одновременно плоха (смотря для чего) тем, что игнорирует несериализуемые данные и превращает их в идентификатор типа.
14 nodrama
 
26.07.21
20:40
выгрузить оба в эксель и сравнить там не предлагать?)
15 nodrama
 
26.07.21
20:41
(14) глупость сказал, думал что разово надо))
16 ДедМорроз
 
26.07.21
20:42
А что так сложно преобразовать дерево в таблицу?
И потом,если пользователь чего-то меняет из данных,то проще сразу проставить флаг изменения.
При желании,можно при изменении сразу модифицировать таблицу.

Ну и любителям ЗначениеВСтроку и др.сериализаций - печаль вас настигнет,когда в двух ветвях будут ссылки на одну и ту же структуру.
А уж про самовложенность с вытекающим срывом стека мы помолчим.
17 H A D G E H O G s
 
26.07.21
20:45
(16) Вот как самовложенность произойдет - тогда и приходите.
18 ДедМорроз
 
26.07.21
22:14
Да зачем мне приходить.
php и с самовложенностью и с множественной вложенностью работает на ура.
Просто,сохранить граф в xml задача непростая.
19 fisher
 
27.07.21
10:33
(0) Просто прекрати делать это часто и всех делов. При открытии рассчитывай дерево а в процессе работы поддерживай актуальными одновременно два представления.