Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как сравнить два дерева значений?

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

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

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

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

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

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

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

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.