Странное поведение сортировки в УФ

1. triviumfan 93 11.06.21 15:37 Сейчас в теме
Доброго дня.
Переношу обработку с обычных форм на управляемые, стараясь сохранить основную логику (что довольно тяжело, оказывается).

Имеется табличная часть обработки и таблица значений.

Так вот я заметил, что сортировка в управляемом приложении невероятно дольше работает!
В обычном за милисекунды отрабатывает.
Притом я пробовал делать это как на сервере, так и на клиенте - везде 2-3 секунды всего лишь для 1000 строк.
Замер производительности показывает, что основное время тратится на серверный вызов и передачу 1000 строк (2+ секунды).
Клиентский вызов Сортировать() для ДанныхФормыКоллекция также делает неявный серверный вызов.

ЧЯДНТ?!
ЗЫ: Передача через временное хранилище ведь тут не нужна? У меня форма одна и я в ней все делаю. Или может внеконтекстный вызов делать... форма тяжёлая...
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
27. triviumfan 93 13.06.21 17:47 Сейчас в теме
Как оказалось - это нормальное поведение управляемого приложения.
Возьмите любой документ с множеством количеством строк и убедитесь, что сортировка по любому полю будет занимать более 2 секунд :)
При том, не важно какой клиент (веб, толстый или тонкий).
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 11.06.21 15:43 Сейчас в теме
(1)
Клиентский вызов Сортировать() для ДанныхФормыКоллекция также делает неявный серверный вызов.
Интересно, а если сделать алгоритмическую сортировку на клиенте, будет ли быстрее.
3. triviumfan 93 11.06.21 15:46 Сейчас в теме
(2) тоже стало интересно; а как ссылочные типы сравнивать, по идентификатору?
4. SlavaKron 11.06.21 15:51 Сейчас в теме
(3) Можно попробовать воспользоваться методом списка значений СортироватьПоЗначению. Вроде бы не делает серверный вызов.
5. Sashares 34 11.06.21 15:53 Сейчас в теме
(1) У вас есть и реквизит формы таблица значений и табличная часть в объекте, судя по коду с одинаковыми значениями, а зачем? Они обе на форме отображаются для работы?
6. triviumfan 93 11.06.21 16:00 Сейчас в теме
(5) Там логика сложная и до меня написанная. Сперва заполняется таблица значений, далее что-то с ней делают, и в конце уже сортируют и загружают в ТЧ. ТЗ как вспомогательная и невидима. Но даже если я просто буду сортировать на клиенте саму ТЧ, то разницы в быстродействии никакой.
7. Sashares 34 11.06.21 16:14 Сейчас в теме
(6) Я немного о другом.
Даже если у вас ТЗ невидима, она содержит данные и вы ее тащите каждый раз на клиент.
Если вы с ТЗ работаете только на сервере, и она вам нужна только на сервере, храните ее во временном хранилище - адрес хранить в реквизите формы с типом Строка.
То есть заполнили ТЗ на сервере, положили во временное хранилище.
Надо что-то с ТЗ сделать - пошли на сервер, достали из временного хранилища, изменили, положили обратно. Если возможно, то внеконтекстно.

Чем меньше данных в форме, тем быстрее форма будет работать.
9. triviumfan 93 11.06.21 16:38 Сейчас в теме
(7) нуу... у меня слишком много обращений к этой ТЗ. И никакое временное хранилище тут не оптимизирует клиент-серверные вызовы. Не хочу ковыряться в этом.
Вообще речь сейчас про сортировку ТЧ =)
11. Sashares 34 11.06.21 16:46 Сейчас в теме
(9)Вы просто еще ТЗ тоже сортируете, и она потом едет на клиент, что тоже может влияет на общее время.
8. SlavaKron 11.06.21 16:18 Сейчас в теме
Еще есть такой нюанс, если сортируются значения ссылочного типа, то метод Сортировать таблицы значений (и, подозреваю, табличной части) по умолчанию делает это по представлению. Фактически, это есть запрос в цикле. Заполняйте второй параметр метода – СравнениеЗначений.
10. YanTsys 12 11.06.21 16:42 Сейчас в теме
От сортировки ТЗ ее смысл не меняется? Тогда зачем вы ее повторно в табличную часть загружаете? Нужно сортировку телать в ТЧ а не в ТЗ.

Объект.ЛучшиеПредложения.Сортировать(СписокКолонок);


И у вас нет обработки событий в ТЧ?
ПриИзменении?
ПриАктивизацииСтроки?
и т.д.?
13. triviumfan 93 11.06.21 16:56 Сейчас в теме
(10)
И у вас нет обработки событий в ТЧ?
ПриИзменении?
ПриАктивизацииСтроки?
и т.д.?

Нету
12. triviumfan 93 11.06.21 16:55 Сейчас в теме
(10) (11) Изначально было вообще вот так:
Процедура ПоЦенеНажатие(Элемент)
	
	ОсуществляетсяСортировка=Истина;
	НТЗЛучшиеПредложения.Сортировать("СортировочныеЗначения, ИскомыйТовар Убыв, ЦенаПродажи");
	ЛучшиеПредложения.Очистить();
	ЛучшиеПредложения.Загрузить(НТЗЛучшиеПредложения);
	ЛучшиеПредложения.Сортировать("СортировочныеЗначения, ИскомыйТовар Убыв, ЦенаПродажи");

КонецПроцедуры
Показать

Приходится работать с этим. Просто сегодня ещё пятница и я подустал, перенёс как есть в УФ, теперь вижу, что нет смысла это делать повторно. ТЗ вообще ещё где-то отдельно сортируется и методом Сортировать() и даже в запросе. Там логика ппц.

Сейчас исправил, оставив лишь сортировку ТЧ. Но это не даёт ответ, почему сортировка на клиенте такая медленная!
15. Sashares 34 11.06.21 16:59 Сейчас в теме
(12)А реквизиты через точку в таблицу не выведены?
16. triviumfan 93 11.06.21 17:00 Сейчас в теме
(15) Нет, а по ним и сортировка невозможна в принципе.
14. triviumfan 93 11.06.21 16:59 Сейчас в теме
Очень многие делают замечание про повторную сортировку. Исправил! Ничего не изменилось - 2 секунды сортировка.
Прикрепленные файлы:
18. spacecraft 11.06.21 17:12 Сейчас в теме
(12)
почему сортировка на клиенте такая медленная!

(14)
Ничего не изменилось - 2 секунды сортировка.

Так это не чистое время сортировки. Передача данных формы на сервер и обратно (в том числе сериализация/десериализация) занимают большую часть времени.
19. SlavaKron 11.06.21 17:37 Сейчас в теме
(14) Попробуйте так на клиенте:
Объект.ЛучшиеПредложения.Сортировать("СортировочныеЗначения, ИскомыйТовар Убыв, ЦенаПродажи", "СравнениеЗначений");
20. spacecraft 11.06.21 18:33 Сейчас в теме
(19) Вызов метода выполняет обращение к серверу.
21. SlavaKron 11.06.21 18:43 Сейчас в теме
(20) Это понятно. Суть оптимизации объяснена в (8). Трактовать время неявного серверного вызова (2 секунды) можно по-разному. Это необязательно расходы на передачу данных формы, в него также входит время получения представления на сервере и сама сортировка.
22. spacecraft 11.06.21 19:02 Сейчас в теме
(21) чем это поможет?
Объект для сравнения значений по правилам, совпадающим с правилами сравнения значений в базе:
Элементы, чьи типы не совпадают, сравниваются по коду типа;
Элементы простых типов сравниваются по значению;
Объекты сравниваются по идентификатору;
Моменты времени сравниваются по дате и идентификатору объекта;
Элементы остальных типов сравниваются по строковому представлению.
24. SlavaKron 11.06.21 19:14 Сейчас в теме
(22) Тем, что сравнение будет по значению, а не по представлению.
(23) Без понятия. Но, например, тем, что в обычных формах в 8.2 в принципе не предполагается ОбработкаПолученияПредставления.
25. spacecraft 11.06.21 19:41 Сейчас в теме
(24) если бы что-то сложное и ресурсоемкое было в ОбработкаПолученияПредставления, то это сказывалось бы на каждом открытии списка номенклатуры, в том числе и при выборе. Думаю это сразу бы заметили.
А получение текстового представления из базы так же будет отрабатывать и в 8.2 при сортировке.
23. spacecraft 11.06.21 19:07 Сейчас в теме
(21) и чем отличается сортировка на сервере в УФ от сортировки в толстом клиенте обычного приложения? Так что сомнительно что получение строкового представления на что-то сильно влияет.
26. triviumfan 93 13.06.21 13:50 Сейчас в теме
(19)
СравнениеЗначений

Никакой разницы. И по замерам нет разницы, сортировка по простым типам колонок или ссылочным.
В общем, если явно на сервере сортировать, то 3 секунды, если на клиенте (с неявным вызовов сервера) - 1.5-2.
И это всего лишь на 1000 строк.
17. YanTsys 12 11.06.21 17:10 Сейчас в теме
Значит зря ТЗ включили в состав объекта.
Поместите во временное хранилище и используйте только на стороне сервера не гоняя ее туда сюда с клиента на сервер и обратно.
А в составе формы храните только строку АдресХранилища.
27. triviumfan 93 13.06.21 17:47 Сейчас в теме
Как оказалось - это нормальное поведение управляемого приложения.
Возьмите любой документ с множеством количеством строк и убедитесь, что сортировка по любому полю будет занимать более 2 секунд :)
При том, не важно какой клиент (веб, толстый или тонкий).
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот