Почему не работает перетаскивание строк в табличную часть на форме 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Механизм перетаскивания (Drag-and-Drop) строк между табличными частями или таблицами значений на форме часто используется для удобства пользователей. Однако при добавлении новой таблицы разработчики нередко сталкиваются с ситуацией, когда курсор с перетаскиваемыми данными исчезает или отображает знак запрета при наведении на элемент-приемник. Разберем по шагам, какие свойства элементов формы и обработчики событий влияют на работу перетаскивания и как устранить возможные блокировки.

1. Проверка базовых свойств таблицы-приемника и формы

Если при наведении курсора с зажатой левой кнопкой мыши пропадает значок перетаскиваемого объекта, в первую очередь проверим свойства отображения элементов:

  1. Свойство «ТолькоПросмотр» таблицы: Если у табличной части на форме установлен флаг ТолькоПросмотр = Истина, платформа блокирует интерактивное изменение данных, включая сброс перетаскиваемых строк. Для работы механизма снимите этот флаг или отключите его программно.
  2. Свойство «РазрешитьПеретаскивание»: Убедимся, что в палитре свойств целевой таблицы включен флаг РазрешитьПеретаскивание (или в коде установлено Элементы.ИмяТаблицыПриемника.РазрешитьПеретаскивание = Истина).
  3. Свойство «РазрешитьНачалоПеретаскивания» у источника: Таблица, из которой перетаскиваются строки, обязательно должна иметь активное свойство РазрешитьНачалоПеретаскивания.
  4. Доступность элементов и состояние формы: Если свойство Доступность таблицы установлено в Ложь или сама форма открыта в режиме только для чтения (свойство формы ТолькоПросмотр), перетаскивание будет автоматически заблокировано платформой.

2. Настройка события «ПроверкаПеретаскивания»

Проанализируем работу визуального указателя перетаскивания. Когда мы наводим курсор на элемент-приемник, платформа вызывает событие ПроверкаПеретаскивания. Если структуры таблиц не совпадают или передаются пользовательские структуры данных, стандартный механизм платформы может посчитать операцию недопустимой и заблокировать сброс.

Чтобы явно разрешить перетаскивание и отобразить корректный курсор, переопределим стандартную обработку в событии таблицы-приемника:


&НаКлиенте
Процедура ТаблицаПриемникПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
    
    // Отключаем стандартную проверку соответствия типов платформой
    СтандартнаяОбработка = Ложь;
    
    // Явно указываем разрешенное действие (Копирование или Перемещение)
    ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование;
    
КонецПроцедуры

3. Формирование данных в событии «НачалоПеретаскивания»

Посмотрим на процесс передачи данных из исходной таблицы. По умолчанию в параметрах передаются идентификаторы строк. Если целевая таблица имеет другую структуру или является несвязанным объектом, передадим в ПараметрыПеретаскивания.Значение подготовленные данные:


&НаКлиенте
Процедура ТаблицаИсточникНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
    
    ДанныеСтроки = Элементы.ТаблицаИсточник.ТекущиеДанные;
    
    Если ДанныеСтроки <> Неопределено Тогда
        СтруктураДанных = Новый Структура;
        СтруктураДанных.Вставить("Номенклатура", ДанныеСтроки.Номенклатура);
        СтруктураДанных.Вставить("Количество", ДанныеСтроки.Количество);
        
        ПараметрыПеретаскивания.Значение = СтруктураДанных;
    КонецЕсли;
    
КонецПроцедуры

4. Прием данных в событии «Перетаскивание»

Рассмотрим финальный этап переноса данных. В обработчике события Перетаскивание таблицы-приемника извлечем переданные значения и добавим новую строку в коллекцию. Также параметры Строка и ПоложениеПеретаскивания позволяют вставить строку точно в позицию курсора:


&НаКлиенте
Процедура ТаблицаПриемникПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
    
    СтандартнаяОбработка = Ложь;
    
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Структура") Тогда
        
        // Добавляем строку в табличную часть объекта
        НоваяСтрока = Объект.ТаблицаПриемник.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, ПараметрыПеретаскивания.Значение);
        
    КонецЕсли;
    
КонецПроцедуры

5. Обработка множественного выделения строк

Если у исходной таблицы включено свойство РежимВыделения = Множественный, пользователь может выделить и перетащить сразу несколько строк. В этом случае в процедуре НачалоПеретаскивания сформируем массив структур, а в процедуре Перетаскивание обработаем его в цикле:


&НаКлиенте
Процедура ТаблицаПриемникПеретаскиваниеМножественное(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
    
    СтандартнаяОбработка = Ложь;
    
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
        
        Для Каждого ЭлементМассива Из ПараметрыПеретаскивания.Значение Цикл
            НоваяСтрока = Объект.ТаблицаПриемник.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементМассива);
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры

Таким образом, для стабильной работы Drag-and-Drop достаточно убедиться в отсутствии ограничений на редактирование (флаг ТолькоПросмотр) и корректно определить обработчики проверки и приема перетаскиваемых данных.

← На главную