Как реализовать сортировку по нажатию на заголовок колонки в обычных формах 1С

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

В платформе 1С:Предприятие 8 при работе с обычными формами (ОФ) разработчики часто сталкиваются с тем, что привычное поведение динамических списков (автоматическая сортировка при клике на шапку) не работает «из коробки» для табличных частей объектов или таблиц значений. В этой статье мы подробно разберем, как обойти это ограничение и сделать интерфейс ваших внешних обработок и документов более удобным для пользователя. Для быстрой настройки элементов управления пригодится шпаргалка разработчика по работе с формами.

Анализ стандартного поведения и ограничений

Прежде всего, разберем ситуацию. В динамических списках (формах списков справочников или документов) за сортировку отвечает механизм платформы, работающий напрямую с базой данных. Для табличных полей, источником данных которых является ТабличнаяЧасть или ТаблицаЗначений, такое поведение не предусмотрено по умолчанию. Как правило, в типовых конфигурациях для этого используются кнопки на командной панели («Сортировать по возрастанию», «Сортировать по убыванию»). Однако, программная реализация клика по заголовку вполне возможна.

Способ 1. Использование свойства «НастройкаПорядка»

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

Рассмотрим пример кода, который можно разместить в обработчике ПриОткрытии:


ЭлементыФормы.ИмяВашегоТабличногоПоля.НастройкаПорядка.ИмяКолонки.Доступность = Истина;

Важный нюанс: этот метод полноценно работает только тогда, когда источником данных является объектный список (например, список справочника). Для обычных таблиц значений в обработках этот метод может не дать желаемого визуального эффекта без индексации полей. Чтобы колонка могла участвовать в сортировке таким образом, данные в этой колонке должны быть проиндексированы.

Способ 2. Программная обработка события «ПриНажатииНаЗаголовок»

Если стандартный механизм не подходит, мы можем реализовать логику самостоятельно. Это наиболее гибкий и профессиональный подход. Посмотрим на алгоритм действий:

  1. Выберем табличное поле на форме.
  2. В панели свойств найдем событие ПриНажатииНаЗаголовок и создадим обработчик.
  3. Внутри обработчика напишем код, который будет определять текущее направление сортировки и менять его.

Разберем пример реализации. Для хранения текущего состояния сортировки (по какой колонке и в какую сторону сейчас отсортировано) удобно использовать структуру в модуле формы.


// В модуле формы объявим переменную
Перем СтруктураСортировки;

Процедура ПриОткрытии()
    СтруктураСортировки = Новый Структура("ИмяКолонки, Направление", "", "Возр");
КонецПроцедуры

Процедура ТабличноеПолеПриНажатииНаЗаголовок(Элемент, Колонка)
    // Выясним имя поля, по которому кликнул пользователь
    ИмяПоля = Колонка.Данные;
    
    // Если кликнули по той же колонке, меняем направление
    Если СтруктураСортировки.ИмяКолонки = ИмяПоля Тогда
        СтруктураСортировки.Направление = ?(СтруктураСортировки.Направление = "Возр", "Убыв", "Возр");
    Иначе
        // Если новая колонка — ставим по умолчанию "Возр"
        СтруктураСортировки.ИмяКолонки = ИмяПоля;
        СтруктураСортировки.Направление = "Возр";
    КонецЕсли;
    
    // Выполняем саму сортировку табличной части
    Объект.Товары.Сортировать(ИмяПоля + " " + СтруктураСортировки.Направление);
КонецПроцедуры

Визуализация направления сортировки

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

Пример с изменением текста (не забудьте предварительно очищать заголовки у других колонок):


Для Каждого Кол Из ЭлементыФормы.ТабличноеПоле.Колонки Цикл
    Кол.ТекстЗаголовка = СтрЗаменить(Кол.ТекстЗаголовка, " ▲", "");
    Кол.ТекстЗаголовка = СтрЗаменить(Кол.ТекстЗаголовка, " ▼", "");
КонецЦикла;

Стрелка = ?(СтруктураСортировки.Направление = "Возр", " ▲", " ▼");
Колонка.ТекстЗаголовка = Колонка.ТекстЗаголовка + Стрелка;

Использование Построителя запроса для сложных таблиц

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

Оптимизация: Индексация полей

Выясним причину, по которой сортировка может «тормозить». Если вы работаете с типом ТаблицаЗначений (например, результат запроса в обработке), обязательно используйте индексацию. Перед выполнением сортировки по колонке Артикул, добавьте её в индексы:

ВашаТаблицаЗначений.Индексы.Добавить("Артикул");

Для ТабличнойЧасти (встроенной в документ или справочник) явная индексация в коде недоступна, но, как правило, объемы данных в ТЧ не настолько велики, чтобы это вызывало задержки.

Заключение

Мы рассмотрели несколько подходов к реализации сортировки в ОФ. Хотя платформа не предоставляет автоматического механизма для всех типов данных, сочетание события ПриНажатииНаЗаголовок и метода Сортировать() позволяет создать удобный интерфейс, привычный пользователям современных приложений. Помните о визуальном отклике (стрелочках в заголовках), так как без них пользователь не будет понимать текущее состояние таблицы. Для визуального оформления вывода направления сортировки можно использовать коллекцию маленьких иконок.

← На главную