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

24.06.15

Разработка - Работа с интерфейсом

Реализация механизма Drag and Drop (или, проще говоря, “Перетаскивания”) для ДереваЗначений, расположенного на управляемой форме управляемого приложения 1С 8.2

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример к статье
.rar 4,42Kb
21
21 Скачать (2 SM) Купить за 2 150 руб.

Эта статья является продолжением статьи «Управляемая форма 1С 8.2(8.3) – Работа с деревом значений и таблицей значений. Часть I (Основы)», она будет посвящена реализации механизма Drag and Drop (или, проще говоря, “Перетаскивания”) для ДереваЗначений, расположенного на управляемой форме управляемого приложения 1С 8.2

Основная сложность реализации механизма перетаскивания заключается в том, что у строки ДереваЗначений платформа не позволяет просто изменить родителя, т.е. переподчинить строку. Единственный способ это сделать – создать новую строку вместе со всеми подчиненными строками, т.е. полностью скопировать всю ветку дерева вместе со всей иерархией и подчинить ее требуемой строке-родителю, после чего удалить исходную ветку. Данная задача распадается на две подзадачи:
1). Перед перетаскиванием необходимо проверить корректность данной операции, узел дерева нельзя переносить в узлы, подчиненные ему самому, т.е. родительский узел нельзя переносить в дочерние, т.к. это приведет к “бесконечной рекурсии” и “падению” платформы. Это реализуется с помощью обработчика события ЭлементДеревоПроверкаПеретаскивания(…)
2). Если перетаскивание возможно, то при помощи обработчика ЭлементДеревоПеретаскивание(…) запускается рекурсивная функция, которая создает новую ветку дерева, подчиненную требуемому родителю, а исходную удаляет.

Обращаю особое внимание на то, что в платформе 8.2 реализован механизм множественного выбора элементов, поэтому вышеуказанные операции необходимо произвести для всех выбранных пользователем элементов.

 

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Создание и заполнение "обычного" объекта прикладного типа ДеревоЗначений,
    // который будет отображен на управляемой форме
    ДеревоОбъект = Новый ДеревоЗначений;
    ДеревоОбъект.Колонки.Добавить("Узел", Новый ОписаниеТипов("Строка"));
    Для к1 = 1 По 3 Цикл
        СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
        СтрокаУ1.Узел = "Узел"+к1;
        Для к2 = 1 По 3 Цикл
            СтрокаУ2 = СтрокаУ1.Строки.Добавить();
            СтрокаУ2.Узел = СтрокаУ1.Узел+к2;
            Для к3 = 1 По 3 Цикл
                СтрокаУ3 = СтрокаУ2.Строки.Добавить();
                СтрокаУ3.Узел = СтрокаУ2.Узел+к3;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

    // Создание Реквизита формы типа ДанныеФормыДерево
    МассивДобавляемыхРеквизитов = Новый Массив;
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево", Новый ОписаниеТипов("ДеревоЗначений")));
    Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
        МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево"));
    КонецЦикла;
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

    // Преобразование объекта прикладного типа ДеревоЗначений
    // в реквизит управляемой формы (данные формы)
    ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");

    // Создание элемента формы типа ТаблицаФормы для отображения дерева
    ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
    ЭлементДерево.ПутьКДанным = "Дерево";
    ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;

    Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
        НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ЭлементДерево);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
    КонецЦикла;

    // Добавим обработчики и установим свойства
    ЭлементДерево.МножественныйВыбор=Истина;
    ЭлементДерево.РазрешитьПеретаскивание=Истина;
    ЭлементДерево.РазрешитьНачалоПеретаскивания=Истина;
    ЭлементДерево.УстановитьДействие("ПроверкаПеретаскивания", "ЭлементДеревоПроверкаПеретаскивания");
    ЭлементДерево.УстановитьДействие("Перетаскивание", "ЭлементДеревоПеретаскивание");

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

&НаКлиенте
Функция ПроверитьВозможностьПереноса(ПереносимыйЭлемент, Знач НовыйРодитель)

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

    Возврат Истина;

КонецФункции

&НаКлиенте
Функция СкопироватьСтрокуДерева(РеквизитДерево, Приемник, Источник)

    Перем НоваяСтрока, ОбратныйИндекс, КолПодчиненныхСтрок;

    // Источник может быть уже перенесен
    // Это произходит если выделены несколько элементов
    // одной и той же ветви дерева на разных уровнях иерархии
    Если Источник = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;

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

    ЗаполнитьЗначенияСвойств(НоваяСтрока, Источник);

    КолПодчиненныхСтрок = Источник.ПолучитьЭлементы().Количество();
    Для ОбратныйИндекс = 1 По КолПодчиненныхСтрок Цикл
        ПодчиненнаяСтрока = Источник.ПолучитьЭлементы()[КолПодчиненныхСтрок - ОбратныйИндекс];
        СкопироватьСтрокуДерева(РеквизитДерево, НоваяСтрока, ПодчиненнаяСтрока);
    КонецЦикла;

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

    Возврат НоваяСтрока;

КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


http://www.obrabotki.com/1s-tree-table-managedforms-2/

1с 8.2 1с 8.3 Дерево значений Таблица значений Управляемые формы

См. также

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    62986    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    18855    26    6    

41

Работа с интерфейсом Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

1500 руб.

06.10.2020    10229    7    7    

10

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    31743    dsdred    74    

214

Механизмы платформы 1С Программист Платформа 1С v8.3 Россия Бесплатно (free)

При знакомстве с новой механикой работы с асинхронностью (обещание, ждать и асинх) делал пометки, которыми и хочу поделиться. Ничего сверхъестественного в них нет, просто небольшие примеры и некоторые всплывшие нюансы использования.

29.07.2022    66000    zeltyr    25    

213

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    5756    kalyaka    6    

33

Механизмы платформы 1С Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    34141    Infostart    84    

248
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ЧерныйКот 27.02.17 14:15 Сейчас в теме
Спасибо, полезно!
Только не понял про ОбратныйИндекс, зачем он?
2. VerunchikNe 25.10.19 11:42 Сейчас в теме
Спасибо за сэкономленное время!
Оставьте свое сообщение