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

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

1С: ВЫБРАТЬ и УПОРЯДОЧИТЬ ПО — сортировка данных в запросе

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

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

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

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

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

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

НЕ Номенклатура.ПометкаУдаления

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

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

В списке сортировки можно использовать как поля из секции ВЫБРАТЬ (по имени или по псевдониму), так и поля источника, которые в выборку не входят. Однако есть ограничение: если в запросе применяется итоговая группировка (СГРУППИРОВАТЬ ПО) или итоги (ИТОГИ ПО), сортироваться можно только по полям группировки, агрегатным функциям и полям итогов — иначе конструктор запроса выдаст ошибку.

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

Сортировка по нескольким полям и направления ВОЗР / УБЫВ

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

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

Контрагент ВОЗР,

Дата УБЫВ,

Номер УБЫВ

Такой фрагмент вернёт документы, сгруппированные по контрагенту по алфавиту, а внутри каждого контрагента — от новых к старым. Это типовой приём для отчётов, где нужна иерархия «группа → детальные записи».

Ключевые слова ВОЗР и УБЫВ — это русские аналоги ASC и DESC. Встроенный язык 1С допускает и английский синтаксис (ORDER BY, ASC, DESC), но в типовых конфигурациях принят русский вариант, и конструктор запросов генерирует именно его.

УПОРЯДОЧИТЬ ПО вместе с ВЫБРАТЬ ПЕРВЫЕ и РАЗЛИЧНЫЕ

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

ВЫБРАТЬ ПЕРВЫЕ 5

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

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

ИЗ

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

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

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

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

Сумма УБЫВ

Этот запрос возвращает топ-5 товаров по сумме продаж. Обратите внимание: сортировка идёт по псевдониму агрегатного поля — это разрешено, потому что Сумма входит в список выборки.

При использовании РАЗЛИЧНЫЕ сортировка работает по тем же правилам, но помните: убедитесь, что набор полей в выборке действительно даёт нужную уникальность, иначе после упорядочивания можно получить «лишние» строки, которые визуально выглядят как дубли.

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

Сортировка при итогах и иерархии

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

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

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

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

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

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

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

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

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

Точный контроль порядка, выполняется на сервере СУБД. Обязателен для ПЕРВЫЕ N и логики, зависящей от последовательности строк.

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

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

Сортировать() у таблицы значений

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

Типичные ошибки и как их проверить

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

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

Третья ошибка — сортировка по полю, содержащему NULL. Строки со значением NULL в поле сортировки обычно идут первыми при ВОЗР, что может быть неожиданным. Отфильтруйте их в ГДЕ или обработайте через ЕСТЬNULL(Поле, ЗначениеПоУмолчанию).

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

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

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

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

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

Порядок нарушается на одинаковых значениях первого поля — добавьте второе поле сортировки

Проверьте строки с NULL в поле сортировки
Норма

NULL-строки отфильтрованы или стоят там, где ожидается

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

Неожиданные строки в начале выборки при ВОЗР

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

Рост времени незначителен на рабочем объёме данных

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

Запрос стал заметно медленнее — пересмотрите поля сортировки или индексы

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

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

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

Чем ВОЗР отличается от УБЫВ и что используется по умолчанию?

ВОЗР — сортировка по возрастанию (от меньшего к большему), УБЫВ — по убыванию. Если направление не указано, применяется ВОЗР. Это аналоги ASC и DESC в стандартном SQL.

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

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

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

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

Работает ли УПОРЯДОЧИТЬ ПО во временных таблицах и пакетных запросах?

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

Что выбрать: АВТОУПОРЯДОЧИВАНИЕ или явное УПОРЯДОЧИТЬ ПО?

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

Итог

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

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