Имя: Пароль:
1C
 
УФ. Дерево. ЗначениеВРеквизитФормы.
, ,
0 slabak
 
11.04.17
15:48
Здравствуйте!

Имеется на форме дерево в котором пользователь выбирает определенные элементы и должна быть предусмотрена пометка всех подчиненных строк дерева.

Также имеется код, который это делает, всё работает, но при использовании ЗначениеВРеквизитФормы дерево обновляется и сворачивается до самых верхних элементов. Как избежать этого обновления?

Вот сам код:

Реквизит дерева Отбор - это реквизит булево, выведен в дереве, как флажок у каждой строки, то есть пользователь может отметить самый верхний элемент и все вложенные также будут помечены

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

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

    ЗначениеВРеквизитФормы(тДерево,"Дерево");
КонецПроцедуры;

Процедура ОбходДереваИУстановкаОтбора(тДерево, УстановкаОтбора)
    Для каждого ТекСтр из тДерево.Строки Цикл
        ТекСтр.Отбор = УстановкаОтбора;
        Если ТекСтр.Строки.Количество() > 0 Тогда
            ОбходДереваИУстановкаОтбора(ТекСтр, УстановкаОтбора);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ОбходДереваИСнятиеОтбораУРодителей(СтрокаДерева)
    Если ЗначениеЗаполнено(СтрокаДерева.Родитель) Тогда
        СтрокаДерева.Родитель.Отбор = Ложь;
        ОбходДереваИСнятиеОтбораУРодителей(СтрокаДерева.Родитель);
    КонецЕсли;
КонецПроцедуры


Подскажите, пожалуйста, как правильно обработать дерево без обновления и сворачивания в результате работы с ним?
1 Numerus Mikhail
 
11.04.17
15:59
Никак, на сколько я знаю
Всё что ты можешь это потом развернуть всё дерево.
Ну и запомнить строку на которой ты был и спозиционироваться на ней
2 igork1966
 
11.04.17
16:04
(0) Что тебе мешает работать с данными формы?
3 slabak
 
11.04.17
16:18
(2) как перебирать дерево используя данные формы?
4 igork1966
 
11.04.17
16:19
(3) примерно так (не проверял код )

&НаКлиенте
Процедура УстановитьИспДочек(Дочки, Исп)
    Для каждого Стр Из Дочки Цикл
        Стр.Исп = ТекущиеДанные.Исп;
        УстановитьИспДочек(Стр.ПолучитьЭлементы(), Исп);
    КонецЦикла;
КонецПроцедуры

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

&НаКлиенте
Процедура СписокИспПриИзменении(Элемент)
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    ТекущиеДанные.Исп = ?(ТекущиеДанные.Исп = 2, 0, ТекущиеДанные.Исп);

    УстановитьИспДочек(ТекущиеДанные.ПолучитьЭлементы(), ТекущиеДанные.Исп);

    УстановитьИспРодителей(ТекущиеДанные.ПолучитьРодителя());    
КонецПроцедуры
5 igork1966
 
11.04.17
16:20
(4) + только это для флажка с тремя состояниями.
если не нужно, можно переделать
6 vde69
 
11.04.17
16:23
вот так дерево полностью разворачивается

Для каждого Строка Из Маршрут.ПолучитьЭлементы() Цикл
        Элементы.Маршрут.Развернуть(Строка.ПолучитьИдентификатор(), Истина);
КонецЦикла;
7 НЕА123
 
11.04.17
16:39
судя по коду в (0), не вижу препятствий в исполнении (2)(4)
8 slabak
 
11.04.17
16:46
(5) igork1966 спасибо за совет, сейчас попробую

Всех благодарю за внимание!
9 igork1966
 
11.04.17
16:55
(8) там в первой функции ошибочка
Стр.Исп = Исп; // ТекущиеДанные.
10 slabak
 
11.04.17
17:17
(9) Да, я понял, спасибо большое!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс