Имя: Пароль:
1C
1С v8
Перетаскивание строк в дереве (как поменять поведение элементов)
0 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".

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

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

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

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