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

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

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

Разбираем сортировку в запросах 1С: конструкция УПОРЯДОЧИТЬ ПО, направления ВОЗР и УБЫВ, сортировка по нескольким полям, итогам и типичные ошибки.

Сортировка результата запроса в 1С выполняется конструкцией языка запросов «УПОРЯДОЧИТЬ ПО» (ORDER BY). Она указывается в конце текста запроса и определяет, по каким полям и в каком направлении будут упорядочены строки выборки. Без этой конструкции порядок строк в результате не гарантирован и может меняться от выполнения к выполнению.

Кроме основной конструкции, в языке запросов 1С есть вспомогательные механизмы: автоупорядочивание, сортировка итогов при группировке, а также программная сортировка уже полученной таблицы значений методом «Сортировать». Каждый вариант решает свою задачу, и выбор зависит от того, где именно нужен упорядоченный результат — на уровне СУБД или уже в коде.

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

Синтаксис конструкции УПОРЯДОЧИТЬ ПО

Конструкция «УПОРЯДОЧИТЬ ПО» располагается в самом конце текста запроса, после секций выборки, соединений, условий и группировок. Минимальный вид: имя поля и, при необходимости, направление сортировки.

ВЫБРАТЬ

Номенклатура.Ссылка КАК Товар,

Номенклатура.Наименование КАК Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

УПОРЯДОЧИТЬ ПО

Наименование

Если направление не указано, применяется сортировка по возрастанию (ВОЗР). Для обратного порядка используется ключевое слово УБЫВ (аналог DESC). В запросе можно сортировать как по полям источника, так и по псевдонимам, заданным в секции ВЫБРАТЬ — второй вариант обычно удобнее и читабельнее.

Важно помнить: «УПОРЯДОЧИТЬ ПО» должна идти после конструкции «СГРУППИРОВАТЬ ПО», но до конструкции «ИТОГИ ПО», если итоги тоже используются. Нарушение порядка секций приведёт к синтаксической ошибке при выполнении запроса.

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

Направление задаётся ключевыми словами ВОЗР (по умолчанию) и УБЫВ. Типичный пример — вывод последних документов по дате: сортировка по убыванию даты ставит самые свежие записи в начало выборки.

ВЫБРАТЬ

Реализация.Номер КАК Номер,

Реализация.Дата КАК Дата,

Реализация.СуммаДокумента КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

УПОРЯДОЧИТЬ ПО

Дата УБЫВ

При сортировке дат учитывайте, что поле типа «Дата» в документах обычно содержит и время, поэтому документы одного дня упорядочатся по времени создания. Если внутри дня нужен дополнительный порядок, добавьте второе поле — например, номер документа.

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

Поля в секции «УПОРЯДОЧИТЬ ПО» перечисляются через запятую. Сначала строки сортируются по первому полю, внутри одинаковых значений — по второму и так далее. Для каждого поля направление задаётся отдельно.

УПОРЯДОЧИТЬ ПО

Контрагент.Наименование ВОЗР,

Дата УБЫВ,

Сумма УБЫВ

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

Сортировка итогов и группировок

Когда в запросе используются итоги (конструкция «ИТОГИ ПО»), сортировка применяется и к детальным записям, и к группировочным. Чтобы упорядочить именно группы, поле сортировки должно присутствовать среди полей группировки или быть агрегатным выражением.

ВЫБРАТЬ

Продажи.Номенклатура КАК Товар,

СУММА(Продажи.Количество) КАК Количество

ИЗ

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

СГРУППИРОВАТЬ ПО

Продажи.Номенклатура

УПОРЯДОЧИТЬ ПО

Количество УБЫВ

ИТОГИ ПО

Товар

Такой приём удобен для отчётов «топ товаров по количеству»: группы выводятся от самых продаваемых к менее продаваемым. Если сортировать нужно по иерархии справочника (родители раньше дочерних элементов), используйте сортировку по полю с указанием «ИЕРАРХИЯ» — например, «УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ».

Автоупорядочивание: когда можно не писать УПОРЯДОЧИТЬ ПО

Конструкция «АВТОУПОРЯДОЧИВАНИЕ» включает сортировку по умолчанию: по представлению ссылочных полей и по значениям остальных полей выборки. Она выглядит просто, но имеет существенные ограничения.

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

УПОРЯДОЧИТЬ ПО

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

АВТОУПОРЯДОЧИВАНИЕ

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

Сортировка таблицы значений

Применяется после выгрузки результата. Гибко, но данные сортируются в памяти сервера 1С, а не на СУБД.

Основной недостаток автоупорядочивания — производительность: сортировка по представлениям ссылок заставляет СУБД выполнять дополнительные соединения. В больших выборках это заметно увеличивает время выполнения. Поэтому в явном виде «УПОРЯДОЧИТЬ ПО» предпочтительнее почти всегда.

Сортировка результата после выгрузки в таблицу значений

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

ТаблицаРезультат = Запрос.Выполнить().Выгрузить();

ТаблицаРезультат.Сортировать("Дата Убыв, Сумма Возр");

Направление в строке метода задаётся словами «Возр» и «Убыв». Учтите: метод сортирует данные в памяти, поэтому для больших таблиц сортировка на уровне запроса эффективнее. Метод оправдан, когда порядок формируется динамически и нельзя заранее встроить его в текст запроса, либо когда таблица собирается из нескольких источников.

Порядок действий
  1. 1
    Определите, по каким полям и в каком направлении нужен порядок строк
  2. 2
    Добавьте в конец запроса УПОРЯДОЧИТЬ ПО с перечислением полей через запятую
  3. 3
    Проверьте, что секция стоит после СГРУППИРОВАТЬ ПО и до ИТОГИ ПО
  4. 4
    Выполните запрос в консоли и убедитесь, что порядок строк соответствует ожиданию
  5. 5
    Добавьте уникальное поле в конец списка, если нужен стабильный порядок при повторах

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

Сортировка — одна из самых затратных операций запроса, особенно на больших таблицах без подходящих индексов. Если поле сортировки не входит в индекс, СУБД выполняет полное сканирование с сортировкой в памяти или во временных таблицах. Для часто выполняемых запросов с сортировкой по реквизиту имеет смысл включить этот реквизит в индексирование (свойство «Индексировать» у реквизита).

Ещё одна ошибка — сортировка по представлению ссылки через ВЫРАЗИТЬ или ПРЕДСТАВЛЕНИЕ. Такой запрос не использует индексы и на больших объёмах работает медленно. Если нужен алфавитный порядок по наименованию, сортируйте по самому полю «Наименование», а не по представлению ссылки.

Типичные ошибки
01
Отсутствие УПОРЯДОЧИТЬ ПО — порядок строк не гарантирован и может отличаться между файловой и клиент-серверной базой
02
Сортировка по представлению ссылки — запрос не использует индекс и замедляется на больших таблицах
03
Неверное расположение секции — УПОРЯДОЧИТЬ ПО перед группировкой вызывает синтаксическую ошибку
04
Сортировка по составному типу без приведения — порядок определяется внутренними идентификаторами типов, а не значениями
05
Ожидание стабильного порядка без уникального поля — строки с равными значениями меняются местами между запусками
Контрольные точки

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

Порядок строк в результате
Норма

Строки идут в заданном порядке по указанным полям и направлениям

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

Порядок случайный или меняется при повторном выполнении

Время выполнения запроса
Норма

Запрос с сортировкой выполняется сопоставимо с вариантом без неё

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

Добавление сортировки резко увеличивает время — проверьте индексы

Синтаксис запроса
Норма

Запрос выполняется без ошибок в консоли запросов

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

Ошибка о неверном порядке секций или неизвестном поле сортировки

Итог

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

Сортировка в запросе 1С задаётся конструкцией УПОРЯДОЧИТЬ ПО в конце текста запроса, направление — ВОЗР или УБЫВ, поля перечисляются через запятую. Для стабильного порядка добавляйте уникальное поле, для производительности — избегайте сортировки по представлениям и проверяйте индексы. После выгрузки результат можно пересортировать методом Сортировать() таблицы значений.

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

Чем УПОРЯДОЧИТЬ ПО отличается от ИТОГИ ПО?

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

Можно ли сортировать по полю, которого нет в списке выборки?

Да, в большинстве случаев сортировать можно по полю источника, даже если оно не выбрано в результат. Однако при использовании СГРУППИРОВАТЬ ПО сортировка ограничена полями группировки и агрегатными функциями. Надёжнее включать поле сортировки в выборку — так запрос понятнее и меньше риск ограничений.

Как отсортировать строки по алфавиту без учёта регистра?

Язык запросов 1С не имеет функции смены регистра для сортировки, а правила сравнения строк определяются настройками СУБД и базы данных. В большинстве типовых развёртываний сортировка строк уже регистронезависима. Если поведение отличается, проверьте collation базы на уровне СУБД — на стороне запроса это не настраивается.

Почему запрос без УПОРЯДОЧИТЬ ПО возвращает строки в разном порядке?

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

Как отсортировать динамический список в управляемой форме?

Для динамического списка сортировка задаётся либо в тексте основного запроса через УПОРЯДОЧИТЬ ПО, либо через настройки списка в форме (поле «Сортировка» в свойствах или пользовательская настройка порядка). Если включён режим настройки пользователем, его сортировка может переопределять заданную в запросе.

Влияет ли сортировка на скорость запроса и как её ускорить?

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