Вход | Регистрация


8.3. УФ. Сортировка ДанныеФормыДерево без передачи всей формы на сервер

8.3. УФ. Сортировка ДанныеФормыДерево без передачи всей формы на сервер
Я
   SeiOkami
 
14.11.18 - 15:58
Добрый день.

Есть ли какие-нить способы отсортировать ДанныеФормыДерево (рекурсивно) либо в бесконтестной серверной функции, либо на клиенте?

Сейчас обработка делает сортировку так:

ДеревоЗначений    = ДанныеФормыВЗначение(ДанныеФормыДерево, Тип("ДеревоЗначений"));
        ДеревоЗначений.Строки.Сортировать("ПриоритетСортировки", Истина);
        ЗначениеВДанныеФормы(ДанныеФормыДерево, ДеревоЗначений);


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

Переделал под дерево
Вроде пашет. Надо потестить хорошенько и для таблицы такую же сделать)

Иногда реально нет смысла из-за маленького дерева гнать все данные на сервер и обратно
 
 Рекламное место пустует
   Сияющий в темноте
 
11 - 15.11.18 - 09:20
Гномью сортировку,если поиск делать дихотомией,вполне можно использовать-она интуитивно понятна.
А всякие современные методы с режимом галопа и т.п.прозрачностью не блещут.
   SeiOkami
 
12 - 15.11.18 - 10:29
Сделал такую же для таблицы формы. На небольших объемах работает быстро. На больших не тестил. Может кому пригодится:

&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыДерево(КоллекцияСортировки, КолонкаСортировки, ВключатьПодчиненные = Ложь)
    
    КоллекцияСтрок    = КоллекцияСортировки.ПолучитьЭлементы();
    
    СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки);
    
    Если ВключатьПодчиненные Тогда
        Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл
            СортироватьДанныеФормыДерево(ТекущаяСтрока, КолонкаСортировки, ВключатьПодчиненные);
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры


&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки)
    
    ПоследнийИндекс    = КоллекцияСтрок.Количество()-1;
    
    Для ТекущийИндекс = 1 По ПоследнийИндекс Цикл
        
        Если ТекущийИндекс = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        ТекущаяСтрока    = КоллекцияСтрок[ТекущийИндекс];
        ПрошлаяСтрока    = КоллекцияСтрок[ТекущийИндекс-1];
        
        Если ТекущаяСтрока[КолонкаСортировки] < ПрошлаяСтрока[КолонкаСортировки] Тогда
            КоллекцияСтрок.Сдвинуть(ТекущийИндекс, -1);
            ТекущийИндекс    = ТекущийИндекс-2;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры
   SeiOkami
 
13 - 16.11.18 - 10:53
Извращения продолжаются...

Оптимизация в стопитсот раз
Интересно, почему можно сортировать таблицу без перекидывания формы на сервер, а дерево нельзя




&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки)
    
    ПараметрыЗначений        = Новый Соответствие;
    СортированныеЗначения    = Новый СписокЗначений;
    
    Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл
        
        ТекущееЗначение    = ТекущаяСтрока[КолонкаСортировки];
        
        ПараметрыЗначения    = ПараметрыЗначений.Получить(ТекущееЗначение);
        Если ПараметрыЗначения = Неопределено Тогда
            ПараметрыЗначения    = Новый Массив;
            ПараметрыЗначений.Вставить(ТекущееЗначение, ПараметрыЗначения);
            СортированныеЗначения.Добавить(ТекущееЗначение);
        КонецЕсли;
        
        ПараметрыЗначения.Добавить(ТекущаяСтрока);
        
    КонецЦикла;
    
    СортированныеЗначения.СортироватьПоЗначению(НаправлениеСортировки.Возр);
    
    
    НовыйИндекс    = 0;
    Для Каждого ТекущееЗначение Из СортированныеЗначения Цикл
        
        МассивСтрок    = ПараметрыЗначений.Получить(ТекущееЗначение.Значение);
        Для Каждого ТекущаяСтрока Из МассивСтрок Цикл
            
            ТекущийИндекс    = КоллекцияСтрок.Индекс(ТекущаяСтрока);
            ШагСдвига        = НовыйИндекс - ТекущийИндекс;
            Если НЕ ШагСдвига = 0 Тогда
                КоллекцияСтрок.Сдвинуть(ТекущийИндекс, ШагСдвига);
            КонецЕсли;
            
            НовыйИндекс    = НовыйИндекс + 1;
            
        КонецЦикла;
        
    КонецЦикла;
    
КонецПроцедуры

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует