Как отключить сортировку в динамическом списке при нажатии на заголовок колонки?

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

В разработке на платформе 1С:Предприятие 8.3 часто возникает задача зафиксировать определенный порядок строк в динамическом списке и запретить пользователю его менять (Методы доработки динамических списков из моей практики [март 2026]). Стандартное поведение платформы предполагает, что клик по заголовку колонки автоматически перестраивает список. Рассмотрим подробнее, какими методами можно ограничить или полностью отключить эту возможность, сохранив при этом удобство интерфейса.

Способ 1. Отключение через пользовательские настройки порядка

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

Разберем этот процесс по шагам:

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

Важный нюанс: когда мы снимаем этот флажок, платформа понимает, что пользователь не должен иметь возможности интерактивно влиять на порядок строк. После этого клик по заголовку любой колонки в режиме «Предприятие» перестанет вызывать пересортировку. Это решение является наиболее «чистым» с точки зрения архитектуры платформы.

Способ 2. Программное ограничение использования полей в порядке

Иногда нам требуется отключить сортировку не для всего списка, а только для конкретных колонок. В этом случае на помощь приходит встроенный язык 1С. Выясним, как использовать метод УстановитьОграниченияИспользованияВПорядке.

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


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

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

Способ 3. Использование особенностей языка запросов (GROUP BY)

Существует интересный технический «трикс», связанный с особенностями работы динамических списков. Если в основном тексте запроса динамического списка используется предложение СГРУППИРОВАТЬ ПО, то платформа по умолчанию ограничивает возможности интерактивной сортировки по полям, не входящим в группировку.

Посмотрим на пример запроса (для отладки сложных выборок используйте Управляемая консоль запросов, отчетов 3.9.0 (расширение, внешняя обработка)):


ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Ссылка,
    СправочникНоменклатура.Код КАК Код,
    СправочникНоменклатура.Наименование КАК Наименование
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
СГРУППИРОВАТЬ ПО
    СправочникНоменклатура.Ссылка,
    СправочникНоменклатура.Код,
    СправочникНоменклатура.Наименование

Хотя этот метод кажется избыточным (группировка по всем полям), он эффективно блокирует стандартные механизмы перестроения индекса при клике. Однако помните о производительности: для больших таблиц использование СГРУППИРОВАТЬ ПО может замедлить выборку данных.

Способ 4. Настройка доступности полей в конфигураторе

Рассмотрим еще один «тихий» способ, доступный в конструкторе динамического списка. В настройках списка есть вкладка Поля. Для каждого выбранного поля там предусмотрена колонка Использовать в порядке.

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

Способ 5. Визуальный хак через группы колонок

Если стоит задача сделать так, чтобы заголовок вообще не выглядел как кнопка, можно воспользоваться приемом с группировкой колонок. Этот метод позволяет «подменить» реальный заголовок, на который можно нажать, статичным текстом.

Разберем по шагам, как это реализовать:

  1. В дереве элементов формы выделим колонку динамического списка.
  2. В свойствах колонки снимем флажок Отображать в шапке. Теперь колонка есть, но её заголовка не видно.
  3. Создадим новый элемент формы типа Группа колонок.
  4. Перетащим нашу колонку внутрь этой группы.
  5. У группы установим свойство Отображать заголовок — Истина, а в поле Заголовок впишем название нашей колонки.

В результате пользователь видит заголовок группы, который визуально неотличим от заголовка колонки, но клик по нему не вызывает никаких действий, так как группа колонок не обладает встроенным функционалом сортировки.

Дополнительные рекомендации по производительности

Часто желание отключить сортировку продиктовано тем, что список начинает «тормозить» при попытке пользователя отсортировать данные по неиндексированным полям (например, по строковому комментарию или реквизиту через несколько точек). Проанализируем, как можно решить эту проблему правильно:

1. Индексирование полей. Если сортировка все же нужна, но она медленная, проверьте свойство Индексировать у соответствующего реквизита в метаданных справочника или документа.

2. Использование Компоновщика настроек. В современных версиях платформы (8.3.10+) мы можем программно управлять доступностью полей через компоновщик. Это позволяет тонко настраивать права на сортировку в зависимости от роли пользователя:


ДоступноеПоле = Список.КомпоновщикНастроек.Настройки.ПорядокДоступныеПоля.Элементы.Найти("Дата");
Если ДоступноеПоле <> Неопределено Тогда
    ДоступноеПоле.Доступность = Ложь;
КонецЕсли;

Рассмотренные методы позволяют гибко управлять поведением динамического списка. Выбор конкретного способа зависит от ваших целей: нужно ли полностью запретить сортировку во всем списке или только для определенных колонок, и хотите ли вы оставить пользователю возможность менять настройки через меню Еще — Настроить список.

← На главную