Имя: Пароль:
1C
 
Вопрос по дереву значений
0 Meilleur
 
03.10.16
13:58
В событии ПриИзменении() для дерева значений программно меняю значение в одном из полей. И после этого все узлы ДЗ сворачиваются автоматически.

Подскажите, как избежать этого сворачивания ДЗ?

Вот код:
    ДеревоОбъект = РеквизитФормыВЗначение("ДеревоПК", Тип("ДеревоЗначений"));
    
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Позиция", вхПозиция);
    ПараметрыОтбора.Вставить("Наименование", вхНаименование);
    СтрокиДерева = ДеревоОбъект.Строки.НайтиСтроки(ПараметрыОтбора, Истина);
    Если СтрокиДерева.Количество() > 0 Тогда
        СтрокиДерева[0][вхПараметрИмя] = вхЗначение;
    КонецЕсли;
    
    ЗначениеВРеквизитФормы(ДеревоОбъект, "ДеревоПК");
1 DrShad
 
03.10.16
14:03
узлы не сворачиваюся а дерево заново рисуется
2 Meilleur
 
03.10.16
14:07
(1) Хорошо.

Как тогда запомнить состояние (развёрнут/свёрнут) по каждому из узлов, чтобы потом при "заново рисуется" восстановить положение? И каким событием перехватить перерисовку?

Или как можно отказаться от перерисовки дерева?
3 Fedor-1971
 
03.10.16
14:10
(0) перебирай ЭлементФормы.ДеревоПК через ПолучитьЭлементы(), а не через преобразование в тип ДеревоЗначений.
При обратном преобразовании дерево заново перестроится с параметрами установленными при настройки элемента формы (НачальноеОтображениеДерева - Раскрывать все уровни - дерево будет развёрнутым).
4 DrShad
 
03.10.16
14:11
то есть менять дерево на клиенте
5 Fedor-1971
 
03.10.16
14:13
(2) не преобразовывать, а перебирать
стр=ЭлементыФормы.ДеревоПК.ТекущиеДанные; - текущая ветка
УровеньВниз=стр.ПолучитьЭлементы();
УровеньВверх=стр.ПолучитьРодителя();
6 Fedor-1971
 
03.10.16
14:16
(4) можно и наСервере, только придётся получить текущую строку через ПолучитьПоИдентификатору()
7 Meilleur
 
03.10.16
14:20
(4) У меня вся обработка на сервере ведётся...
Получается, мне надо на выходе этой обработки получать нужное значение и в ТекущиеДанные по имени колонки это значение подставлять? В таком случае дерево не будет перерисовываться?
8 Meilleur
 
03.10.16
14:21
(6) ПолучитьПоИдентификатору()?

НайтиПоИдентификатору(). Наверное, Вы это имели ввиду? И опять же, как это отразится на перерисовке дерева?

Попробую так сделать...
9 Meilleur
 
03.10.16
14:22
(6) Попробую сделать как в (3)
10 Fedor-1971
 
03.10.16
14:27
(8) на дереве обновятся только текущие данные
11 Meilleur
 
03.10.16
14:38
(10) Сделал как в (3)
    Флаг = Ложь;
    ВсеСтроки = ДеревоПК.ПолучитьЭлементы();
    Для Каждого Строка Из ВсеСтроки Цикл
        Если Строка.Позиция = вхПозиция И Строка.Наименование = вхНаименование Тогда
            Строка[вхПараметрИмя] = вхЗначение;
            Прервать;
        Иначе
            ВсеПодстроки = Строка.ПолучитьЭлементы();
            Для Каждого Подстрока Из ВсеПодстроки Цикл
                Если Подстрока.Позиция = вхПозиция И Подстрока.Наименование = вхНаименование Тогда
                    Подстрока[вхПараметрИмя] = вхЗначение;
                    Флаг = Истина;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
        Если Флаг Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;


Наверное, не очень красиво получилось. Но зато работает. Потом ещё причещу...

Фёдор, спасибо за помощь!
12 Meilleur
 
03.10.16
15:04
(6)
Так ещё проще получилось:

    ТекДанные = ДеревоПК.НайтиПоИдентификатору(вхИД);
    ТекДанные[вхПараметрИмя] = вхЗначение;

Ещё раз спасибо!