Почему не работает сортировка динамического списка, заданная в конфигураторе, и как настроить ее правильно?

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

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

Причина 1: Приоритет пользовательских настроек

Первое и самое важное, что нам необходимо понять: система компоновки данных (СКД), на которой базируется динамический список, имеет строгую иерархию настроек. Рассмотрим этот «слоеный пирог» подробнее:

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

Проблема заключается в том, что пользовательские настройки имеют приоритет над настройками разработчика. Если вы изменили сортировку в конфигураторе, но у пользователя уже сохранены старые (или пустые) настройки, 1С применит именно их. Чтобы проверить эту версию, попробуйте в пользовательском режиме нажать кнопку «Еще» — «Установить стандартные настройки». Если после этого сортировка появилась — значит, дело было именно в кэшированных настройках пользователя.

Причина 2: Автоматическое сохранение данных формы

Проанализируем свойства самой формы. У формы есть свойство АвтоматическоеСохранениеДанныхВНастройках. Если оно включено, и в списке сохраняемых реквизитов отмечен наш динамический список, то 1С будет при открытии формы восстанавливать состояние списка (включая положение курсора, группировки и сортировку) из последнего сеанса. Это поведение часто перекрывает любые попытки задать настройки «статично» в конфигураторе.

Решение 1: Использование механизма фиксированных настроек

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

Если ваша задача — принудительно задать порядок, который не должен меняться, фиксированные настройки — лучший выбор.

Решение 2: Программная установка порядка (универсальный метод)

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


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

    // 3. Добавляем второстепенную сортировку по ссылке для стабильности результата
    ЭлементПорядкаСсылка = ЭтаФорма.Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    ЭлементПорядкаСсылка.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
    ЭлементПорядкаСсылка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
    ЭлементПорядкаСсылка.Использование = Истина;

КонецПроцедуры

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

Работа с пользовательскими настройками (Группа настроек)

Разберем еще один важный нюанс. Чтобы пользователь видел, какая сортировка установлена, и мог ею управлять прямо на форме (без захода в глубокие настройки), мы можем использовать свойство «Группа пользовательских настроек».

  1. Создайте на форме обычную группу (без заголовка или с ним).
  2. В свойствах элемента формы Список найдите поле ГруппаПользовательскихНастроек и выберите созданную группу.
  3. В конфигураторе, в настройках динамического списка, для нужных элементов порядка (или отборов) установите флажок «Включать в пользовательские настройки».

После этого элементы управления сортировкой появятся прямо над списком. Однако помните: если вы программно меняете Список.КомпоновщикНастроек.Настройки.Порядок, эти изменения должны корректно отразиться в этой группе.

Влияние «Основной таблицы» и произвольных запросов

Проанализируем ситуацию, когда сортировка вроде бы задана, но список «тормозит» или данные отображаются хаотично. Проверьте свойство ОсновнаяТаблица в настройках динамического списка. Если динамический список строится по произвольному запросу и основная таблица не указана, платформа не может эффективно оптимизировать SQL-запрос. В этом случае сортировка по полям, которые выбираются через ЛЕВОЕ СОЕДИНЕНИЕ, может работать некорректно или крайне медленно.

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

Итоги

Выяснив причины, мы можем составить краткий алгоритм действий, если сортировка не работает:

← На главную