Как отсортировать строки табличной части по значению колонки на управляемой форме 1С?

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

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

Программная сортировка через метод коллекции данных формы

На управляемой форме данные табличной части объекта представлены типом ДанныеФормыКоллекция (доступны через свойство Объект.ИмяТабличнойЧасти). У этого объекта есть встроенный метод Сортировать().

Главная особенность метода Сортировать() заключается в том, что он является процедурой, а не функцией. Метод изменяет порядок элементов непосредственно в самой коллекции и не возвращает никакого значения. Попытка присвоить результат выполнения метода переменной приведет к синтаксической ошибке или некорректному поведению программы.

Посмотрим на пример правильного синтаксиса для сортировки по возрастанию:


// Сортировка по возрастанию (суффикс Возр можно опустить, так как он действует по умолчанию)
Объект.Товары.Сортировать("Количество Возр");

Разберем основные правила формирования строки параметров сортировки:

  1. Направление сортировки: для упорядочивания по возрастанию используется ключевое слово Возр (или не указывается вовсе), для упорядочивания по убыванию — Убыв.
  2. Сортировка по нескольким колонкам: имена колонок перечисляются через запятую с указанием направления для каждой из них. Например: Объект.Товары.Сортировать("Номенклатура Возр, Количество Убыв");
  3. Ограничение по вложенным свойствам: метод не поддерживает обращение через точку к реквизитам ссылочных полей (например, передача строки вида "Номенклатура.Артикул" вызовет ошибку). Сортировать можно только по колонкам, непосредственно входящим в состав данной таблицы.

Сохранение фокуса текущей строки при сортировке

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


// Запоминаем идентификатор текущей строки перед перестроением
ИдентификаторСтроки = Элементы.Товары.ТекущаяСтрока;

// Выполняем сортировку коллекции
Объект.Товары.Сортировать("Количество");

// Восстанавливаем позицию курсора
Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;

Сортировка на уровне запроса при заполнении таблицы

Если табличная часть заполняется или перезаполняется пакетно с помощью запроса, наиболее производительным решением будет упорядочить результат непосредственно в тексте запроса на стороне СУБД. В таком случае отпадает необходимость выполнять отдельный вызов метода Сортировать() на клиенте или сервере формы.

Рассмотрим пример формирования данных запросом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ОстаткиНоменклатуры.Номенклатура КАК Номенклатура,
    |    ОстаткиНоменклатуры.КоличествоОстаток КАК Количество
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиНоменклатуры
    |УПОРЯДОЧИТЬ ПО
    |    Количество ВОЗР";

РезультатЗапроса = Запрос.Выполнить();
Объект.Товары.Загрузить(РезультатЗапроса.Выгрузить());

Интерактивная сортировка пользователем

Если пользователю требуется самостоятельно сортировать строки в процессе работы с формой документа или справочника, рассмотрим два основных варианта:

  1. Через меню формы: в командной панели таблицы формы всегда доступно стандартное меню Еще -> Сортировать по возрастанию (или по убыванию) для активной колонки.
  2. По клику на заголовок колонки: чтобы включить интерактивную сортировку кликом по шапке таблицы, в дереве метаданных конфигуратора для соответствующего реквизита табличной части свойство Индексировать должно иметь значение Индексировать или Индексировать с доп. упорядочиванием.
← На главную