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

1С:Предприятие :: 1С:Предприятие 8 общая

Перетаскивание строк в дереве (как поменять поведение элементов)

Перетаскивание строк в дереве (как поменять поведение элементов)
Я
   AndrewM
 
30.11.17 - 16:41
Уважаемые знатоки!

Как заставить строку дерева встать в подчинение под другую строку?

Дано: на управляемой форме есть дерево. Когда я перетаскиваю строку из одного уровня вложенности в строку с другим уровнем либо в соседнюю ветку, тогда переносимая строка встаёт под выбранного родителя.
Скрин 1 (всё норм): http://polariton.ad-l.ink/85Zy4m7GF/image.png
Но когда я тяну строку в соседнюю, у которой тот же уровень вложенности, она не заходит в подчинение к строке, а встаёт рядом, то есть работает просто как перемещение строки.
Скрин 2 (не норм, хочу по-другому): http://meson.ad-l.ink/8mYFtG75s/image.png

Вопрос: как сделать так, чтобы строка заходила в подчинение к строке, даже если у них одинаковый уровень вложенности? То есть чтобы в "Скрин 2" было также, как в "Скрин 1".

В обработчиках При/ПриОкончании Перетаскивания не вижу в параметрах строку назначения, куда тянется строка. В параметрах обработчиков хранится только сама перетаскиваемая строка.
 
 
   DmitrO
 
1 - 30.11.17 - 16:49
В событии Перетаскивание в параметрах есть и Строка и Поле.
   AndrewM
 
2 - 04.12.17 - 11:12
(1) Забыл написать ответ. Вот что получилось:

Спасибо за наводку. Сделал через поиск по идентификатору.
Только переносить строку к другому родителю приходится на сервере, что не очень удобно, т.к. приходится выгружать/загружать дерево, а из-за этого пользователь видит, что обновилась вся таб.часть и что курсор встаёт на первую строку, что немного напрягает, если строк много.

<code>
&НаКлиенте
Процедура Расш1_деревоСоставПеретаскиваниеВместо(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
    
    лТекЭлемент = Элемент.ТекущиеДанные;
    лКлючиПереносимыхСтрок = Новый Массив;
    Для Каждого лЭлемент Из ПараметрыПеретаскивания.Значение Цикл
        лПереносимаяСтрока = деревоСостав.НайтиПоИдентификатору(лЭлемент);
        лКлючиПереносимыхСтрок.Добавить(лПереносимаяСтрока.КлючСвязи);
    КонецЦикла;
    лНазначение = деревоСостав.НайтиПоИдентификатору(Строка);
    Если лНазначение <> Неопределено Тогда
        лРодительНазначения = лНазначение.ПолучитьРодителя();
        лРодительТекущий = лТекЭлемент.ПолучитьРодителя();
        Если лРодительТекущий = лРодительНазначения Тогда
            СтандартнаяОбработка = Ложь;
            ИзменитьРодителя(лКлючиПереносимыхСтрок, лНазначение.КлючСвязи);
            ПоказатьУровеньДерева(уровеньРазвертки);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура ИзменитьРодителя(лКлючиПереносимыхСтрок, лКлючРодителя)
    
    лДерево = РеквизитФормыВЗначение("деревоСостав");
    Для Каждого лКлючСвязи Из лКлючиПереносимыхСтрок Цикл
        лСтрокаТекущая = лДерево.Строки.Найти(лКлючСвязи, "КлючСвязи", Истина);
        лСтрокаРодителя = лДерево.Строки.Найти(лКлючРодителя, "КлючСвязи", Истина);
        Если лСтрокаТекущая <> Неопределено И лСтрокаРодителя <> Неопределено Тогда
            ДобавитьНовуюВеткуРодителю(лСтрокаРодителя, лСтрокаТекущая);
            лСтрокаТекущая.Родитель.Строки.Удалить(лСтрокаТекущая);
        КонецЕсли;
    КонецЦикла;
    ЗначениеВРеквизитФормы(лДерево, "деревоСостав");
    
КонецПроцедуры
</code>

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