Вход | Регистрация

1С:Предприятие ::

Метки: 

УФ. Дерево. ЗначениеВРеквизитФормы.

Я
   slabak
 
11.04.17 - 15:48
Здравствуйте!

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

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

Вот сам код:

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

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

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

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

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

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


Подскажите, пожалуйста, как правильно обработать дерево без обновления и сворачивания в результате работы с ним?
 
 
   Numerus Mikhail
 
1 - 11.04.17 - 15:59
Никак, на сколько я знаю
Всё что ты можешь это потом развернуть всё дерево.
Ну и запомнить строку на которой ты был и спозиционироваться на ней
   igork1966
 
2 - 11.04.17 - 16:04
(0) Что тебе мешает работать с данными формы?
   slabak
 
3 - 11.04.17 - 16:18
(2) как перебирать дерево используя данные формы?
   igork1966
 
4 - 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, ТекущиеДанные.Исп);

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

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

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

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


Список тем форума
  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует