Имя: Пароль:
1C
 
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;
            
        КонецЦикла;
        
    КонецЦикла;
    
КонецПроцедуры
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс