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

Обход дерева значений на клиенте / развернуть многоуровневое дерево на клиенте

Автор virtus, 10 июл 2014, 17:38

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

virtus

Подскажите, пожалуйста, как обойти дерево значений на клиенте. Или как развернуть те узлы дерева, которые были развернуты до пересчетов итогов в серверной процедуре.

У меня в серверной процедуре обсчитываются итоги. После этого я используя метод ЗначениеВРеквизитФормы(Дерево, "ДеревоЗначений") заполняю дерево на форме. При этом оно становится свернутым.

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

Как можно это решить?

Спасибо.

virtus

Разобрался. Написал в итоге рекурсивные процедуры. Одна запоминает какие развернуты были узлы, потом на сервере процедура пересчитывает итоги, и третья раскрывает узлы, какие были раскрыты до пересчета. Может кому пригодится код:

&НаКлиенте
Процедура ДеревоЗначенийСуммаПриИзменении(Элемент)
    соотвКолонок = Новый Соответствие;
    соотвКолонок.Вставить("Сумма");
   
    РазвернутыеСтроки = Новый Соответствие();
   
   
    КоличествоСтрок = 0;
    ПроверитьСвернутостьДерева(ДеревоЗначений, РазвернутыеСтроки, КоличествоСтрок);
   
    ПосчитатьНаСервере(соотвКолонок);
   
    УстановитьРазвернутостьДерева(ДеревоЗначений, РазвернутыеСтроки, КоличествоСтрок);
   
КонецПроцедуры

&НаКлиенте
Процедура  ПроверитьСвернутостьДерева(пДеревоЗначений, РазвернутыеСтроки, КоличествоСтрок)
    ЭлементыДерева = пДеревоЗначений.ПолучитьЭлементы();
    КоличествоСтрок = КоличествоСтрок + 1;
    Если ЭлементыДерева.Количество() = 0 Тогда Возврат КонецЕсли;
   
    Для Каждого ЭлементДерева Из ЭлементыДерева Цикл
        Идентификатор = ЭлементДерева.ПолучитьИдентификатор();
        РазвернутыеСтроки.Вставить(Идентификатор, Элементы.ДеревоЗначений.Развернут(Идентификатор));
        ПроверитьСвернутостьДерева(ЭлементДерева, РазвернутыеСтроки, КоличествоСтрок);
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьРазвернутостьДерева(пДеревоЗначений, РазвернутыеСтроки, КоличествоСтрок)
    ЭлементыДерева = пДеревоЗначений.ПолучитьЭлементы();
    Если ЭлементыДерева.Количество() = 0 Тогда Возврат КонецЕсли;
    Для Каждого ЭлементДерева Из ЭлементыДерева Цикл
        Идентификатор = ЭлементДерева.ПолучитьИдентификатор();
        Если РазвернутыеСтроки.Получить(Идентификатор - КоличествоСтрок + 1) = Истина Тогда
            Элементы.ДеревоЗначений.Развернуть(Идентификатор);
        КонецЕсли;
        УстановитьРазвернутостьДерева(ЭлементДерева, РазвернутыеСтроки, КоличествоСтрок);
    КонецЦикла;
КонецПроцедуры

Азиман

Зачем нужно соответствие, когда можно создать массив идентефикаторов "свернутых", потом обойти и развернуть иденты по списку.

Теги:

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

Рейтинг@Mail.ru

Поиск