Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений. Часть II (Реализация DRAG and DROP)


&НаКлиенте
Процедура ЭлементДеревоПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания,
        СтандартнаяОбработка, Строка, Поле)

    // Узел нельзя переносить в узлы подчиненные ему самому
    // т.е. родительский узел нельзя переносить в дочерние.
    // Проверим это условие для всех выделенных элементов

    СтандартнаяОбработка = Ложь;

    РеквизитДерево = ЭтаФорма["Дерево"];

    ИДНовыйРодитель = Строка;
    // Если НовыйРодитель = Неопределено => Корень дерева
    НовыйРодитель = ?(ИДНовыйРодитель = Неопределено, Неопределено,
        РеквизитДерево.НайтиПоИдентификатору(ИДНовыйРодитель));

    МассивИДПереносимыхЭлементов = ПараметрыПеретаскивания.Значение;

    Для каждого ИДПереносимыйЭлемент из МассивИДПереносимыхЭлементов Цикл

        ПереносимыйЭлемент = РеквизитДерево.НайтиПоИдентификатору(
            ИДПереносимыйЭлемент);

        Если НЕ ПроверитьВозможностьПереноса(ПереносимыйЭлемент,
                    НовыйРодитель) Тогда
            ПараметрыПеретаскивания.Действие=ДействиеПеретаскивания.Отмена;
            Прервать;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ЭлементДеревоПеретаскивание(Элемент, ПараметрыПеретаскивания,
        СтандартнаяОбработка, Строка, Поле)

    СтандартнаяОбработка=Ложь;

    РеквизитДерево = ЭтаФорма["Дерево"];

    ИДПриемник = Строка;
    // Если ИДПриемник = Неопределено => Корень дерева
    Приемник = ?(ИДПриемник = Неопределено, Неопределено,
        РеквизитДерево.НайтиПоИдентификатору(ИДПриемник));

    МассивИДИсточник = ПараметрыПеретаскивания.Значение;

    Для Каждого ИДИсточник Из МассивИДИсточник Цикл
        Источник = РеквизитДерево.НайтиПоИдентификатору(ИДИсточник);
        НоваяСтрока = СкопироватьСтрокуДерева(РеквизитДерево,Приемник,Источник);
        // Производится копирование в корень
        // Для "красоты" развернем вновь созданную ветвь
        Если Приемник = Неопределено и НоваяСтрока<>Неопределено Тогда
            Элементы["Дерево"].Развернуть(НоваяСтрока.ПолучитьИдентификатор(),
                Истина);
        КонецЕсли;
    КонецЦикла;

    // Для "красоты" развернем ветвь-родителя
    Если НЕ Приемник = Неопределено Тогда
        Элементы["Дерево"].Развернуть(ИДПриемник, Истина);
    КонецЕсли;

КонецПроцедуры

Скачать обработку

Если публикация показалась Вам полезной и интересной не забывайте оставлять свои отзывы и комментарии, так же Вы можете выразить свою благодарность материально.

Комментарии:

  1. Steelvan пишет:

    Не нашел, куда перечислять благодарность.

    1. Администратор пишет:

      Пользуйтесь на здоровье ))

Оставить комментарий