К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сделать сортировку в таблице значений 1С

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

Таблица значений в 1С — один из самых используемых типов данных для промежуточной обработки информации: выборки из запросов, загрузка из файлов, подготовка данных для отчётов и печатных форм. Практически всегда данные в ней нужно упорядочить — по номенклатуре, по дате, по сумме. Для этого платформа предоставляет встроенный метод Сортировать(), который выполняет сортировку «на месте», не создавая копию таблицы.

Метод принимает строку со списком колонок и направлений сортировки, а также необязательный объект сравнения значений для нестандартных сценариев. Синтаксис прост, но есть нюансы: поведение с составными типами колонок, сортировка строк с учётом регистра, обработка значений NULL и производительность на больших объёмах. Ниже разобраны все практические сценарии с готовыми примерами кода.

Базовый синтаксис метода Сортировать

Метод вызывается непосредственно у объекта таблицы значений и изменяет порядок строк в самой таблице — возвращать результат в новую переменную не нужно. Единственный обязательный параметр — строка с именем колонки и направлением сортировки.

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Количество");

// ... заполнение таблицы ...

// Сортировка по возрастанию

ТЗ.Сортировать("Номенклатура Возр");

// Сортировка по убыванию

ТЗ.Сортировать("Количество Убыв");

Ключевые слова Возр и Убыв можно сокращать до В и У, но полная форма читается лучше и реже вызывает ошибок при сопровождении. Если направление не указать, платформа выдаст ошибку — направление обязательно для каждой колонки.

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

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

Когда значения в первой колонке совпадают, порядок строк определяется следующей колонкой из списка. Колонки перечисляются через запятую, у каждой указывается своё направление — они могут различаться.

// Сначала по контрагенту (А-Я), внутри него — по сумме от большей к меньшей

ТЗ.Сортировать("Контрагент Возр, Сумма Убыв");

Порядок колонок в строке сортировки определяет приоритет. Сравните два варианта:

Строка сортировкиЧто получится
"Склад Возр, Товар Возр"Группировка по складам, внутри склада товары по алфавиту
"Товар Возр, Склад Возр"Группировка по товарам, внутри товара — по складам

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

Порядок действий
  1. 1
    Определите колонку первичной сортировки — ту, что задаёт основную группировку
  2. 2
    Добавьте вторичные колонки для упорядочивания внутри групп
  3. 3
    Укажите направление Возр или Убыв для каждой колонки
  4. 4
    Вызовите метод Сортировать() у таблицы значений
  5. 5
    Проверьте результат в отладчике или выведите первые строки в сообщение

Сортировка строк, дат и чисел: особенности типов

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

Числа, хранящиеся как строки

Если колонка объявлена строковой, а в ней лежат числа (частая ситуация после загрузки из Excel или CSV), сортировка будет лексикографической: «10» окажется раньше «2», потому что сравниваются символы, а не значения. Решение — объявить колонку числовой при создании таблицы или преобразовать значения перед сортировкой.

ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

ТЗ.Колонки.Добавить("Сумма", ОписаниеЧисла);

Строки и регистр символов

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

Составные типы и NULL

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

Типичные ошибки
01
Колонка объявлена строковой, а в ней числа — сортировка даёт порядок 1, 10, 2, 25 вместо числового
02
В строке сортировки опечатка в имени колонки — платформа выдаёт ошибку 'Колонка не обнаружена' при выполнении
03
Не указано направление сортировки — метод Сортировать('Сумма') завершится ошибкой
04
Сортируется исходная таблица, порядок которой нужен дальше по алгоритму — данные теряются без копии
05
В колонке смешаны NULL и значения — NULL неожиданно оказываются в начале списка

Сортировка с объектом СравнениеЗначений

Стандартное сравнение не всегда подходит: например, нужно упорядочить элементы справочника по реквизиту, которого нет в таблице, или задать собственный порядок статусов документа. Для таких случаев вторым параметром метода передаётся объект СравнениеЗначений.

Сравнение = Новый СравнениеЗначений;

ТЗ.Сортировать("Номенклатура Возр", Сравнение);

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

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

Метод Сортировать() — не единственный и не всегда оптимальный способ упорядочить данные. Если таблица заполняется из запроса, дешевле отсортировать данные ещё на уровне СУБД.

Сравнение вариантов

Метод Сортировать()

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

УПОРЯДОЧИТЬ ПО в запросе

Оптимально, если данные берутся из базы: сортировку выполняет СУБД с использованием индексов. Не применимо к данным не из запроса

Индексы таблицы значений

ТЗ.Индексы.Добавить("Колонка") ускоряет поиск через Найти() и НайтиСтроки(), но не меняет физический порядок строк

Построитель запроса / СКД

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

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

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

Производительность на больших таблицах

Сортировка выполняется в памяти, и на таблицах в сотни тысяч строк время становится заметным, особенно на тонком клиенте, если таблица сформирована там. Основные правила для больших объёмов:

  • Сортируйте один раз, после полного заполнения таблицы, а не внутри цикла добавления строк.
  • Сокращайте число колонок в строке сортировки до реально необходимых.
  • По возможности переносите сортировку в запрос — СУБД справляется с большими выборками эффективнее.
  • Если таблица используется только для поиска, вместо сортировки добавьте индекс: ТЗ.Индексы.Добавить("Код").

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

Часто задаваемые вопросы

Можно ли отсортировать таблицу значений без указания направления?

Нет. Для каждой колонки в строке сортировки направление обязательно: Возр или Убыв. Вызов ТЗ.Сортировать("Сумма") завершится ошибкой выполнения. Если нужен порядок по умолчанию, используйте Возр.

Как отсортировать табличную часть документа?

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

Почему числа сортируются как 1, 10, 2, 25?

Значит, колонка имеет строковый тип, и платформа сравнивает значения посимвольно. Объявите колонку с типом Число при создании таблицы или преобразуйте значения функцией Число() при заполнении. После этого сортировка станет числовой.

Куда попадают значения NULL при сортировке?

NULL считается меньше любого другого значения, поэтому при сортировке по возрастанию строки с NULL окажутся в начале таблицы, а по убыванию — в конце. Если такое поведение нежелательно, замените NULL конкретным значением (0, пустая строка) ещё на этапе заполнения таблицы.

Чем сортировка отличается от добавления индекса таблицы значений?

Сортировка физически меняет порядок строк в таблице. Индекс (ТЗ.Индексы.Добавить) порядок строк не меняет — он лишь ускоряет поиск методами Найти() и НайтиСтроки(). Если нужен именно упорядоченный обход строк в цикле, требуется сортировка; если нужен быстрый поиск — достаточно индекса.

Можно ли отсортировать по колонке, которой нет в таблице?

Напрямую — нет: метод выдаст ошибку «Колонка не обнаружена». Решение — добавить служебную колонку, заполнить её нужными значениями (например, реквизитом ссылки), отсортировать по ней, а после при необходимости удалить колонку методом Колонки.Удалить().

Итог

Что важно запомнить

Сортировка таблицы значений выполняется методом Сортировать() со строкой вида "Колонка Возр, Колонка2 Убыв"; метод меняет саму таблицу и ничего не возвращает. Следите за типами колонок и значениями NULL, а для данных из базы предпочитайте УПОРЯДОЧИТЬ ПО в запросе — это быстрее и предсказуемее.