Почему не работает сортировка в динамическом списке 1С и как это исправить?

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

Разработчики часто сталкиваются с ситуацией, когда в тексте запроса динамического списка прописана сортировка через ОБЪЕДИНИТЬ ВСЕ или УПОРЯДОЧИТЬ ПО (ORDER BY), в консоли запросов всё отображается корректно, но на форме динамический список упорно выводит данные в старом порядке (например, по алфавиту). Рассмотрим подробнее, почему так происходит и как заставить список подчиняться заданным правилам.

Разберем причины: почему ORDER BY в запросе игнорируется

Динамический список в 1С — это не просто прямой результат SQL-запроса. Его работа базируется на упрощенном движке Системы компоновки данных (СКД). Проанализируем технические особенности, которые мешают стандартной сортировке:

  1. Приоритет компоновщика: Когда платформа формирует итоговый запрос к базе данных, она зачастую отсекает раздел УПОРЯДОЧИТЬ ПО из вашего исходного текста и накладывает свои настройки, определенные в свойстве КомпоновщикНастроек.
  2. Влияние основной таблицы: Если в свойствах списка указана ОсновнаяТаблица, система автоматически оптимизирует запросы для быстрого скроллинга. В этом случае платформа отдает предпочтение индексированным полям основной таблицы, игнорируя ваши расчетные поля сортировки.
  3. Кэширование пользовательских настроек: Платформа запоминает настройки формы для каждого пользователя. Если пользователь ранее вручную менял сортировку в списке, эти настройки будут иметь приоритет над программными изменениями в тексте запроса.
  4. Индексация: Если вы создали в запросе искусственное поле (например, ВЫБОР КОГДА ... ТОГДА 1 ИНАЧЕ 2 КОНЕЦ) и пытаетесь по нему сортировать, система может счесть такую операцию слишком «дорогой» для динамической выборки и проигнорировать её в пользу более простых индексов.

Решение 1: Программная установка порядка через настройки компоновщика

Самый надежный способ установить сортировку для программно созданного списка — использовать объект КомпоновщикНастроек. Если нам нужно, чтобы сортировка была установлена по умолчанию, но пользователь мог её изменить, используем обычные настройки. Проанализируем пример кода:


// Очищаем текущий порядок
Список.КомпоновщикНастроек.Настройки.Порядок.Элементы.Очистить();

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

После изменения настроек или текста запроса программно, рекомендуется вызвать метод ЗагрузитьНастройки(), чтобы синхронизировать доступные поля.

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

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


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

Решение 3: Сброс старых пользовательских настроек

Если вы внесли изменения в код, но на экране видите старый результат, вероятно, подтягиваются сохраненные данные формы. Выясним, как программно очистить настройки для списка. Для этого можно использовать ХранилищеНастроекДанныхФорм. Однако, на этапе разработки проще всего воспользоваться командой «Установить стандартные настройки» непосредственно в режиме «1С:Предприятие» в меню «Еще» динамического списка.

Важные рекомендации по работе с полями

Чтобы платформа не «теряла» ваши расчетные поля при формировании итогового запроса, обратите внимание на следующие моменты:

Таким образом, мы выяснили, что для управления порядком в динамическом списке следует отказаться от секции УПОРЯДОЧИТЬ ПО в самом тексте запроса и полностью перенести логику в КомпоновщикНастроек.

← На главную