При разработке и доработке форм списков в платформе 1С:Предприятие разработчики нередко сталкиваются с ситуацией, когда по определенному реквизиту невозможно упорядочить данные. При нажатии на заголовок колонки ничего не происходит, а в стандартном окне настройки списка нужное поле попросту отсутствует среди доступных для упорядочивания. При этом реквизит может быть проиндексирован в метаданных и физически присутствовать в табличном поле формы.
Разберем детально, какими механизмами платформы регулируется состав полей для сортировки, почему возможность упорядочивания может блокироваться и как программно вернуть сортировку по клику на колонку.
Для того чтобы колонка списка могла сортироваться штатными средствами платформы при интерактивном клике пользователя, должен выполняться ряд обязательных условий:
ХранилищеЗначения. Если реквизит может содержать ссылки на разные справочники или документы, стандартный индекс базы данных не может построить однозначную последовательность без явного приведения типа.ПриВыводеСтроки или ПриПолученииДанных, либо колонка выведена «через точку» от другого объекта, платформа не может применить к ней индекс основной таблицы. Сортировка по таким колонкам по умолчанию заблокирована.НастройкаПорядка. Если для конкретного реквизита свойство доступности сброшено в значение Ложь, колонка визуально присутствует на форме, но клик по ней не приводит к перестроению списка.Проанализируем наиболее частую ситуацию в обычном приложении: колонка отображает реквизит документа или справочника, но в свойствах порядка не включена доступность. В этом случае пользователь не может кликнуть по заголовку колонки, а в меню отсутствует пункт настройки упорядочивания по этому реквизиту.
Чтобы разрешить пользователю интерактивно сортировать данные по нужному полю (например, по реквизиту ФизЛицо), обратимся к свойству НастройкаПорядка табличного поля формы в процедуре ПриОткрытии:
Процедура ПриОткрытии()
// Проверяем наличие настройки порядка и включаем доступность для нужного реквизита
Если ЭлементыФормы.СправочникСписок.НастройкаПорядка.Найти("ФизЛицо") <> Неопределено Тогда
ЭлементыФормы.СправочникСписок.НастройкаПорядка.ФизЛицо.Доступность = Истина;
Иначе
// Если поле не было инициализировано платформой автоматически, добавляем его
ЭлементыФормы.СправочникСписок.НастройкаПорядка.Добавить("ФизЛицо");
ЭлементыФормы.СправочникСписок.НастройкаПорядка.ФизЛицо.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
После установки свойства Доступность = Истина колонка становится кликабельной, а платформа начинает автоматически менять направление сортировки (по возрастанию и по убыванию) при нажатии мышью на заголовок.
Если требуется не просто разрешить пользователю кликать по заголовку, а принудительно установить определенное направление сортировки при открытии формы или по нажатию отдельной кнопки, воспользуемся объектом Порядок основного реквизита формы:
// Очищаем текущий порядок списка
СправочникСписок.Порядок.Очистить();
// Устанавливаем сортировку по нужному реквизиту с указанием направления
СправочникСписок.Порядок.Установить("ФизЛицо Возр");
В параметре метода Установить() передается имя реквизита и модификатор направления: Возр (по возрастанию) или Убыв (по убыванию). Этот подход гарантирует перестроение выборки на уровне запроса к базе данных.
Рассмотрим распространенную проблему: сортировка успешно работает при открытии формы, но как только пользователь переключается на другую закладку формы, возможность упорядочивания по реквизиту снова блокируется.
Выясним причины такого поведения:
ТабличноеПоле. Настройка порядка, выполненная только для одного элемента формы, не распространяется на табличные поля соседних страниц. В таком случае необходимо обойти все табличные поля и включить свойство Доступность для каждого из них.НастройкаПорядка, сбрасывая пользовательские значения флагов к исходным.Чтобы гарантировать сохранение сортировки при любой навигации по закладкам формы, вынесем инициализацию порядка в отдельную процедуру и вызовем ее не только при открытии, но и в обработчике смены страницы панели:
Процедура ПанельПриСменеСтраницы(Элемент, ТекущаяСтраница)
// Восстанавливаем доступность сортировки для активной таблицы
ОбновитьДоступностьСортировки();
КонецПроцедуры
Процедура ОбновитьДоступностьСортировки()
Попытка
ЭлементыФормы.СправочникСписок.НастройкаПорядка.ФизЛицо.Доступность = Истина;
Исключение
// Обработка случая, если поле временно недоступно в структуре
КонецПопытки;
КонецПроцедуры
Также обязательно проверим режим отображения списка. Если для одной из закладок динамически включается ИерархическийПросмотр = Истина, отключим его перед сортировкой, установив ИерархическийПросмотр = Ложь, чтобы снять платформенные ограничения на порядок отображения строк.