При работе с динамическими списками в управляемых формах 1С часто возникает проблема производительности, связанная с интерактивной сортировкой. Например, если динамический список построек на базе регистра сведений ВерсииОбъектов из Библиотеки Стандартных Подсистем (БСП) содержит составное ссылочное поле Объект, попытка пользователя отсортировать данные по этой колонке приводит к вызову тяжелых SQL-запросов. Платформа генерирует многочисленные неявные левые соединения (LEFT JOIN) со всеми возможными таблицами ссылок. В результате время выполнения запроса резко возрастает, что может приводить к ошибкам и таймаутам СУБД.
Рассмотрим подробнее, как запретить пользователям устанавливать сортировку по нежелательным полям динамического списка и какие нюансы платформы необходимо учитывать.
Начиная с версии платформы 1С:Предприятие 8.3.10, разработчикам доступен специальный метод программного управления доступностью полей для сортировки — УстановитьОграниченияИспользованияВПорядке() объекта ДинамическийСписок.
Разберем по шагам, как применить данный метод при инициализации формы. Код вызывается на сервере, например, в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Формируем массив путей к полям компоновки, для которых нужно запретить сортировку
ОграничиваемыеПоля = Новый Массив;
ОграничиваемыеПоля.Добавить("Объект");
// Применяем ограничение к динамическому списку
Список.УстановитьОграниченияИспользованияВПорядке(ОграничиваемыеПоля);
КонецПроцедуры
Проанализируем ключевые особенности работы этого метода:
"Объект"), платформа автоматически запрещает сортировку как по самому полю, так и по всем его вложенным реквизитам ("Объект.Код", "Объект.Наименование" и т. д.).Выясним причину, по которой указанный метод может отрабатывать не полностью. Если в свойствах конфигурации установлен режим совместимости ниже 8.3.10 (например, 8.2.16), поведение платформы изменяется:
Поле перестает отображаться на закладке «Порядок» в окне «Все действия — Настроить список», однако при щелчке мышью по заголовку соответствующей колонки в самой форме сортировка всё равно может устанавливаться. Чтобы функционал работал полностью (включая блокировку интерактивного клика по шапке колонки), режим совместимости конфигурации должен быть установлен в значение 8.3.10 или выше, либо отключен вовсе.
Если требуется отключить сортировку без использования кода или для конфигураций, работающих в режиме совместимости, разберем настройку через конфигуратор:
ДинамическийСписок.СхемаКомпоновкиДанных откроем основную схему или список полей компоновки.Объект) найдем колонку ограничений использования.Порядок).Если сортировка по данным необходима пользователям, но штатный запрос вызывает проблемы с производительностью СУБД, проанализируем варианты оптимизации самого запроса динамического списка:
Объект.Наименование). Вместо этого прописываем явные ЛЕВОЕ СОЕДИНЕНИЕ к конкретным таблицам метаданных и выбираем только нужные поля.Индексировать (или ИндексироватьСДопУпорядочиванием).Чтобы гарантировать невозможность применения сортировки даже при попытке восстановления сохраненных пользовательских настроек, можно очищать элементы порядка в обработчике формы ПриЗагрузкеПользовательскихНастроекНаСервере:
&НаСервере
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Отклик, Настройки)
ЭлементыПорядка = Список.КомпоновщикНастроек.Настройки.Порядок.Элементы;
Индекс = ЭлементыПорядка.Количество() - 1;
Пока Индекс >= 0 Цикл
ЭлементПорядка = ЭлементыПорядка[Индекс];
Если Строка(ЭлементПорядка.Поле) = "Объект" Тогда
ЭлементыПорядка.Удалить(ЭлементПорядка);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
Подводя итоги, наиболее правильным и современным способом отключения сортировки по полю является метод УстановитьОграниченияИспользованияВПорядке() в сочетании с актуальным режимом совместимости платформы 8.3.10 и выше.