Как отключить доступность сортировки по полю динамического списка в управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с динамическими списками в управляемых формах 1С часто возникает проблема производительности, связанная с интерактивной сортировкой. Например, если динамический список построек на базе регистра сведений ВерсииОбъектов из Библиотеки Стандартных Подсистем (БСП) содержит составное ссылочное поле Объект, попытка пользователя отсортировать данные по этой колонке приводит к вызову тяжелых SQL-запросов. Платформа генерирует многочисленные неявные левые соединения (LEFT JOIN) со всеми возможными таблицами ссылок. В результате время выполнения запроса резко возрастает, что может приводить к ошибкам и таймаутам СУБД.

Рассмотрим подробнее, как запретить пользователям устанавливать сортировку по нежелательным полям динамического списка и какие нюансы платформы необходимо учитывать.

Способ 1. Использование метода УстановитьОграниченияИспользованияВПорядке()

Начиная с версии платформы 1С:Предприятие 8.3.10, разработчикам доступен специальный метод программного управления доступностью полей для сортировки — УстановитьОграниченияИспользованияВПорядке() объекта ДинамическийСписок.

Разберем по шагам, как применить данный метод при инициализации формы. Код вызывается на сервере, например, в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Формируем массив путей к полям компоновки, для которых нужно запретить сортировку
    ОграничиваемыеПоля = Новый Массив;
    ОграничиваемыеПоля.Добавить("Объект");
    
    // Применяем ограничение к динамическому списку
    Список.УстановитьОграниченияИспользованияВПорядке(ОграничиваемыеПоля);
    
КонецПроцедуры

Проанализируем ключевые особенности работы этого метода:

  1. Иерархическое (каскадное) ограничение: Указывая имя родительского поля (например, "Объект"), платформа автоматически запрещает сортировку как по самому полю, так и по всем его вложенным реквизитам ("Объект.Код", "Объект.Наименование" и т. д.).
  2. Перезапись списка ограничений: Каждый вызов метода с новым массивом полностью заменяет ранее установленный список ограничений. Если передать пустой массив, все ранее наложенные ограничения на сортировку будут сняты.
  3. Изменение доступных полей: Поля, попавшие под ограничение, исключаются из коллекции доступных полей порядка в диалоге «Настроить список».

Важный нюанс: влияние режима совместимости конфигурации

Выясним причину, по которой указанный метод может отрабатывать не полностью. Если в свойствах конфигурации установлен режим совместимости ниже 8.3.10 (например, 8.2.16), поведение платформы изменяется:

Поле перестает отображаться на закладке «Порядок» в окне «Все действия — Настроить список», однако при щелчке мышью по заголовку соответствующей колонки в самой форме сортировка всё равно может устанавливаться. Чтобы функционал работал полностью (включая блокировку интерактивного клика по шапке колонки), режим совместимости конфигурации должен быть установлен в значение 8.3.10 или выше, либо отключен вовсе.

Способ 2. Ограничение порядка на уровне Схемы Компоновки Данных (СКД)

Если требуется отключить сортировку без использования кода или для конфигураций, работающих в режиме совместимости, разберем настройку через конфигуратор:

  1. Откроем форму и перейдем в свойства реквизита типа ДинамическийСписок.
  2. В посте свойства СхемаКомпоновкиДанных откроем основную схему или список полей компоновки.
  3. На вкладке Поля для соответствующего поля (например, Объект) найдем колонку ограничений использования.
  4. Снимем флаг доступности использования поля в настройках порядка (запрет использования в поле Порядок).

Способ 3. Замена неявных соединений и оптимизация запроса

Если сортировка по данным необходима пользователям, но штатный запрос вызывает проблемы с производительностью СУБД, проанализируем варианты оптимизации самого запроса динамического списка:

  1. Явные соединения в запросе: Избегаем обращения к реквизитам ссылочных полей через точку (например, Объект.Наименование). Вместо этого прописываем явные ЛЕВОЕ СОЕДИНЕНИЕ к конкретным таблицам метаданных и выбираем только нужные поля.
  2. Индексация реквизитов: Для полей и измерений, по которым часто выполняется отбор или сортировка, убедимся, что в конфигураторе установлено свойство Индексировать (или ИндексироватьСДопУпорядочиванием).

Способ 4. Программный контроль пользовательских настроек

Чтобы гарантировать невозможность применения сортировки даже при попытке восстановления сохраненных пользовательских настроек, можно очищать элементы порядка в обработчике формы ПриЗагрузкеПользовательскихНастроекНаСервере:


&НаСервере
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Отклик, Настройки)
    
    ЭлементыПорядка = Список.КомпоновщикНастроек.Настройки.Порядок.Элементы;
    Индекс = ЭлементыПорядка.Количество() - 1;
    
    Пока Индекс >= 0 Цикл
        ЭлементПорядка = ЭлементыПорядка[Индекс];
        Если Строка(ЭлементПорядка.Поле) = "Объект" Тогда
            ЭлементыПорядка.Удалить(ЭлементПорядка);
        КонецЕсли;
        Индекс = Индекс - 1;
    КонецЦикла;
    
КонецПроцедуры

Подводя итоги, наиболее правильным и современным способом отключения сортировки по полю является метод УстановитьОграниченияИспользованияВПорядке() в сочетании с актуальным режимом совместимости платформы 8.3.10 и выше.

← На главную