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