Перетаскивание строк в табличной части — это удобный механизм, позволяющий пользователю быстро изменять порядок следования номенклатуры, услуг или других данных в документе. В управляемых формах 1С 8.3 этот функционал кажется простым в настройке, однако на практике разработчики часто сталкиваются с ситуациями, когда установленные «галочки» не дают ожидаемого результата. Рассмотрим подробно, как настроить этот механизм и какие скрытые препятствия могут помешать его работе.
Для начала разберем стандартный алгоритм включения перетаскивания. Проанализируем настройки, которые должны быть активированы на уровне элементов формы. Чтобы строки начали перемещаться с помощью мыши, нам необходимо воздействовать на свойства Таблицы (элемента формы, отображающего табличную часть):
РазрешитьНачалоПеретаскивания. Это позволит пользователю «захватить» строку курсором.РазрешитьПеретаскивание. Это позволит таблице «принять» перетаскиваемую строку.ИзменятьПорядокСтрок. Оно также должно быть включено, иначе платформа заблокирует любые попытки изменения индекса строки.Важно помнить, что если в командной панели таблицы отключено Автозаполнение и вручную удалены стандартные кнопки управления порядком (стрелки «Вверх» и «Вниз»), механизм перетаскивания может перестать работать. Платформа воспринимает отсутствие этих команд как сигнал о том, что ручное управление последовательностью строк в данной таблице не предусмотрено дизайном интерфейса.
Выясним причину самой распространенной жалобы пользователей: «Вчера работало, а сегодня — нет». В 1С механизм перетаскивания строк несовместим с интерактивной сортировкой. Если пользователь хотя бы один раз нажал на заголовок колонки (например, отсортировал товары по цене или наименованию), стандартный механизм drag-and-drop блокируется.
Рассмотрим, как это исправить:
Чтобы вернуть возможность перетаскивания, необходимо сбросить сортировку. Это можно сделать через меню «Ещё» — «Установить стандартную настройку». Если вы хотите автоматизировать этот процесс, проанализируем программный способ управления коллекцией Порядок. В некоторых случаях полезно выводить пользователю предупреждение о том, что при установленной сортировке ручное перемещение строк невозможно.
Разберем ситуацию, описанную многими разработчиками при работе с УТ 11.5 и другими современными конфигурациями. Часто настройки, внесенные в расширение, не применяются сразу или требуют дублирования в основной конфигурации. Это связано с особенностями кэширования структуры формы платформой.
Проанализируем шаги для стабильного применения настроек в расширении:
ПриСозданииНаСервере), так как такая установка имеет приоритет над визуальными настройками.Если стандартных свойств недостаточно (например, нужно добавить сложную логику проверки возможности перемещения конкретной строки), мы можем использовать события таблицы. Рассмотрим два ключевых обработчика: ПроверкаПеретаскивания и ПриПеретаскивании.
В событии ПроверкаПеретаскивания мы должны подтвердить платформе, что действие разрешено, предварительно выполнив анализ кода на соответствие бизнес-логике. Посмотрим на пример кода:
&НаКлиенте
Процедура ТоварыПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
// Отключаем стандартную проверку, чтобы реализовать свою логику
СтандартнаяОбработка = Ложь;
// Указываем, что мы разрешаем перемещение
ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение;
КонецПроцедуры
Затем, в обработчике ПриПеретаскивании, мы можем реализовать саму логику сдвига строки. Проанализируем ситуацию, когда нам нужно программно изменить индекс строки в коллекции табличной части документа, используя метод Сдвинуть().
&НаКлиенте
Процедура ТоварыПриПеретаскивании(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
// Получаем исходную строку (которую тянем)
ИсходнаяСтрока = ПараметрыПеретаскивания.Значение;
// Вычисляем индекс целевой строки и текущий индекс
ИндексЦели = Объект.Товары.Индекс(Объект.Товары.НайтиПоИдентификатору(Строка));
ИндексИсточника = Объект.Товары.Индекс(Объект.Товары.НайтиПоИдентификатору(ИсходнаяСтрока));
// Рассчитываем смещение
Смещение = ИндексЦели - ИндексИсточника;
// Выполняем сдвиг
Объект.Товары.Сдвинуть(ИндексИсточника, Смещение);
КонецПроцедуры
Если перетаскивание всё равно не работает, проверим следующие системные настройки:
ТолькоПросмотр установлено в значение Ложь.Изменять порядок строк на уровне объекта метаданных. Оно должно быть включено.Таким образом, мы выяснили, что для реализации перетаскивания строк недостаточно просто включить свойства формы. Необходимо учитывать состояние сортировки, корректность работы расширений и, при необходимости, использовать программные обработчики событий для обеспечения гибкости интерфейса. Для интерактивной проверки и настройки свойств элементов формы в пользовательском сеансе можно использовать обработку для редактирования свойств форм в режиме Предприятия.