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

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

Как отсортировать в запросе 1С: инструкция с примерами

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

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

Конструкция работает и в обычном тексте запроса, и в консоли запросов, и в запросах, которые программно выполняются через объект Запрос. Синтаксис одинаков для всех поддерживаемых СУБД (MS SQL, PostgreSQL, Oracle, DB2, файловый вариант), потому что платформа сама транслирует текст запроса в диалект конкретной базы.

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

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

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

|ИЗ

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

|

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

| Наименование";

Для сортировки по убыванию после имени поля добавляется ключевое слово УБЫВ (в английском синтаксисе — DESC). Частый сценарий — вывести самые свежие документы первыми:

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

| РеализацияТоваровУслуг.Дата УБЫВ

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

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

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

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

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

| Продажи.СуммаОборот УБЫВ

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

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

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

Сортировка по иерархии справочника

Для иерархических справочников (номенклатура, контрагенты, статьи расходов) часто нужно вывести элементы так, чтобы дочерние элементы шли сразу за своей группой. Для этого после поля добавляется ключевое слово ИЕРАРХИЯ:

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

| Номенклатура.Ссылка ИЕРАРХИЯ

Условие для работы такой сортировки: поле должно быть ссылкой на иерархический справочник. Сортировка по иерархии упорядочивает строки так, что родитель всегда предшествует потомкам, а внутри одного уровня порядок определяется представлением ссылки.

Распространённая ошибка — ожидать, что сортировка по иерархии одновременно отсортирует элементы по наименованию внутри каждой группы. Это не так: для комбинированного порядка нужно сначала упорядочить по полю с иерархией, а затем добавить дополнительное поле, либо использовать в запросе соединение с виртуальной таблицей и сортировку по наименованию с учётом родителя.

Типичные ошибки
01
Указание ИЕРАРХИЯ для неиерархического поля — запрос падает с ошибкой или сортировка молча не работает так, как ожидалось
02
Сортировка по полю, которого нет в списке выборки объединённого запроса — в частях ОБЪЕДИНИТЬ все поля сортировки должны присутствовать в результате
03
Ожидание стабильного порядка без УПОРЯДОЧИТЬ ПО — на разных СУБД и после реиндексации порядок строк меняется, и отчёт «плывёт»
04
Сортировка строкового поля с числами — '10' окажется раньше '2', потому что сравнение идёт посимвольно

Сортировка при использовании итогов и группировок

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

ИТОГИ

| СУММА(СуммаОборот) ПО

| Период

|

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

| Период,

| СуммаОборот УБЫВ

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

Если итоги строятся по иерархии (ИТОГИ ПО Поле ТОЛЬКО ИЕРАРХИЯ или ПО ... ИЕРАРХИЯ), то и упорядочивание логично выполнять по тому же полю с ключевым словом ИЕРАРХИЯ — иначе вложенные группы могут выводиться в неожиданном порядке.

Автоупорядочивание и когда его не хватает

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

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

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

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

Полный контроль над полями и направлением. Рекомендуется для всех прикладных запросов и отчётов

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

Подходит для черновых и служебных запросов, где порядок не критичен. Может добавлять лишнюю нагрузку на СУБД

Сортировка в коде после запроса

Оправдана только когда порядок зависит от данных, недоступных в запросе, например от результатов вычислений на встроенном языке

Особые случаи и ограничения

При использовании РАЗЛИЧНЫЕ или ПЕРВЫЕ n сортировка работает штатно, но важно понимать логику: сначала применяется упорядочивание, затем отбираются первые n записей. Поэтому конструкция ВЫБРАТЬ ПЕРВЫЕ 10 ... УПОРЯДОЧИТЬ ПО Сумма УБЫВ — корректный способ получить топ-10 по сумме.

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

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

Проверка результата сортировки

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

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

Контрольные точки

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

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

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

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

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

Сортировка по числам в строковом поле
Норма

Числа упорядочены по значению

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

'10' стоит перед '2' — поле строковое, нужна сортировка по числовому полю или приведение типов

Иерархический порядок
Норма

Родитель всегда выше своих дочерних элементов

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

Элементы перемешаны без учёта групп — не указано ключевое слово ИЕРАРХИЯ

Итог

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

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

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

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

В простом запросе без ОБЪЕДИНИТЬ платформа часто позволяет упорядочить по полю таблицы, даже если оно не выбрано. Однако в объединённых запросах и при работе с различными СУБД надёжнее включать поле сортировки в список выборки — это гарантирует предсказуемое поведение и упрощает отладку.

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

Строковое поле сортируется посимвольно, поэтому «10» окажется раньше «2». Решения: хранить значение в числовом поле, привести строку к числу через выражение в запросе (если формат гарантированно числовой) либо дополнять строку ведущими нулями до фиксированной длины.

Работает ли УПОРЯДОЧИТЬ ПО в СКД?

В системе компоновки данных сортировку обычно задают на закладке «Сортировка» настроек отчёта, а не в тексте запроса набора данных. Если упорядочивание прописано в тексте запроса, оно применяется к выборке до обработки СКД, но пользовательские настройки сортировки могут его переопределить на уровне итогового вывода.

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

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

Чем отличается сортировка по ссылке от сортировки по наименованию?

Сортировка по ссылке упорядочивает по внутреннему уникальному идентификатору объекта, который не совпадает с алфавитным порядком наименований. Для пользовательских отчётов почти всегда нужна сортировка по наименованию или представлению, а сортировка по ссылке уместна только в служебных механизмах.

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

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