Перенос произвольного количества элементов на новую позицию в нумерованном списке

08.08.19

Разработка - Запросы

Алгоритм перемещения позиций в нумерованном списке одним запросом.

Предыстория вопроса: На предприятии есть прайс-лист, разбитый на подразделы. Последовательность позиций выстраивается не по алфавиту, а по присвоенному номеру (реквизит справочника). Позиции могут перемещаться по последовательности в рамках группы свободно (нужно для выделения или группировки тех или иных позиции в зависимости от настроения %) ). Изначально перемещение позиций было сделано по образцу таблиц значения: на одну позицию вверх, на одну позицию вниз стрелочками. По мере разрастания каталога продукции передвижение позиций становилось все более трудоемким, в итоге после жалоб ответственных за прайс я принял решение сделать возможность перетаскивать позиции стандартным драгунддпропом.

Возможно я изобретаю велосипед и не умею в поиск, но подходящих мне вариантов не нашел. Публикую свой вариант решения.

Итак, задача: переместить произвольные выделенные позиции в списке на новое место в нумерации. 

Размещать позиции считаю правильным перед элементом (корень, k) на который мы "сбрасываем"  выделенные элементы , и алгоритм я буду строить для такого варианта.

Что нужно определить в первую очередь? Диапазон, который затрагивает перемещение, поскольку  при переносе элементов затрагиваются только позиции лежащие между минимальным номером min(nk)в списке перемещения K (корень тоже учитываем) и максимальным max(nk). Для остальных позиций нумерация не меняется.

Вторым шагом необходимо выстроить по возрастанию список выделенных для переноса элементов, поскольку  выделение может происходить не по порядку следования элементов. Делается это через объединение таблицы переносимых элементов с самой собой и подсчетом количества позиций лежащих ниже вычисляемой sum(nk<n). Для больших списков  квадратичная трудоемкость алгоритма нумерации будет влиять сильно, но вряд ли кто в здравом уме будет одновременно переносить больше сотни выделенных элементов, поэтому трудоемкостью пренебрегаем.

Третий шаг - вычисление смещения переносимых элементов относительно корня sum(nk<K)(например если корень=11, а переносим 8,9, 12, 13 и 15, смещение будет 2 или количество элементов стоящих по порядку ниже корня). Смещение укажет нижний диапазон, с которого начнется новая нумерация перенесенных элементов. В объединенном запросе эти шаги будут идти не по порядку, я показываю ход мысли при решении задачи.

Четвертый шаг - вычисление множества "неподвижных" элементов Е ={min(nk)<=n<max(nk)}\K и смещение их на количество позиций, появившихся в результате перемещения . Решается с помощью соединения с таблицей перемещаемых элементов. При соединении подсчитывается сколько перемещаемых позиций стоят ниже элементов которые сами ниже корня sum(nk<ne|ne<k) и соответственно количество стоящих выше для элементов выше корня sum(nk>ne|ne>k). Это будет индивидуальное смещение для каждого "неподвижного" элемента в диапазоне.

Запрос готов:

 

Теперь в списке нужно прописать процедуры перетаскивания:

 

Готово. Можно перетаскивать выделенные элементы в любом количестве с любой позиции.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184738    1029    403    

968

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2201    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5734    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13140    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8220    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3193    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10802    user1840182    5    

29
Оставьте свое сообщение