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