При разработке интерфейсов на обычных формах часто возникает задача упорядочить данные в таблице. Начинающие разработчики нередко пытаются вызвать метод сортировки напрямую у элемента управления формы, например ЭлементыФормы.ТабличноеПоле1.Сортировать(...), и сталкиваются с ошибкой отсутствия такого метода. Выясним причину такого поведения платформы и разберем правильные способы сортировки данных.
Главная причина ошибки заключается в смешивании визуального представления и прикладных данных. Проанализируем архитектуру работы с таблицами в 1С:
ТабличноеПоле нет собственных методов сортировки содержимого.ТаблицаЗначений, ТабличнаяЧасть объекта, ДеревоЗначений или динамический список. Именно у прикладного объекта данных реализованы алгоритмы модификации и упорядочивания строк.Таким образом, для программной сортировки строк необходимо обращаться не к самому визуальному элементу, а к объекту, который хранит отображаемые данные.
Если в качестве данных табличного поля используется объект типа ТаблицаЗначений (созданный программно или добавленный в реквизиты формы), обратимся к его методу Сортировать.
Получить доступ к таблице значений можно либо напрямую через переменную (реквизит), либо через свойство Значение самого элемента управления. Посмотрим на пример кода:
// Вариант 1: обращение через свойство Значение элемента управления
ЭлементыФормы.ТабличноеПоле1.Значение.Сортировать("НазваниеСтолбца Возр");
// Вариант 2: обращение напрямую к реквизиту формы
мТаблицаДанных.Сортировать("Количество Убыв, Номенклатура Возр");
Рассмотрим синтаксис и правила работы метода Сортировать:
Возр (по возрастанию, применяется по умолчанию) или Убыв (по убыванию).СравнениеЗначений, если требуется кастомная логика сопоставления элементов.Массив или Структура), платформа сгенерирует исключение времени выполнения.Нередко табличное поле отображает строки реальной табличной части прикладного объекта (документа, справочника или внешней обработки). Объект типа ТабличнаяЧасть также имеет собственный метод Сортировать. Разберем пример упорядочивания строк табличной части объекта:
// Обращение к табличной части объекта формы
Товары.Сортировать("Цена Убыв, Номенклатура Возр");
Важно помнить, что объект ТабличнаяЧасть не идентичен ТаблицеЗначений — это самостоятельный тип данных платформы 1С, но синтаксис вызова метода сортировки у них совпадает.
При сортировке таблиц значений следует учитывать важную техническую тонкость: колонки, содержащие ссылки на объекты информационной базы (например, СправочникСсылка.Номенклатура), упорядочиваются не по наименованию или коду, а по внутреннему уникальному идентификатору (GUID). Из-за этого результат может выглядеть хаотично для пользователя.
Чтобы упорядочить строки по понятному человеку представлению, используем один из двух подходов:
НаименованиеСтрокой), заполним ее строковыми представлениями и выполним сортировку по ней.УПОРЯДОЧИТЬ ПО. Запрос выполняет сортировку ссылок по их наименованию или коду значительно быстрее и корректнее.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура,
| Количество,
| Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары
|ГДЕ
| Ссылка = &Ссылка
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Наименование ВОЗР";
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
ЭлементыФормы.ТабличноеПоле1.Значение = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
После программного выполнения метода Сортировать физический порядок строк в коллекции изменяется, что может привести к потере фокуса или перескоку курсора на другую позицию. Чтобы сохранить текущую активную строку для пользователя, сохраним ее перед выполнением сортировки и восстановим после:
// Сохраняем текущую строку
ТекущиеДанныеСтроки = ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока;
// Выполняем сортировку источника данных
ЭлементыФормы.ТабличноеПоле1.Значение.Сортировать("Артикул Возр");
// Восстанавливаем позицию курсора
Если ТекущиеДанныеСтроки <> Неопределено Тогда
ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = ТекущиеДанныеСтроки;
КонецЕсли;
В зависимости от того, что именно связано с табличным полем, правила вызова упорядочивания могут отличаться:
ДеревоЗначений метода сортировки нет. Сортировка выполняется на уровне строк конкретных узлов через свойство Строки.Сортировать(...). Для упорядочивания всего дерева необходимо обойти все дочерние узлы рекурсивно.СправочникСписок или ДокументСписок), у него нет метода Сортировать. Управление порядком строк осуществляется через свойство Порядок (например, Список.Порядок.Установить("Наименование Возр")).