|   |   | 
| 
 | УФ. Дерево. ЗначениеВРеквизитФормы. | ☑ | ||
|---|---|---|---|---|
| 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) Да, я понял, спасибо большое!     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |