Возможности перетаскивания, примеры использования, помощь в понимании и отладке механизма работы (8.3, управляемые формы)

Программирование - Практика программирования

Механизм перетаскивания используется редко, а ведь его использование может помочь в реализации интуитивно понятных функций, которые могут весьма ускорить работу пользователя, и получить в итоге более дружественный интерфейс.
Данная обработка не содержит копированного из Синтакс-Помощника текста (его вы сможете прочитать и сами). Она показывает примеры использования перетаскивания; позволяет прямо в режиме Предприятия протестировать, проверить и отладить основные приёмы работы; понять принцип вызова событий и увидеть состав их параметров.

Перетаскивание в 1С представлено 4-мя событиями, которые доступны для следующих объектов:

  • поле формы/Расширение календаря
  • поле формы/Расширение картинки
  • поле формы/Расширение планировщика
  • поле формы/Расширение табличного документа
  • таблица формы/ТаблицаФормы
  • декорация формы/Расширение картинки


События НачалоПеретаскивания (стартовое) и ОкончаниеПеретаскивания (финишное) возникают в Источнике,  доступны при установке признака "Разрешить начало перетаскивания".

События ПроверкаПеретаскивания (первое промежуточное)и Перетаскивание (второе промежуточное) возникают в Приёмнике, доступны при установке признака "Разрешить перетаскивание".

В каждом событии доступны ПараметрыПеретаскивания, состоящие из Действие, ДопустимыеДействия, Значение.
Действие (тип ДействиеПеретаскивания) оказывает влияние на вид курсора (три варианта -- обычный, с плюсиком и отмена) и принимает четыре возможных значения:

  • Выбор (при перетаскивании правой кнопкой -- будет открыто всплывающее меню; срабатывает не во всех случаях), 
  • Копирование (при перетаскивании левой кнопкой с нажатым Ctrl), 
  • Отмена, 
  • Перемещение (при перетаскивании левой кнопкой).

ДопустимыеДействия (тип ДопустимыеДействияПеретаскивания) задаёт доступные действия в приёмнике и принимает значения:

  • Копирование, 
  • КопированиеИПеремещение, 
  • НеОбрабатывать, 
  • Перемещение. 


Событие Перетаскивание может не возникать в приёмнике -- если ДопустимыеДействия в НачалеПеретаскивания установлены в "НеОбрабатывать" или в событии ПроверкаПеретаскивания Действие установлено в "Отмену". Также Перетаскивание не возникает при несовместимости типов приёмника и источника (когда иконка курсора уже имеет вид "Отмена", независимо от параметров).

По умолчанию типы считаются совместимыми, если в качестве приёмника выступает ТаблицаФормы или ПолеТабличногоДокумента.

 

В источнике:
Изменение Действия не вызовет ошибки, но ни на что не влияет и смысла не имеет.

Изменение ДопустимыхДействий имеет смысл только в событии НачалоПеретаскивания, значение будет доступно во всех событиях, но нигде больше не может быть изменено. Задаёт первоначальный вид курсора (Перемещение, Копирование или Отмена) и набор доступных действий в приёмнике.
В случае установки значения "НеОбрабатывать" гарантированно не будет вызвано событие Перетаскивание, а в событие ОкончаниеПеретаскивания автоматически уйдёт Действие="Отмена".
В случае установки значения "Копировать" в событие ОкончаниеПеретаскивания автоматически уйдёт Действие="Копирование", даже если Ctrl не нажата.

В приёмнике:
Изменение Действия в ПроверкеПеретаскивания может влиять на вид курсора в случае понижения (Перемещение -> Копирование -> Отмена). В случае установки "Отмена" не будет вызвано событие Перетаскивание, в событие ОкончаниеПеретаскивания автоматически уйдёт Действие="Отмена".
Изменение Действия в Перетаскивании (только в случае понижения) уйдёт в событие ОкончаниеПеретаскивания.

Изменение ДопустимыхДействий не вызовет ошибки, но ни на что не влияет и смысла не имеет.

NB! По собственному опыту -- при работе с перетаскиванием возможны падения 1С:Предприятия, видимо, сказывается факт редкого использования (и как следствие -- недостаточного тестирования тестирования) этого механизма в типовых конфигурациях. Неоднократно воспроизводились, в частности, на платформе 8.3.6 при действиях на вкладке "Поддерживаемые по умолчанию элементы".

Возможно в каких-то выводах о работе механизма есть неточности -- не судите строго, пишите, исправлю. Обработка внутри содержит данный текст.

Ссылки по теме:
http://kb.mista.ru/article.php?id=326 (TormozIT, "v8:Глобальное перетаскивание") -- немного устарело в плане поддерживаемых элементов форм.
http://its.1c.ru/db/v83doc/bookmark/dev/TI000000433 (ИТС, "7.6.13. Механизм перетаскивания")

Скачать файлы

Наименование Файл Версия Размер
ВозможностиПеретаскивания
.epf 20,26Kb
17.11.15
37
.epf 1.0.0 20,26Kb 37 Скачать

См. также

Комментарии
1. Яков Коган (Yashazz) 2119 19.11.15 11:58 Сейчас в теме
при работе с перетаскиванием возможны падения 1С:Предприятия, видимо, сказывается факт редкого использования (и как следствие -- недостаточного тестирования тестирования) этого механизма в типовых конфигурациях.

Да уж. "тестирования тестирования" этому механизму явно не хватает, ибо косячит он давно и разнообразно. Про любой фрагмент вышенаписанного можно сказать "срабатывает не во всех случаях", а квинтэссенцией любых знаний на эту тему является "пробуйте сами, авось сработает".
Светлый ум; +1 Ответить
2. Яков Коган (Yashazz) 2119 01.12.15 12:42 Сейчас в теме
Добавка в тему, наблюдал только что на релизе 8.3.6.2390: если в табличном поле нет ни одной строки, перетаскивание не срабатывает, иконка в виде значка запрета, хотя всё включено и в событиях отказов нет. А вот как только появляется хотя бы одна строка, сразу начинает нормально работать.
3. Александр Полетаев (Alias) 35 01.12.15 13:24 Сейчас в теме
(2) Yashazz, это актуально только для дерева значений. На обычном табличном поле всё нормально.
На примере этой обработки -- на первой вкладке иконка для пустой таблицы-приёмника будет разрешающая. На второй вкладке (где как раз дерево) -- иконка для пустого дерева будет запрещающая. Почему такое ограничение -- не знаю.
4. Яков Коган (Yashazz) 2119 01.12.15 13:33 Сейчас в теме
(3) Alias, именно. Причём получатель-дерево может находиться даже в режиме отображения "список", а всё равно пофигу.
5. Сергей Михаев (Eskimos) 19 13.04.16 17:17 Сейчас в теме
Что за хитрая конструкция?\

Выполнение = Ложь;
6. Александр Полетаев (Alias) 35 18.04.16 15:47 Сейчас в теме
(5) Eskimos, Выполнение -- это стандартный третий параметр события НачалоПеретаскивания, С-П говорит о нём, что он "управляет выполнением перетаскивания. Если в теле процедуры-обработчика установить данному параметру значение Ложь, перетаскивание не начнется. Значение по умолчанию: Истина."
В данном примере Выполнение=Ложь; используется для отмены самой возможности начала перетаскивания в некоторых примерах (вообще нельзя ничего перетащить, можно только нажав Ctrl , можно только правой кнопкой мыши).
7. Сергей Бестужев (bestuzhev) 662 17.05.17 14:19 Сейчас в теме
По умолчанию типы считаются совместимыми, если в качестве приёмника выступает ТаблицаФормы или ПолеТабличногоДокумента.

А можно как-то самому указать какие типы совместимы а какие нет, я например хочу перетащить картинку одну на другую и при этом потом поменять их местами?
8. Александр Полетаев (Alias) 35 17.05.17 15:35 Сейчас в теме
(7) Обычно поведение системы "по умолчанию" можно изменить(отменить), используя СтандартнаяОбработка=Ложь. В данном случае -- в событии ПроверкаПеретаскивания у приёмника.
Однако я приложил обработку -- почему-то не смог добиться правильного поведения. Если я использую СтандОбр=Ложь, переопределяя тем самым картинку курсора в приемнике, то сразу перестаёт вызываться событие ОкончаниеПеретаскивания в источнике (возможно, это недоработка платформы?).

И получается что всё работает, но со старого места картинка не удаляется. Конечно, можно очистить её в событии приёмника, но это будет неправильно -- т.к. в нём мы не знаем откуда именно пришло перетаскивание. В случае двух элементов такой вариант будет допустим, но не более.
Прикрепленные файлы:
ПоменятьМестамиКартинки.epf
9. Александр Полетаев (Alias) 35 05.06.17 14:02 Сейчас в теме
(8) описал ошибочное поведение в ветке https://partners.v8.1c.ru/forum/topic/1611250 , ответов не было, видимо тема не очень популярная. Однако судя по тому что в разных версиях (8.2-8.3) платформы обработка выполняется по разному, очень может быть ошибка платформы 8.3.
Оставьте свое сообщение