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

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

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

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

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

Для сортировки в 1С существует встроенный метод Сортировать(), который упорядочивает строки «на месте», то есть изменяет саму таблицу, не создавая её копию. Метод принимает строку с перечислением колонок и направлений сортировки, а при необходимости — объект сравнения значений для нестандартных сценариев.

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

Синтаксис метода Сортировать и простейший пример

Метод вызывается у объекта таблицы значений и принимает обязательный параметр — строку с именами колонок и направлениями сортировки. Направление задаётся ключевыми словами Возр (по возрастанию, используется по умолчанию) и Убыв (по убыванию). Если направление не указано, колонка сортируется по возрастанию.

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

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

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

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

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

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

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

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

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

ТЗ.Сортировать("Склад Возр, Номенклатура Возр, Количество Убыв");

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

Количество колонок в списке практически не ограничено, но на практике достаточно двух-четырёх уровней. Если требуется больше, стоит проверить, не проще ли получить данные уже упорядоченными через запрос с предложением УПОРЯДОЧИТЬ ПО.

Порядок действий
  1. 1
    Определите колонки и направления сортировки
  2. 2
    Убедитесь, что колонки существуют и имеют сравнимые типы
  3. 3
    Вызовите ТЗ.Сортировать("Колонка1 Возр, Колонка2 Убыв")
  4. 4
    Пройдите по таблице циклом и проверьте порядок первых строк

Как типы данных влияют на результат

Сортировка выполняется по правилам сравнения значений платформы. Числа сравниваются арифметически, даты — хронологически, строки — лексикографически. Именно со строками чаще всего возникают неожиданности: строка «10» окажется раньше строки «2», потому что сравнение идёт посимвольно, а не по числовому значению.

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

Типичные ошибки
01
Сортировка строковой колонки с числами: '10' оказывается раньше '2' — храните числа в числовой колонке
02
Ожидание алфавитного порядка при сортировке по ссылке: ссылки сравниваются по внутреннему значению, а не по наименованию
03
Присвоение результата метода переменной: Сортировать ничего не возвращает, таблица меняется на месте
04
Опечатка в имени колонки: вызывает исключение 'Колонка не обнаружена'

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

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

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

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

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

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура,

| СУММА(Количество) КАК Количество

|ИЗ РегистрНакопления.Продажи.Обороты

|СГРУППИРОВАТЬ ПО Номенклатура

|УПОРЯДОЧИТЬ ПО Количество УБЫВ";

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

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

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

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

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

Быстрее на больших выборках и сортирует по полям БД, но только если данные берутся запросом

Служебная колонка с весами

Для произвольного нестандартного порядка; требует предварительного заполнения весов

Проверка результата и ограничения

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

Учитывайте, что метод Сортировать() доступен и на тонком, и на веб-клиенте, поэтому сортировку можно выполнять на клиенте без вызова сервера. Однако для очень больших таблиц (сотни тысяч строк) сортировка в памяти ощутимо нагружает сеанс — в таких случаях предпочтительнее запрос.

Контрольные точки

Как проверить результат

Порядок строк после вызова метода
Норма

Значения ключевой колонки не убывают (или не возрастают) по строкам

Тревожный признак

Порядок перемешан — проверьте тип колонки и имя в строке сортировки

Числовые значения
Норма

2 идёт раньше 10

Тревожный признак

10 раньше 2 — колонка строковая, нужен числовой тип

Сортировка по ссылочной колонке
Норма

Порядок стабилен и воспроизводим

Тревожный признак

Ожидался алфавит по наименованиям — добавьте колонку с представлением

Итог

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

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

Частые вопросы

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

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

Как отсортировать таблицу по наименованию, если в колонке хранятся ссылки?

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

Почему возникает ошибка «Колонка не обнаружена» при сортировке?

Имя колонки в строке сортировки не совпадает с фактическим именем: опечатка, лишний пробел или колонка создаётся динамически под другим именем. Проверьте состав колонок через ТЗ.Колонки в отладчике.

Меняет ли метод Сортировать исходную таблицу?

Да, сортировка выполняется «на месте» и изменяет текущий порядок строк. Если исходный порядок нужен, предварительно создайте копию методом ТЗ.Скопировать() и сортируйте её.

Что быстрее: Сортировать() или УПОРЯДОЧИТЬ ПО в запросе?

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

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

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