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