Самое плохое, что выполняется не один неявный запрос к базе данных, а несколько десятков тысяч мелких запросов с получением данных из ссылки для сортировки. Запросы мелкие и выполняются быстро, которые сложно найти, так как часто даже при сборке ТЖ (технологический журнал) ставится отбор на время выполнения запроса. А если одновременно несколько сотрудников начинают активно добавлять пользователей, тогда мелкими запросами отнимали от ½ до 2/3 от общего количества запросов к базе данных, что тормозит выполнения всех запросов (сильно зависит от серверов и размера базы данных).
Шаг 1, попробуем заменить получение сортированного списка запросом, например,
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка КАК Пользователь ИЗ Справочник.Пользователи ГДЕ Ссылка В (&Список) УПОРЯДОЧИТЬ ПО Наименование");
Запрос.УстановитьПараметр("Список", Приемник);
Приемник = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Пользователь");
Данный запрос вынесем в отдельную функцию на сервере, для возможности выполнения его с клиента.
Результат приятно удивил - вместо 12,93 сек стало 1,58 сек, что в 8 раз быстрее.
Шаг 2, аналогичное изменение применил и для открытия формы в процедуре «ЗаполнитьТаблицы», сортировку добавил на уровне запроса, а сортировку результата убрал, результат тоже хороший - с 11,88 сек время сократилось до 0,53, что быстрее в 22 раза.
Шаг 3, по идее на этом можно было и завершить, но при добавлении нескольких десятков пользователей по-прежнему занимает много времени. Самый простой и очевидный способ - отключить автоматическую сортировку списков, и это дает значительное ускорение до 0,0003 сек, что в 5267 раз быстрее, чем на шаге 2, и в 43100 раз быстрее, чем изначально.
Пример реализации, с отключением автоматической сортировки.
Итого получили следующие результаты:
Время |
стандарт |
оптимизация |
дельта, раз |
||||||
Открытие (О) |
Большой (Б) |
Маленький (М) |
О |
Б |
М |
О |
Б |
М |
|
автообновление |
11,88 |
12,93 |
0,2 |
0,53 |
1,58 |
0,01 |
22 |
8 |
20 |
без обновления |
11,88 |
12,93 |
0,2 |
0,53 |
0,0003 |
0,0013 |
22 |
43100 |
154 |
Улучшение есть на списке любого объема, даже на маленьком (5 пользователей). Но время 0,2 сек не заметно, но когда количество пользователей переваливает одну или две сотни, тогда время занимает около секунды на операциях открытия списка и изменении, что уже может вызывать проблемы. То есть если у вас более 100 пользователей в базе, и вы используете внешние обработки или отчеты на регулярной основе, есть смысл задуматься об этом улучшении.
Вместо вывода, проблемы бывают даже в самых неожиданных местах, и нет предела совершенству.
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.18.41
- 1С:Управление холдингом 3.2 (русский и английский интерфейсы), релизы 3.2.4.2