Как программно отсортировать строки в табличном поле в 1С?

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

При разработке интерфейсов на обычных формах часто возникает задача упорядочить данные в таблице. Начинающие разработчики нередко пытаются вызвать метод сортировки напрямую у элемента управления формы, например ЭлементыФормы.ТабличноеПоле1.Сортировать(...), и сталкиваются с ошибкой отсутствия такого метода. Выясним причину такого поведения платформы и разберем правильные способы сортировки данных.

В чем разница между элементом управления и источником данных

Главная причина ошибки заключается в смешивании визуального представления и прикладных данных. Проанализируем архитектуру работы с таблицами в 1С:

  1. Элемент управления (ТабличноеПоле) — это визуальный компонент формы, отвечающий за отображение колонок, строк, прокрутку и реакцию на действия пользователя (клики, выделение строк). У самого объекта ТабличноеПоле нет собственных методов сортировки содержимого.
  2. Данные (Источник данных) — коллекция, к которой привязан элемент управления. Это может быть ТаблицаЗначений, ТабличнаяЧасть объекта, ДеревоЗначений или динамический список. Именно у прикладного объекта данных реализованы алгоритмы модификации и упорядочивания строк.

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

Сортировка Таблицы Значений

Если в качестве данных табличного поля используется объект типа ТаблицаЗначений (созданный программно или добавленный в реквизиты формы), обратимся к его методу Сортировать.

Получить доступ к таблице значений можно либо напрямую через переменную (реквизит), либо через свойство Значение самого элемента управления. Посмотрим на пример кода:


// Вариант 1: обращение через свойство Значение элемента управления
ЭлементыФормы.ТабличноеПоле1.Значение.Сортировать("НазваниеСтолбца Возр");

// Вариант 2: обращение напрямую к реквизиту формы
мТаблицаДанных.Сортировать("Количество Убыв, Номенклатура Возр");

Рассмотрим синтаксис и правила работы метода Сортировать:

  1. Параметры колонок: метод принимает строку с перечнем имен колонок, разделенных запятыми. После имени колонки через пробел можно указать направление сортировки: Возр (по возрастанию, применяется по умолчанию) или Убыв (по убыванию).
  2. Объект сравнения: вторым необязательным параметром можно передать объект СравнениеЗначений, если требуется кастомная логика сопоставления элементов.
  3. Ограничения типов данных: если в сортируемой колонке содержатся несравнимые типы (например, Массив или Структура), платформа сгенерирует исключение времени выполнения.

Сортировка Табличной Части документа или справочника

Нередко табличное поле отображает строки реальной табличной части прикладного объекта (документа, справочника или внешней обработки). Объект типа ТабличнаяЧасть также имеет собственный метод Сортировать. Разберем пример упорядочивания строк табличной части объекта:


// Обращение к табличной части объекта формы
Товары.Сортировать("Цена Убыв, Номенклатура Возр");

Важно помнить, что объект ТабличнаяЧасть не идентичен ТаблицеЗначений — это самостоятельный тип данных платформы 1С, но синтаксис вызова метода сортировки у них совпадает.

Особенности работы с ссылочными типами данных

При сортировке таблиц значений следует учитывать важную техническую тонкость: колонки, содержащие ссылки на объекты информационной базы (например, СправочникСсылка.Номенклатура), упорядочиваются не по наименованию или коду, а по внутреннему уникальному идентификатору (GUID). Из-за этого результат может выглядеть хаотично для пользователя.

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

  1. Дополнительная строковая колонка: добавим в таблицу значений отдельную колонку строкового типа (например, НаименованиеСтрокой), заполним ее строковыми представлениями и выполним сортировку по ней.
  2. Сортировка на уровне запроса: если данные формируются запросом, предпочтительнее сразу применить конструкцию УПОРЯДОЧИТЬ ПО. Запрос выполняет сортировку ссылок по их наименованию или коду значительно быстрее и корректнее.

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

Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
ЭлементыФормы.ТабличноеПоле1.Значение = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

Сохранение позиции текущей строки

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


// Сохраняем текущую строку
ТекущиеДанныеСтроки = ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока;

// Выполняем сортировку источника данных
ЭлементыФормы.ТабличноеПоле1.Значение.Сортировать("Артикул Возр");

// Восстанавливаем позицию курсора
Если ТекущиеДанныеСтроки <> Неопределено Тогда
    ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = ТекущиеДанныеСтроки;
КонецЕсли;

Как сортировать другие источники данных

В зависимости от того, что именно связано с табличным полем, правила вызова упорядочивания могут отличаться:

  1. Дерево значений: у самого объекта ДеревоЗначений метода сортировки нет. Сортировка выполняется на уровне строк конкретных узлов через свойство Строки.Сортировать(...). Для упорядочивания всего дерева необходимо обойти все дочерние узлы рекурсивно.
  2. Динамические списки: если табличное поле отображает список (например, СправочникСписок или ДокументСписок), у него нет метода Сортировать. Управление порядком строк осуществляется через свойство Порядок (например, Список.Порядок.Установить("Наименование Возр")).
← На главную