Имя: Пароль:
1C
1С v8
УФ и ДеревоЗначений
0 PuhUfa
 
25.09.15
17:58
У формы есть реквизит Дерево, тип - "ДеревоЗначений"
На форме лежит Таблица, путь к данным - "Дерево"

&НаСервере
Процедура ЗаполнитьДеревоСервер()
    
    ВрДерево = РеквизитФормыВЗначение("Дерево");
    ВрДерево.Строки.Очистить();
    СтрокаКорень = ВрДерево.Строки.Добавить();
    ...
    ЗначениеВРеквизитФормы(ВрДерево, "Дерево");
КонецПроцедуры

&НаКлиенте
Процедура ПеречитатьДерево(Команда)
    ЗаполнитьДеревоСервер();
    Элементы.Таблица.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;
КонецПроцедуры


Дерево заполняется как надо, но проблема в том, что при повторном вызове ПеречитатьДерево(Команда) происходит задвоение (а потом затроение и т.д.) строк нижнего уровня дерева.
Ставил:
Дерево.ПолучитьЭлементы().Очистить();
перед
ЗначениеВРеквизитФормы(ВрДерево, "Дерево");
результат тот же. Где косяк?
1 Fedor-1971
 
25.09.15
18:19
(0) пробуй очищать так:

ур1=Дерево.ПолучитьЭлементы();
ур1.Очистить();


Как вариант заполнения без преобразования в объект дерево:

   нов=ур1.Добавить();
   заполняешь свои колонки уровня 1
   ур2=нов.ПолучитьЭлементы();
   нов2=ур2.Добавить();

если очень нужно сможешь заполнить по такому алгоритму НаКлиенте
2 PuhUfa
 
25.09.15
18:25
(1) все нормально... косяк на моей стороне был, исходные данные, для заполнения дерева, косячные были.
Осталось только понять почему криво работает:
Элементы.Таблица.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;
И на сегодня хватит -)
При первом проходе дерево раскрыто как и положенно. А при последующих вызовах оно всегда остается свернутым на корню.
3 Fedor-1971
 
25.09.15
18:33
(2) Добавь Элементы.Дерево.Развернуть(идСтроки) для каждой ветки верхнего уровня.
4 PuhUfa
 
25.09.15
18:50
(3) Хм... Верхний уровень 1... Пишу:
Элементы.Дерево.Развернуть(0,Истина);
В первом проходе все нормально... при повторном:
{Форма.ФормаОтчетаУправляемая.Форма(86)}: Ошибка при вызове метода контекста (Развернуть)
    Элементы.Таблица.Развернуть(0,Истина);
по причине:
Отсутствует строка данных
5 Fedor-1971
 
26.09.15
10:17
(4) на клиенте перебери элементы первого уровня, даже если он один, примерно так:

Для каждого Ур1 из Элементы.Дерево цикл
  Ур1.Развернуть(Ур1.ПолучитьИдентификатор(), Истина);
КонецЦикла;
6 Fedor-1971
 
26.09.15
10:18
5+ Уверен что есть строка с ИД=0?
7 PuhUfa
 
26.09.15
12:42
(6) Да, есть при первом проходе.
Эксперименты показали, что при первом заполнении ИД имеют значения от 0 до 24 (если в дереве 25 строк), при втором уже от 25 до 49, потом от 50 и т.д.

(5) В итоге так и сделал:
    КоллекцияЭлементовДерева =дерево.ПолучитьЭлементы();
    Для Каждого Строка Из КоллекцияЭлементовДерева Цикл    
        ИдентификаторСтроки = Строка.ПолучитьИдентификатор();
    КонецЦикла;    
    Элементы.Таблица.Развернуть(ИдентификаторСтроки,Истина);

Получился конечно "костыль", но для пользователя работает как надо.
Спасибо!
8 Fedor-1971
 
26.09.15
14:12
(7) Развернуть - в цикл положи, если будет несколько элементов верхнего уровня, то развернётся только последний.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший