Механизм перетаскивания — Drag&Drop — в системе 1С:Предприятие 8.х
Доброго времени суток, уважаемые читатели блога SoftMaker.kz! В прошлый раз мы рассказали вам о семи секретах популярности фирмы 1С. А в этой статье будет рассматриваться механизм перетаскивания (Drag&Drop) на примере табличного поля документа (куда осуществляется перетаскивание) и табличного поля обработки (откуда осуществляется перетаскивание). Для начала создадим документ и обработку с табличными полями. Давайте приступим!
- Предоставление данных для перетаскивания из обработки
- Получение данных при их перетаскивании в поле табличного документа
Предоставление данных для перетаскивания из обработки
Создадим обработку «Обработка1» форму для неё во вкладке Формы. Откроем форму и добавим новый элемент управления формы «ТабличноеПоле1». Для поддержки механизма перетаскивания существует два свойства элемента управления «ТабличноеПоле1»:
- «РазрешитьНачалоПеретаскивания»(«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» вызывается обработчик события «ОкончаниеПеретаскивания». В этом обработчике события вы можете сами указать какие действия вам необходимо произвести. Это уже по вашему усмотрению.
Если в приложение включена поддержка механизма drag and drop , то вы можете просто использовать уже существующий потомок класса