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

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

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

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

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

Без явного упорядочивания платформа не гарантирует никакого порядка строк. Даже если запрос «вчера возвращал данные по алфавиту», после переиндексации таблицы или смены плана запроса порядок может измениться. Поэтому любой отчёт, обработка или печатная форма, где последовательность строк важна, должна содержать явную сортировку.

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

Базовый синтаксис УПОРЯДОЧИТЬ ПО

Конструкция записывается после всех остальных секций запроса, включая ИТОГИ. Минимальный вариант — указание одного поля:

ВЫБРАТЬ

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

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

ИЗ

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

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

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

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

ВЫБРАТЬ

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

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

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

ИЗ

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

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

Реализация.Дата УБЫВ

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

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

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

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

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

Дата УБЫВ,

Номер УБЫВ

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

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

Как добавить сортировку в существующий запрос
  1. 1
    Откройте конструктор запроса или текст модуля и найдите конец текста запроса — после секций ИТОГИ и ОБЪЕДИНИТЬ.
  2. 2
    Добавьте строку УПОРЯДОЧИТЬ ПО и перечислите поля через запятую, указывая ВОЗР или УБЫВ.
  3. 3
    Выполните запрос в консоли запросов и проверьте порядок строк на реальных данных.
  4. 4
    Если сортируете по ссылочному полю, проверьте, нужен ли порядок по представлению — тогда добавьте АВТОУПОРЯДОЧИВАНИЕ.

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

Ссылочные поля (документы, элементы справочников) по умолчанию сортируются по внутреннему представлению ссылки, а не по наименованию или номеру, которые видит пользователь. В результате «Апельсины» могут оказаться выше «Абрикосов», что выглядит как ошибка.

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

ВЫБРАТЬ

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

СУММА(Товары.Количество) КАК Количество

ИЗ

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

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

Товары.Номенклатура

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

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

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

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

Способы упорядочить ссылочные поля

По реквизиту через точку (Товар.Наименование)

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

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

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

Без указания (сортировка по ссылке)

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

Сортировка итогов и вложенных записей

Когда запрос содержит секцию ИТОГИ, результат обходится иерархически — по группировкам. Сортировка в этом случае применяется на каждом уровне иерархии отдельно: группы первого уровня упорядочиваются между собой, внутри каждой группы упорядочиваются подчинённые строки.

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

Сортировка по агрегату работает и позволяет, например, вывести контрагентов по убыванию суммы продаж:

ВЫБРАТЬ

Продажи.Контрагент КАК Контрагент,

СУММА(Продажи.СуммаОборот) КАК Сумма

ИЗ

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

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

Продажи.Контрагент

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

Сумма УБЫВ

Особые случаи: NULL, ПЕРВЫЕ и динамические списки

Поведение NULL при сортировке

Если в сортируемом поле встречаются значения NULL (типично для левых соединений и итоговых записей), платформа помещает их в начало при сортировке по возрастанию. Это стоит учитывать: строка с пустым остатком окажется выше всех заполненных. Если такое поведение нежелательно, замените NULL на вычисляемое значение через ЕСТЬNULL(Поле, 0) и сортируйте по нему.

Сочетание с ПЕРВЫЕ

Конструкция ВЫБРАТЬ ПЕРВЫЕ 10 без сортировки бессмысленна — платформа вернёт произвольные десять строк. «Топ-10 должников» или «последние 5 документов» всегда требуют пары: ПЕРВЫЕ + УПОРЯДОЧИТЬ ПО с корректным направлением.

Динамические списки

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

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

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

Обратите внимание на строковые поля: сортировка выполняется по правилам collation базы данных, поэтому «ё» может оказаться не там, где ожидает пользователь, а цифры в строковом поле сортируются как текст — «10» раньше «2». Если номер хранится строкой, а нужен числовой порядок, потребуется дополнительное вычисляемое поле или изменение логики нумерации.

Типичные ошибки
01
Полагаться на порядок без УПОРЯДОЧИТЬ ПО — после изменения плана запроса порядок строк меняется, и отчёт «ломается» у пользователя.
02
Сортировать по ссылке и ждать алфавитного порядка — ссылки упорядочиваются по внутреннему идентификатору, а не по наименованию.
03
Использовать ПЕРВЫЕ N без сортировки — возвращаются произвольные строки, а не «первые» в понимании пользователя.
04
Ставить УПОРЯДОЧИТЬ ПО внутри вложенного запроса и ждать сохранения порядка во внешней выборке — внешний запрос его не гарантирует.
05
Сортировать по строковому номеру и удивляться, что 10 идёт раньше 2 — строки сравниваются посимвольно.
Контрольные точки

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

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

Строки идут в заданном порядке, включая границы одинаковых значений

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

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

Ссылочные поля
Норма

Справочники выводятся по наименованию, документы — по дате и номеру

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

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

Значения NULL
Норма

Пустые значения находятся там, где ожидалось (обычно в начале при ВОЗР)

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

Строки с NULL попадают в середину итогов или нарушают группировку

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

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

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

Как отсортировать по убыванию только одно поле из нескольких?

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

Почему запрос с сортировкой стал работать медленнее?

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

Можно ли сортировать по полю, которого нет в секции ВЫБРАТЬ?

Да, язык запросов позволяет сортировать по любому доступному полю таблицы-источника, даже если оно не выводится в результат. Однако для читаемости и совместимости рекомендуется включать такое поле в выборку или использовать псевдоним.

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

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

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

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

Итог

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

Порядок строк в запросе 1С гарантирует только явная конструкция УПОРЯДОЧИТЬ ПО с указанием полей и направления. Для ссылочных полей сортируйте по реквизиту или добавляйте АВТОУПОРЯДОЧИВАНИЕ, сочетайте ПЕРВЫЕ с сортировкой и проверяйте результат на реальных данных, особенно при NULL и строковых номерах.