Механизм перетаскивания — 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 не будет опубликован. Обязательные поля помечены *