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