Для элементов управления, поддерживающих операции перетаскивания (например, табличного поля или поля картинки), существует возможность использования контекстного меню для выбора определенного действия, осуществляемого при окончании перетаскивания. По умолчанию выбор из контекстного меню осуществляется при окончании перетаскивания при помощи правой кнопки мыши. При стандартной обработке перетаскивания, осуществляемого правой кнопкой мыши, контекстное меню состоит из команд Перенести, Скопировать и Отмена, осуществляющих соответственно, перемещение или копирование данных из одного элемента управления в другой, а также отмену перетаскивания.
При перетаскивании, осуществляемом при помощи правой кнопки мыши, в свойстве Действие параметра ПараметрыПеретаскивания, обработчиков событий перетаскивания, устанавливается специальный тип действия - Выбор (значение типа ДействиеПеретаскивания), указывающий, что при окончании перетаскивания данных, после вызова обработчика события Перетаскивание(), будет осуществлен выбор действия перетаскивания из стандартного меню.
В некоторых случаях требуется подменить стандартное меню перетаскивания своим. Для этого необходимо в обработчике события Перетаскивание() сформировать свое меню, осуществить выбор из него, а стандартную обработку перетаскивания отменить.
Поясним использование контекстного меню на следующем примере. Пусть существует форма документа "ПриходнаяНакладная", содержащая табличную часть "Состав". Требуется осуществлять перемещение строк табличной части при помощи мыши, причем вставку перемещаемой строки необходимо осуществлять до или после выбранной строки табличной части.
Для решения данной задачи необходимо в табличном поле, отображающем табличную часть "Состав", разрешить предоставлять и принимать данные при перетаскивании. Для этого необходимо установить свойства "Разрешить начало перетаскивания" и "Разрешить перетаскивание". Сделать это можно непосредственно из встроенного языка 1С:Предприятия или используя палитру свойств.
Так как требуется осуществлять только перемещение строк, то необходимо запретить копирование данных при перетаскивании. Для этого необходимо в обработчике события НачалоПеретаскивания() табличного поля, отображающего табличную часть "Состав", установить доступные действия перетаскивания - Перемещение.
Копировать в буфер обменаПроцедура СоставНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) // Разрешаем только перемещение строк. ПараметрыПеретаскивания.ДопустимыеДействия = ДопустимыеДействияПеретаскивания.Перемещение; КонецПроцедуры
Затем необходимо обработать событие Перетаскивание() табличного поля. В обработчике данного события необходимо определить действие перетаскивания, анализируя свойство Действие параметра ПараметрыПеретаскивания данного события. Если действием перетаскивания является Выбор, то необходимо выбрать из меню одно из перечисленных действий:
Пример обработчика события Перетаскивание() приведен ниже:
Копировать в буфер обменаПроцедура СоставПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка) СтандартнаяОбработка = Ложь; Действие = "ПеренестиПеред"; Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Выбор Тогда // Осуществляем выбор из меню. Список = Новый СписокЗначений; // Если строка, над которой находится объект перетаскивания, неопределена, то вставляем строку // в конец табличной части, иначе выбираем вставлять до или после указанной строки. Если Строка = Неопределено Тогда Список.Добавить("ПеренестиПосле", "Перенести в конец"); Список.Добавить("Отмена", "Отмена"); Иначе Список.Добавить("ПеренестиПеред", "Перенести перед"); Список.Добавить("ПеренестиПосле", "Перенести после"); Список.Добавить("Отмена", "Отмена"); КонецЕсли; Действие = ВыбратьИзМеню(Список, Элемент).Значение; ИначеЕсли ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда Действие = "Отмена"; КонецЕсли; // Осуществление перетаскивания Если Действие = "ПеренестиПеред" Тогда // Перенести перед индексСтрокиТЧ = Состав.Индекс(ПараметрыПеретаскивания.Значение); Если Состав.Индекс(Строка) - индексСтрокиТЧ < 0 Тогда смещение = Состав.Индекс(Строка) - индексСтрокиТЧ; Иначе смещение = Состав.Индекс(Строка) - индексСтрокиТЧ - 1; КонецЕсли; Состав.Сдвинуть(индексСтрокиТЧ, смещение); ИначеЕсли Действие = "ПеренестиПосле" Тогда // Перенести после индексСтрокиТЧ = Состав.Индекс(ПараметрыПеретаскивания.Значение); Если Строка <> Неопределено Тогда Если Состав.Индекс(Строка) - индексСтрокиТЧ < 0 Тогда смещение = Состав.Индекс(Строка) - индексСтрокиТЧ + 1; Иначе смещение = Состав.Индекс(Строка) - индексСтрокиТЧ; КонецЕсли; Иначе смещение = Состав.Количество() - индексСтрокиТЧ - 1; КонецЕсли; Состав.Сдвинуть(индексСтрокиТЧ, смещение); КонецЕсли; КонецПроцедуры
Более подробно ознакомиться с особенностями реализации перетаскивания можно в разделе Особенности реализации перетаскивания в формах.