|
8.3. УФ. Сортировка ДанныеФормыДерево без передачи всей формы на сервер | ☑ | ||
---|---|---|---|---|
0
SeiOkami
14.11.18
✎
15:58
|
Добрый день.
Есть ли какие-нить способы отсортировать ДанныеФормыДерево (рекурсивно) либо в бесконтестной серверной функции, либо на клиенте? Сейчас обработка делает сортировку так: ДеревоЗначений = ДанныеФормыВЗначение(ДанныеФормыДерево, Тип("ДеревоЗначений")); ДеревоЗначений.Строки.Сортировать("ПриоритетСортировки", Истина); ЗначениеВДанныеФормы(ДанныеФормыДерево, ДеревоЗначений); Сортировка происходит быстро. НО для её выполнения приходится выполнять процедуру &НаСервере. Получается, что большая часть времени занимает именно переход с клиента на сервер. |
|||
1
SeiOkami
14.11.18
✎
16:03
|
Может у кого есть клиентсская процедурка сортировки, чтобы велосипед не изобретать
|
|||
2
SeiOkami
14.11.18
✎
16:10
|
уп
|
|||
3
SeiOkami
14.11.18
✎
16:25
|
туц
|
|||
4
SeiOkami
14.11.18
✎
17:02
|
Сделал простенькую универсальную процедуру по сортировки. Вроде работает, завтра потестирую глубже.
|
|||
5
SeiOkami
14.11.18
✎
17:02
|
&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыДерево(КоллекцияСортировки, КолонкаСортировки, ВключатьПодчиненные = Ложь) КоллекцияСтрок = КоллекцияСортировки.ПолучитьЭлементы(); ПоследнийИндекс = КоллекцияСтрок.Количество()-1; Для ТекущийИндекс = 1 По ПоследнийИндекс Цикл Если ТекущийИндекс = 0 Тогда Продолжить; КонецЕсли; ТекущаяСтрока = КоллекцияСтрок[ТекущийИндекс]; ПрошлаяСтрока = КоллекцияСтрок[ТекущийИндекс-1]; Если ТекущаяСтрока[КолонкаСортировки] < ПрошлаяСтрока[КолонкаСортировки] Тогда КоллекцияСтрок.Сдвинуть(ТекущийИндекс, -1); ТекущийИндекс = ТекущийИндекс-2; КонецЕсли; КонецЦикла; Если ВключатьПодчиненные Тогда Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл СортироватьДанныеФормыДерево(ТекущаяСтрока, КолонкаСортировки, ВключатьПодчиненные); КонецЦикла; КонецЕсли; КонецПроцедуры |
|||
6
Вафель
14.11.18
✎
17:08
|
пузырьком чтоли?
А вот говорили что не нужен пузырек для 1сника ))) |
|||
7
Sasha_H
14.11.18
✎
17:11
|
(5) странная какая-то сортировка у тебя
|
|||
8
Сияющий в темноте
14.11.18
✎
18:52
|
можно еще сортировку перестановками как в квиксорт делать,очень быстро работает.
|
|||
9
Cyberhawk
14.11.18
✎
18:54
|
ДФК на клиенте обходится, а значит и сортироваться может
|
|||
10
SeiOkami
15.11.18
✎
08:11
|
(7), подглядел "гномью" сортировку из ИС http://catalog.mista.ru/public/204320/
Переделал под дерево Вроде пашет. Надо потестить хорошенько и для таблицы такую же сделать) Иногда реально нет смысла из-за маленького дерева гнать все данные на сервер и обратно |
|||
11
Сияющий в темноте
15.11.18
✎
09:20
|
Гномью сортировку,если поиск делать дихотомией,вполне можно использовать-она интуитивно понятна.
А всякие современные методы с режимом галопа и т.п.прозрачностью не блещут. |
|||
12
SeiOkami
15.11.18
✎
10:29
|
Сделал такую же для таблицы формы. На небольших объемах работает быстро. На больших не тестил. Может кому пригодится:
&НаКлиентеНаСервереБезКонтекста Процедура СортироватьДанныеФормыДерево(КоллекцияСортировки, КолонкаСортировки, ВключатьПодчиненные = Ложь) КоллекцияСтрок = КоллекцияСортировки.ПолучитьЭлементы(); СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки); Если ВключатьПодчиненные Тогда Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл СортироватьДанныеФормыДерево(ТекущаяСтрока, КолонкаСортировки, ВключатьПодчиненные); КонецЦикла; КонецЕсли; КонецПроцедуры &НаКлиентеНаСервереБезКонтекста Процедура СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки) ПоследнийИндекс = КоллекцияСтрок.Количество()-1; Для ТекущийИндекс = 1 По ПоследнийИндекс Цикл Если ТекущийИндекс = 0 Тогда Продолжить; КонецЕсли; ТекущаяСтрока = КоллекцияСтрок[ТекущийИндекс]; ПрошлаяСтрока = КоллекцияСтрок[ТекущийИндекс-1]; Если ТекущаяСтрока[КолонкаСортировки] < ПрошлаяСтрока[КолонкаСортировки] Тогда КоллекцияСтрок.Сдвинуть(ТекущийИндекс, -1); ТекущийИндекс = ТекущийИндекс-2; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
13
SeiOkami
16.11.18
✎
10:53
|
Извращения продолжаются...
Оптимизация в стопитсот раз Интересно, почему можно сортировать таблицу без перекидывания формы на сервер, а дерево нельзя &НаКлиентеНаСервереБезКонтекста Процедура СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки) ПараметрыЗначений = Новый Соответствие; СортированныеЗначения = Новый СписокЗначений; Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл ТекущееЗначение = ТекущаяСтрока[КолонкаСортировки]; ПараметрыЗначения = ПараметрыЗначений.Получить(ТекущееЗначение); Если ПараметрыЗначения = Неопределено Тогда ПараметрыЗначения = Новый Массив; ПараметрыЗначений.Вставить(ТекущееЗначение, ПараметрыЗначения); СортированныеЗначения.Добавить(ТекущееЗначение); КонецЕсли; ПараметрыЗначения.Добавить(ТекущаяСтрока); КонецЦикла; СортированныеЗначения.СортироватьПоЗначению(НаправлениеСортировки.Возр); НовыйИндекс = 0; Для Каждого ТекущееЗначение Из СортированныеЗначения Цикл МассивСтрок = ПараметрыЗначений.Получить(ТекущееЗначение.Значение); Для Каждого ТекущаяСтрока Из МассивСтрок Цикл ТекущийИндекс = КоллекцияСтрок.Индекс(ТекущаяСтрока); ШагСдвига = НовыйИндекс - ТекущийИндекс; Если НЕ ШагСдвига = 0 Тогда КоллекцияСтрок.Сдвинуть(ТекущийИндекс, ШагСдвига); КонецЕсли; НовыйИндекс = НовыйИндекс + 1; КонецЦикла; КонецЦикла; КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |