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

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

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

Рассмотрим причины такого поведения платформы, проанализируем ограничения и разберем практические способы реализации сортировки данных.

Почему не работает клик по заголовку колонки в обычном приложении

Выясним причину, почему в динамических списках и формах списков справочников сортировка по заголовку работает штатно, а в табличной части обработки — нет:

  1. Ограничения элемента управления ТабличноеПоле. В обычном приложении интерактивное упорядочивание по клику на заголовок колонки на уровне платформы реализовано только для источников данных типа списков базы данных (СправочникСписок, ДокументСписок, РегистрСведенийСписок). Для локальных коллекций значений (табличные части, таблицы значений, деревья значений) встроенный механизм перехвата клика по шапке отсутствует.
  2. Отсутствие событий шапки. У колонки табличного поля в обычном интерфейсе нет стандартного события нажатия на заголовок, которое можно было бы перехватить в коде формы и программно вызвать сортировку.
  3. Ограничения динамических списков. Динамический список работает исключительно с физическими таблицами базы данных через запросы. Использовать в качестве источника данных динамического списка табличную часть внешней обработки или временную таблицу с переданной коллекцией значений невозможно.
  4. Отсутствие индексов базы данных. Данные табличных частей обработок не хранятся в физических таблицах СУБД, поэтому к ним неприменимо индексирование реквизитов, отвечающее за автосортировку в списках объектов.

Решение 1. Использование кнопок сортировки на командной панели формы

Разберем наиболее удобный и эргономичный для пользователя способ обхода ограничения. Создадим на командной панели табличного поля подменю «Сортировка» или отдельные кнопки для ключевых колонок таблицы.

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


Перем НаправлениеСортировки; // Булево: Истина - Возр, Ложь - Убыв

Процедура ПриОткрытии()
    НаправлениеСортировки = Истина;
КонецПроцедуры

Процедура ДействияФормыСортировкаПоНоменклатуре(Кнопка)
    // Переключаем направление при каждом нажатии
    НаправлениеСортировки = Не НаправлениеСортировки;
    
    НаправлениеСтрока = ?(НаправлениеСортировки, "ВОЗР", "УБЫВ");
    
    // Выполняем сортировку табличной части объекта
    ТабличнаяЧасть1.Сортировать("Номенклатура " + НаправлениеСтрока);
КонецПроцедуры

Процедура ДействияФормыСортировкаПоЦене(Кнопка)
    НаправлениеСортировки = Не НаправлениеСортировки;
    НаправлениеСтрока = ?(НаправлениеСортировки, "ВОЗР", "УБЫВ");
    
    ТабличнаяЧасть1.Сортировать("Цена " + НаправлениеСтрока);
КонецПроцедуры

Решение 2. Использование штатного контекстного меню ячеек

Проанализируем стандартную возможность платформы 1С, которая доступна без написания программного кода. В обычном приложении элемент управления ТабличноеПоле предоставляет встроенное контекстное меню:

  1. Пользователь нажимает правой кнопкой мыши на любую ячейку в нужной колонке.
  2. В контекстном меню выбираются пункты «Сортировать по возрастанию» или «Сортировать по убыванию».
  3. Платформа автоматически выполняет упорядочивание строк по выбранной колонке.

Для работы этого механизма достаточно убедиться, что у элемента ТабличноеПоле свойство АвтоконтекстноеМеню установлено в значение Истина.

Решение 3. Вывод данных через ПолеТабличногоДокумента и СКД

Если интерфейс требует обязательного клика именно по шапке отчета или таблицы, рассмотрим альтернативный подход с использованием элемента управления ПолеТабличногоДокумента и схемы компоновки данных с внешним набором данных.

Разберем по шагам алгоритм реализации:

  1. Данные табличной части выгружаются в ТаблицаЗначений.
  2. Таблица передается во внешний набор данных СКД.
  3. При формировании макета ячейкам шапки задается параметр Расшифровка с именем колонки.
  4. В обработчике события ОбработкаРасшифровки поля табличного документа анализируется выбранная колонка, программно изменяются настройки порядка СКД и отчет переформировывается.

Посмотрим на пример программного вывода отчета через СКД с внешним набором данных:


Процедура СформироватьОтчетПоТаблице(ТаблицаДанных)
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ТаблицаДанных", ТаблицаДанных);
    
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
    
    ЭлементыФормы.Результат.Очистить();
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры

Особенности и правила сортировки коллекций в коде

При вызове метода Сортировать() для табличных частей и таблиц значений важно учитывать следующие правила платформы:

  1. Колонки с неограниченной длиной. Метод Сортировать() вызывает исключение при попытке сортировки по колонкам с типом Строка неограниченной длины. Для сортировки таких текстовых полей необходимо предварительно сформировать служебную колонку ограниченной длины (например, первые 100–150 символов) и выполнять упорядочивание по ней.
  2. Сортировка ссылочных данных. По умолчанию платформа упорядочивает ссылочные типы (например, СправочникСсылка.Номенклатура) по их строковому представлению (наименованию), что при большом объеме строк может занимать дополнительное время на неявные обращения к базе данных. Для мгновенной сортировки по внутреннему идентификатору ссылки вторым параметром метода передается объект СравнениеЗначений.
← На главную