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