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