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

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

В процессе разработки на платформе 1С:Предприятие одной из наиболее частых задач является манипуляция данными в оперативной памяти. Объект ТаблицаЗначений выступает универсальным контейнером для хранения структурированной информации. Однако мало просто наполнить таблицу данными — зачастую их требуется упорядочить для корректного вывода в отчет, последующей обработки или реализации бизнес-логики. В этой статье мы подробно разберем, как эффективно управлять порядком строк в ТаблицаЗначений, используя встроенные механизмы платформы.

Метод Сортировать() и его базовый синтаксис

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

Рассмотрим пример, где у нас есть таблица ТЗДанные с колонками Дата, Сумма и Контрагент. Если нам нужно отсортировать таблицу по возрастанию даты, мы напишем следующий код:

ТЗДанные.Сортировать("Дата Возр");

Здесь Дата — это имя колонки, а Возр — ключевое слово, указывающее на направление сортировки (по возрастанию). Если направление не указано, система по умолчанию применит сортировку по возрастанию, однако для чистоты кода и понимания логики другими разработчиками рекомендуем указывать направление явно.

Сортировка по нескольким колонкам

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

Посмотрим на практический пример:


// Сортировка по Контрагенту (А-Я) и по Дате (по убыванию)
ТЗДанные.Сортировать("Контрагент Возр, Дата Убыв");

В данном случае система сначала проанализирует колонку Контрагент. Если в таблице встречаются строки с одинаковым значением в этой колонке, то внутри этой группы строки будут выстроены в соответствии со значениями в колонке Дата в порядке убывания.

Ключевые слова и параметры направлений

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

  1. Возр (или Asc) — сортировка по возрастанию. Для числовых полей это движение от меньшего к большему, для строк — по алфавиту, для дат — от прошлого к будущему.
  2. Убыв (или Desc) — сортировка по убыванию. Обратный порядок: от большего к меньшему, от Я к А, от будущего к прошлому.

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


// Сложная сортировка по четырем полям
ТЗДанные.Сортировать("Организация Возр, Склад Возр, Товар Возр, Количество Убыв");

Особенности работы с типами данных при сортировке

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

  1. Строки: Сортировка происходит посимвольно. Стоит учитывать, что строки, содержащие числа (например, "1", "10", "2"), будут отсортированы как текст: "1", "10", "2", а не в числовом порядке.
  2. Числа: Сортировка происходит по математическому значению.
  3. Даты: Учитывается и дата, и время. Если время не указано (равно 00:00:00), такие записи будут идти первыми внутри конкретного дня при сортировке по возрастанию.
  4. Ссылочные типы: Сортировка происходит по внутреннему идентификатору ссылки (GUID), а не по представлению (наименованию) объекта. Это критически важный момент! Если вам нужно отсортировать таблицу по наименованию номенклатуры, которая хранится в ссылочной колонке, сначала нужно добавить вспомогательную колонку, заполнить ее строковым представлением (наименованием) и сортировать уже по ней.

Разберем пример со вспомогательной колонкой

Предположим, у нас есть колонка Товар (тип СправочникСсылка.Номенклатура). Мы хотим отсортировать таблицу по алфавиту названий товаров. Рассмотрим алгоритм действий:


// 1. Добавляем вспомогательную колонку для представления
ТЗДанные.Колонки.Добавить("ТоварНаименование", Новый ОписаниеТипов("Строка"));

// 2. Заполняем ее данными
Для Каждого СтрокаТЗ Из ТЗДанные Цикл
    СтрокаТЗ.ТоварНаименование = Строка(СтрокаТЗ.Товар);
КонецЦикла;

// 3. Выполняем сортировку по строковому полю
ТЗДанные.Сортировать("ТоварНаименование Возр");

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

Сортировка и производительность

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

Совет: Если вы получаете данные из базы с помощью запроса, всегда старайтесь выполнять сортировку на уровне SQL-сервера, используя предложение УПОРЯДОЧИТЬ ПО в тексте запроса. Это гораздо эффективнее, чем сортировать уже полученную и выгруженную в таблицу значений выборку.

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

Важно не путать ТаблицаЗначений и ДеревоЗначений. Хотя у объекта ДеревоЗначений тоже есть метод Сортировать(), его поведение отличается. В дереве можно указать второй параметр — логическое значение, определяющее, нужно ли сортировать подчиненные строки (рекурсивно).


// Пример для Дерева Значений: сортировка всех уровней иерархии
ДеревоДанных.Строки.Сортировать("Наименование Возр", Истина);

В случае с плоской ТаблицаЗначений мы всегда работаем только с одним уровнем данных, поэтому синтаксис проще.

Типичные ошибки при использовании метода

Рассмотрим подробнее ошибки, которые часто допускают начинающие разработчики:

Заключение

Мы проанализировали механизм сортировки в ТаблицаЗначений, рассмотрели правила составления строки параметров и изучили нюансы, связанные с типами данных. Использование метода Сортировать() — это мощный инструмент в руках разработчика 1С, позволяющий гибко управлять представлением данных без лишних затрат на написание собственных алгоритмов сортировки (таких как "пузырек" или "быстрая сортировка"). Соблюдение правил типизации и использование вспомогательных колонок для ссылочных полей позволит вам создавать надежный и быстродействующий код.

← На главную