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

Доброго времени суток, уважаемые читатели блога 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» вызывается обработчик события «ОкончаниеПеретаскивания». В этом обработчике события вы можете сами указать какие действия вам необходимо произвести. Это уже по вашему усмотрению.

ПОДПИСКА

1 ответить
  1. svarkagid.com говорит:

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

Комментарии закрыты.