Сортируем ДанныеФормыДерево на клиенте

17 Comments

  1. alex15650

    ДанныеФормыДерево вообще обделили, и поиск тоже хочется..

    Reply
  2. SeiOkami

    (1) хорошая идея, добавлю в заметки

    Reply
  3. karpik666

    На каком количестве элементов проверялась сортировка? 1С при этом не формирует неявных серверных вызовов?

    Reply
  4. SeiOkami

    (3) боялись серверных вызовов, ибо используется метод Сдвинуть(), но не обнаружили ни по счётчику вызовов, ни по замеру производительности.

    Проверяли так — генерили примитивную таблицу формы из рандомных чисел, а потом сортировали. Перебирали разные алгоритмы. Этим добились того, что 1000 элементов таблицы с рандомными числами диапазоном до 1000 сортируются меньше секунды. 10 000 строк с рандомом до 10 000 тратит время на сортировку ≈ 3 секунды.

    Этой скорости нам достаточно для реализации механизма, где не будет больших объемов строк. Если же дерево более большое, то тут есть много факторов. Скорость клиентской машины, объём других данных на форме (помимо дерева) и так далее.

    + заметили в некоторых ситуациях такую вещь, что перепрыгивание на сервер иногда занимает совершенно неразумное время. Доходило до абсурдного, что для редактирования таблицы данных на сервере, приходилось использовать бесконтекстный вызов сервера, а передавать туда массив со структурами, обрабатывать там в ТЗ, корректировать,обратно превращать в массив со структурами, возвращать как результат функции, а далее уже на клиенте содержимое помещать в таблицу формы. Костыль редкостный, но увеличивал скорость работы в несколько раз.

    Попробуем проанализировать ситуацию, если что-то интересное — будет статья.

    Reply
  5. karpik666

    (4) то есть использовались только числа? Попробуйте такое же количество, но ссылочных элементов, очень интересно как отработает Обработка представления для этих элементов без серверных вызовов, и кэширует ли 1С все представления на клиенте для такого количества элементов

    Reply
  6. karpik666

    (4) при личной проверке довольно часто выходит, что безконтекстная передача таблицы формы может быть дольше, чем контекстный серверный вызов, все зависит от того, какой объем информации содержится в остальных элементах, если по сравнениню с таблицей их пренебрежительно мало, то лучше контекстный вызов.

    Reply
  7. SeiOkami

    (5)

    Да, скорее всего не так классно будет.

    Просто в разработке сортировок по ссылке стараемся максимально избегать. Даже уже привык сортировать по примитивным типам, которые заранее готовятся специально.

    Однако, в данном алгоритме именно сортировка используется только один раз на уровень дерева — СортироватьПоЗначению(). Метод платформенный, никаких «ручных» сравнений нет. Но потестировать нужно, интересно

    Reply
  8. karpik666

    (7) это понятно, но ваш пример далек от реальности, так как вы используйте примитивные типы, то неявных серверных вызовов и не будет, но мне больше кажется, что такой вариант будет все равно вызывать метод сервера. Сам ранее пытался писать код, который максимально бы работал на клиенте, но все старания разбивались о работу самой 1С, которая фоном делала серверные вызовы для кода. которая в теории должен был исполняться только на клиенте.

    Reply
  9. SeiOkami

    (8) пока что в этом алгоритме не замечено было, но Вы правы — нужно проверить на ссылочных типах.

    Reply
  10. SeiOkami

    (9)

    (8)

    Проверил на ссылке. Добавил ссылочную колонку в таблицу формы. Заполнил таблицу ссылками на существующие документы (выбрал первые 10 000 документов и разбросал рандомно по таблице). Сортировка заняла 4 секунды и счётчик вызовов не показал.

    Скорее всего СписокЗначений.СортироватьПоЗначению() использует ГУИДы, а не представления, поэтому обращений на сервер и не требовалось

    Reply
  11. Evg-Lylyk

    (0) Сталкивался с подобной проблемой, чуток анализировал вопрос понял что для большого количества строк на сервере быстрее

    Описанный вариант кажется не оптимальным создает массив сдвигает, быструю сортировку пробовали?

    Reply
  12. SeiOkami

    (10) пробовали с десяток разных алгоритмов, уже и не вспомню. Но остановились на этом. И заполнение списка значений здесь привело хороший прирост. Этот объект быстро сортирует.

    Если у вас есть процедура быстрее, то выкладывайте. Хочется найти «самую-самую» и закрепить в статье.

    Когда появится время, сделаю специальный инструмент для удобного тестирования методов сортировки. Чтобы можно было свою процедуру легко вставить и гонять по скорости

    Reply
  13. karpik666

    (11) проблема не в самом методе сортировки, а в выводе дерева на экран, так как в ссылочном поле происходит северная обработка представления, потому и было интересно как поведет себя 1с. Спасибо, будет желание еще сам проверю работу этого метода

    Reply
  14. Infector

    Есть стандартные команды сортировки для элементов форм. Чаще всего проще обратить на них внимание пользователей и как-то закрепить на командных панелях. Если же сортировать нужно, но без участия пользователей скорее всего этот объект использован не в тему.

    Reply
  15. starik-2005

    А не пробовали сортировать «нативно»? Тем же квиксортом?

    Reply
  16. AlexBober78

    Что-то не выкладывают альтернативные варианты)

    Вообще, какой-нибудь конкурс устроить. Пусть и символический.

    И обработку общую сделать. Для теста с генерацией данных.

    Reply
  17. user1284652

    В общем, самая «нативная» сортировка (не без участия jQuery) у меня получилась следующим образом:

    Все данные в ячейках я вношу в data-attribute, которые легализованы в HTML5. Чтобы метод sort() работал так, как мне надо — данные привожу в к нижнему регистру и заменяю кавычки на апострофы, чтобы не возникла конфликта на уровне HTML.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *