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

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    178905    992    403    

949

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

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

2 стартмани

06.02.2025    1854    14    XilDen    26    

35

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

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

18.10.2024    12541    sergey279    18    

65

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

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

11.10.2024    7573    XilDen    36    

91

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

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

16.08.2024    10216    user1840182    5    

29

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    3037    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    12206    implecs    6    

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