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

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

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

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

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

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

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

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

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

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

В секции упорядочивания можно ссылаться на поля двумя способами: по имени поля выборки (псевдониму, заданному через КАК) или по выражению из списка выборки. Использовать в сортировке поле, которого нет в списке выборки, нельзя — конструктор запроса и платформа выдадут ошибку.

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

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

ВЫБРАТЬ

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

РеализацияТоваровУслуг.Номер КАК Номер,

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

ИЗ

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

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

Дата УБЫВ,

Номер ВОЗР

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

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

Автоупорядочивание: когда оно работает и когда мешает

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

ВЫБРАТЬ

ПриходнаяНакладная.Ссылка КАК Ссылка

ИЗ

Документ.ПриходнаяНакладная КАК ПриходнаяНакладная

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

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

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

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

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

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

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

Короче запись, но работает только для простых запросов со ссылочными полями и не позволяет задать произвольный критерий.

Без упорядочивания

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

Упорядочивание в запросах с итогами и группировками

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

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

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

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

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

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

Отдельный случай — виртуальные таблицы регистров. Упорядочивать следует итоговый результат запроса, а не пытаться сортировать данные внутри вложенного запроса к виртуальной таблице: платформа игнорирует упорядочивание во вложенных запросах и подзапросах, кроме случаев с конструкцией ПЕРВЫЕ.

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

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

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

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

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

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

Порядок значений ключевого поля
Норма

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

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

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

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

Порядок строк одинаков при нескольких запусках

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

Строки с равными значениями меняются местами

Запрос с ПЕРВЫЕ N
Норма

Возвращаются именно крайние по критерию записи

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

Возвращаются произвольные записи — сортировка не применилась

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

Можно ли упорядочить результат уже после выполнения запроса?

Да. Выгрузите результат в таблицу значений методом Выгрузить() и вызовите Сортировать("Поле1 Возр, Поле2 Убыв"). Это оправдано, когда критерий сортировки вычисляется в коде, но для больших выборок сортировка на стороне СУБД эффективнее.

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

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

Почему NULL-значения оказались в начале выборки?

При сортировке по возрастанию платформа помещает NULL перед обычными значениями. Если это мешает, исключите NULL условием ГДЕ НЕ Поле ЕСТЬ NULL либо замените его функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) в выборке и сортируйте по ней.

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

В динамическом списке сортировку обычно задаёт пользователь через интерфейс, и она имеет приоритет. Упорядочивание в тексте основного запроса динамического списка применяется, только если пользовательская сортировка не задана; для произвольного запроса списка лучше настраивать порядок через свойства компоновки.

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

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

Влияет ли регистр букв на сортировку строк?

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

Итог

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

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