Механизм перетаскивания — Drag&Drop — в системе 1С:Предприятие 8.х

Фрагмент палитры свойств со свойствами РазрешитьНачалоПеретаскивания (enablestartdrag) и РазрешитьПеретаскивание - (enabledrag)

Доброго времени суток, уважаемые читатели блога SoftMaker.kz! В прошлый раз мы рассказали вам

о семи секретах популярности фирмы 1С
.
А в этой статье будет рассматриваться механизм перетаскивания (Drag&Drop)
на примере табличного поля документа (куда осуществляется перетаскивание) и табличного поля
обработки (откуда осуществляется перетаскивание). Для начала создадим документ и обработку с табличными полями.


Предоставление данных для перетаскивания из обработки

Создадим обработку «Обработка1» форму для неё во вкладке Формы. Откроем форму и добавим новый
элемент управления формы «ТабличноеПоле1». Для поддержки механизма перетаскивания существует два
свойствва элемента управления «ТабличноеПоле1»:

  • «РазрешитьНачалоПеретаскивания»(«EnableStartDrag») — Разрешает перетаскивание данных из элемента управления
  • «РазрешитьПеретаскивание» («EnableDrag») — Разрешает перетаскивание данных в элемент управления

Эти свойства устанавливаются в палитре свойств:

Фрагмент палитры свойств со свойствами РазрешитьНачалоПеретаскивания (enablestartdrag) и РазрешитьПеретаскивание - (enabledrag)

Элементу управления «ТабличноеПоле1» нужно
разрешить предоставлять данные для перетаскивания, поэтому мы установим
галочку для свойства «РазрешитьНачалоПеретаскивания» («EnableStartDrag»):

Палитра свойств со свойством РазрешитьНачалоПеретаскивания установленном в значение «Истина»

Cвойство
элемента управления «ТабличноеПоле1»
«РазрешитьНачалоПеретаскивания» («EnableStartDrag») мы
оставим без изменения, так как в табличное поле обработки мы добавлять
ничего не будем.
Теперь обратим внимание на последовательность событий при
перетаскивании. Когда в
режиме «1С:Предприятие», мы выделяем кнопкой мыши
нужную нам строку в
элементе управления «ТабличноеПоле1» и начинаем
перетаскивание, вызывается обработчик события
«НачалоПеретаскивания» («DragStart»), для нашего
элемента управления «ТабличноеПоле1» обработчик
события «ТабличноеПоле1НачалоПеретаскивания».

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

// Из данного табличного поля разрешено только копировать данные.
ПараметрыПеретаскивания.ДопустимыеДействия =
ДопустимыеДействияПеретаскивания.Копирование;

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

Параметры для обработчика события
«ТабличноеПоле1НачалоПеретаскивания»:

Элемент — имеет значение

ТабличноеПоле
и тип — ТабличноеПоле.

ПараметрыПеретаскивания — имеет следующие три свойства:

  • Действие
    (Action)
    – указывает действие перетаскивания
    (Копирование (Copy), Перемещение (Move), Выбор (Choice)
    или Отмена
    (Cancel)) и является значением типа ДействиеПеретаскивания
    (DragAction).
  • ДопустимыеДействия
    (AllowedActions)
    — указывает допустимые действия
    перетаскивания и является
    значением типа ДопустимыеДействияПеретаскивания
    (Копирование,
    Перемещение,
    КопированиеИПеремещение, HеОбрабатывать). При
    помощи этого
    свойства мы
    указали действие Копирование в обработчике события
    «ТабличноеПоле1НачалоПеретаскивания».
  • Значение — содержит
    ссылку на объект, в нашем случае на
    СправочникСсылка.Номенклатура с текущим значением Товар1.

СтандартнаяОбработка (StandardProcessing) — параметр, указывающий нужно
ли производить стандартную обработку перетаскивания.Для
события
«НачалоПеретаскивания» стандартная
обработка — это
начало перетаскивания данных.


Получение данных при их перетаскивании в поле табличного документа

Cоздадим документ «Документ1» и
табличную часть для него во вкладке «Данные» и форму во вкладке «Формы».
Когда мы перетаскиваем строку из элемента управления «ТабличноеПоле1» в табличную часть документа, тогда
вызывается обработчик события «ПроверкаПеретаскивания», для нашего элемента управления «ТабличноеПоле1» обработчик события
«ТабличноеПоле1ПроверкаПеретаскивания».

// Процедура обработчик события ПроверкаПеретаскивания элемента формы ТабличноеПоле1
Процедура ТабличноеПоле1ПроверкаПеретаскивания(Элемент,
ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Колонка)
// Разрешаем перетаскивать только значения типа «СправочникСсылка.Номенклатура»
// или строки табличной части.
Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип(«СправочникСсылка.Номенклатура»)
И НЕ ПараметрыПеретаскивания.Значение.ЭтоГруппа Тогда

ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование;
СтандартнаяОбработка = Ложь;

ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) <>
Тип(«ДокументТабличнаяЧастьСтрока.Документ1.ТабличноеПоле1») Тогда

ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
СтандартнаяОбработка = Ложь;

КонецЕсли;
КонецПроцедуры

Параметры
для обработчика события
«ТабличноеПоле1ПроверкаПеретаскивания»:

Элемент
— имеет значение ТабличноеПоле и тип —
ТабличноеПоле.ПараметрыПеретаскивания —
имеет следующие три
свойства:

  • ДопустимыеДействия — указывает допустимые действия перетаскивания и
    является значением типа ДопустимыеДействияПеретаскивания (Копирование,
    Перемещение, КопированиеИПеремещение, HеОбрабатывать).
    При помощи этого свойства мы указали в обработчике события
    «ТабличноеПоле1ПроверкаПеретаскивания» только
    копирование, если значением перетаскиваемой строки
    является тип «СправочникСсылка.Номенклатура».
  • Действие
    указывает действие перетаскивания (Копирование, Перемещение, Выбор или
    Отмена) и является значением типа
    ДействиеПеретаскивания. Нужно
    учитывать, что свойство
    «Действие» не должно конфликтовать со свойством
    «ДопустимыеДействия», то есть, если значение
    свойства «ДопустимыеДействия» — Перемещение, а
    свойство «Действие» — Копирование, тогда действие
    не разрешено, так как приоритетным является Перемещение. Если поменять
    местами значение свойств, тогда действие разрешено. Также, Копирование
    и Перемещение не вступают в конфликт со значением
    КопированиеИПеремещение.
  • Значение — содержит ссылку на объект, в нашем случае на
    СправочникСсылка.Номенклатура с текущим значением Товар1.

СтандартнаяОбработка
— параметр, указывающий нужно
ли производить вставку передаваемого значения в поле табличного
документа.

Строка — текущая
строка табличного поля

Колонка — текущая колонка табличного поля

Как только происходит опускание
клавиши мыши в элементе управления
документа «ТабличноеПоле1», вызвается обработчик
события «Перетаскивание».

// Процедура обработчик события Перетаскивание 
// элемента формы ТабличноеПоле1
Процедура ТабличноеПоле1Перетаскивание
(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Колонка)
// Разрешаем вставлять только значения
// типа «СправочникСсылка.Номенклатура».
Если ТипЗнч(Значение)<>Тип(«СправочникСсылка.Номенклатура»)
ИЛИ Значение.ЭтоГруппа Тогда
Возврат;
КонецЕсли;
// Если строка с выбранной номеклатурой уже существует, то увеличиваем
// количество, иначе добавляем строку в табличную часть
СтрокаТабличнойЧасти = ТабличнаяЧасть1.Найти(Значение, «Номенклатура»);
Если СтрокаТабличнойЧасти <> Неопределено Тогда
// Увеличиваем количество
СтрокаТабличнойЧасти.Количество = СтрокаТабличнойЧасти.Количество + 1;
Иначе
Если Строка = Неопределено Тогда
// Добавляем новую строку
СтрокаТабличнойЧасти = ТабличнаяЧасть1.Добавить();
Иначе
// Вставляем перед указанной строкой
СтрокаТабличнойЧасти = ТабличнаяЧасть1.Вставить(ТабличнаяЧасть1.Индекс(Строка));
КонецЕсли;
СтрокаТабличнойЧасти.Номенклатура = Значение;
СтрокаТабличнойЧасти.Количество = 1;
Стр = Новый Структура(«Номенклатура, ТипЦен», Значение, Контрагент.ТипЦен);
СтрокаТабличнойЧасти.Цена = РегистрыСведений.ЦеныНоменклатуры.Получить(Стр).Цена;
КонецЕсли;
// Устанавливаем строку текущей
СтрокаТабличнойЧасти.Сумма =
СтрокаТабличнойЧасти.Цена*СтрокаТабличнойЧасти.Количество;
ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока = СтрокаТабличнойЧасти;
КонецПроцедуры

Как
видим набор
параметров у
обработчика события
«Перетаскивание» такой же как и у обработчика
события «ПроверкаПеретаскивания».
И последние в элементе управления «ТабличноеПоле1»
обработки «Обработка1» вызывается обработчик
события «ОкончаниеПеретаскивания». В
этом обработчике события вы можете сами указать какие действия вам
необходимо произвести. Это уже по вашему усмотрению.

Этот блог читают уже более 3000 человек
- читай и ТЫ!
1 ответить
  1. svarkagid.com says:

    Если в приложение включена поддержка механизма drag and drop , то вы можете просто использовать уже существующий потомок класса

    Ответить

Ответить

Want to join the discussion?
Feel free to contribute!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *