Разработчики часто сталкиваются с ситуацией, когда в тексте запроса динамического списка прописана сортировка через ОБЪЕДИНИТЬ ВСЕ или УПОРЯДОЧИТЬ ПО (ORDER BY), в консоли запросов всё отображается корректно, но на форме динамический список упорно выводит данные в старом порядке (например, по алфавиту). Рассмотрим подробнее, почему так происходит и как заставить список подчиняться заданным правилам.
Динамический список в 1С — это не просто прямой результат SQL-запроса. Его работа базируется на упрощенном движке Системы компоновки данных (СКД). Проанализируем технические особенности, которые мешают стандартной сортировке:
УПОРЯДОЧИТЬ ПО из вашего исходного текста и накладывает свои настройки, определенные в свойстве КомпоновщикНастроек.ОсновнаяТаблица, система автоматически оптимизирует запросы для быстрого скроллинга. В этом случае платформа отдает предпочтение индексированным полям основной таблицы, игнорируя ваши расчетные поля сортировки.ВЫБОР КОГДА ... ТОГДА 1 ИНАЧЕ 2 КОНЕЦ) и пытаетесь по нему сортировать, система может счесть такую операцию слишком «дорогой» для динамической выборки и проигнорировать её в пользу более простых индексов.Самый надежный способ установить сортировку для программно созданного списка — использовать объект КомпоновщикНастроек. Если нам нужно, чтобы сортировка была установлена по умолчанию, но пользователь мог её изменить, используем обычные настройки. Проанализируем пример кода:
// Очищаем текущий порядок
Список.КомпоновщикНастроек.Настройки.Порядок.Элементы.Очистить();
// Добавляем новое поле сортировки
ЭлементПорядка = Список.КомпоновщикНастроек.Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("СортировкаОрганизация");
ЭлементПорядка.ВидУпорядочивания = НаправлениеСортировки.Убыв;
ЭлементПорядка.Использование = Истина;
После изменения настроек или текста запроса программно, рекомендуется вызвать метод ЗагрузитьНастройки(), чтобы синхронизировать доступные поля.
Если задача стоит жестко — пользователь не должен иметь возможности изменить порядок или ваша сортировка должна быть «главнее» всех остальных — необходимо использовать ФиксированныеНастройки. Настройки, установленные в этом свойстве, не видны пользователю в меню «Настроить список» и имеют наивысший приоритет. Посмотрим, как это реализовать:
ЭлементПорядка = Список.КомпоновщикНастроек.ФиксированныеНастройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("СортировкаСклад");
ЭлементПорядка.ВидУпорядочивания = НаправлениеСортировки.Убыв;
Если вы внесли изменения в код, но на экране видите старый результат, вероятно, подтягиваются сохраненные данные формы. Выясним, как программно очистить настройки для списка. Для этого можно использовать ХранилищеНастроекДанныхФорм. Однако, на этапе разработки проще всего воспользоваться командой «Установить стандартные настройки» непосредственно в режиме «1С:Предприятие» в меню «Еще» динамического списка.
Чтобы платформа не «теряла» ваши расчетные поля при формировании итогового запроса, обратите внимание на следующие моменты:
СортировкаОрганизация и СортировкаСклад установите этот флаг. Это гарантирует, что даже если колонки не выведены на форму, они будут присутствовать в SQL-запросе.ВЫБОР КОГДА, постарайтесь рассчитать это значение заранее в запросе и выдать его как отдельный псевдоним (поле), а уже по этому псевдониму настраивать порядок в компоновщике.Список.ОсновнаяТаблица заполнена корректно (если это требуется для быстрой работы) или оставлена пустой (если запрос слишком сложный).Таким образом, мы выяснили, что для управления порядком в динамическом списке следует отказаться от секции УПОРЯДОЧИТЬ ПО в самом тексте запроса и полностью перенести логику в КомпоновщикНастроек.