Правильный порядок строк в 1С: от списков до запросов

· 9 мин

Содержание

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

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

Где задаётся порядок строк: быстрый ориентир

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

Что сортируетеГде настраиватьИнструмент
Журнал, список справочникаФорма спискаКлик по заголовку, Ещё → Настроить список
Строки отчётаНастройки отчётаВкладка Сортировка в СКД
Выборку в кодеТекст запросаУПОРЯДОЧИТЬ ПО
Таблицу значений, деревоОбъект в памятиМетод Сортировать
Табличную частьДокументСтрелки перемещения или Сортировать
Вид «по умолчанию» для всехКонфигураторНастройка списка, индекс реквизита

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

Порядок в списках и журналах в режиме «Предприятие»

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

Если нужна сортировка по нескольким полям сразу или по колонке, которой нет в видимой таблице, откройте меню Ещё → Настроить список… и перейдите на вкладку Сортировка. Слева — доступные поля, справа — выбранные. Перетащите нужные, стрелками задайте направление (↑ возрастание, ↓ убывание) и порядок приоритета: верхнее поле — главное, остальные уточняют.

💡 Порядок полей в правой колонке — это и есть приоритет. Сначала система сортирует по первому полю, при равных значениях — по второму, и так далее.

Настройка сохраняется для текущего пользователя на этой форме. Чтобы вернуться к исходному виду, в том же меню выберите Установить стандартные настройки.

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

Сортировка в отчётах на системе компоновки данных (СКД)

В любом отчёте на СКД порядок строк настраивается не в запросе, а в пользовательских настройках. Откройте отчёт, нажмите Настройки (или Ещё → Изменить вариант для расширенной настройки) и найдите вкладку Сортировка.

Принцип тот же, что и в списках: выбираете поля, направление и приоритет. Но у СКД есть важная особенность — сортировка применяется внутри каждой группировки.

Если в отчёте есть группировки (например, по складу, затем по номенклатуре), то:

  • порядок самих групп задаётся сортировкой на уровне этой группировки;
  • порядок строк внутри группы — сортировкой на уровне детальных записей.

🔸 Частая путаница: пользователь задаёт сортировку по сумме, а строки упорядочены по названию. Причина — сортировка стоит на уровне Детальные записи, а группировка по номенклатуре сортирует номенклатуру по наименованию. Нужно открыть структуру отчёта, встать на нужную группировку и задать сортировку именно для неё.

Ещё один момент — элемент Порядок в самой структуре компоновки. Если разработчик зафиксировал порядок в макете, пользовательская сортировка может быть заблокирована или объединяться с фиксированной. Тогда настраивать порядок нужно в конфигураторе, в схеме компоновки данных на вкладке Настройки → Сортировка.

Порядок по умолчанию на уровне конфигурации

То, как список выглядит при первом открытии, задаётся в конфигураторе. Здесь три рычага.

Настройка списка на форме. У реквизита формы типа «Динамический список» есть свойство с настройками. Через Настройка списка можно задать сортировку по умолчанию, а флаг фиксированной настройки запретит пользователю её менять. Это удобно, когда журнал всегда должен идти, например, по дате убывания.

Индексирование реквизита. Чтобы по реквизиту справочника или документа можно было быстро сортировать и отбирать, его индексируют. У реквизита есть свойство Индексировать со значениями:

  • Не индексировать — сортировка по полю будет медленной или недоступной в динамическом списке;
  • Индексировать — обычный индекс;
  • Индексировать с доп. упорядочиванием — индекс плюс поле представления, нужен когда сортируете по ссылочному реквизиту и хотите порядок по его представлению.

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

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

Управление порядком в запросах: УПОРЯДОЧИТЬ ПО

В коде порядок строк задаёт секция УПОРЯДОЧИТЬ ПО в конце запроса. Синтаксис простой:

ВЫБРАТЬ
    Номенклатура.Наименование КАК Наименование,
    Номенклатура.Код КАК Код
ИЗ
    Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
    Наименование ВОЗР,
    Код УБЫВ

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

Несколько практических нюансов, которые экономят часы отладки:

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

Иерархия. Для иерархических справочников есть особая форма — упорядочивание с сохранением иерархии. Используйте ключевое слово ИЕРАРХИЯ:

УПОРЯДОЧИТЬ ПО
    Наименование ИЕРАРХИЯ

Тогда элементы расположатся внутри своих групп, а не сплошным плоским списком.

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

Если в запросе есть СГРУППИРОВАТЬ ПО, то упорядочивать можно только по полям группировки или по агрегатным функциям (СУММА, КОЛИЧЕСТВО). Попытка отсортировать по полю, которого нет в группировке, вызовет ошибку.

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

Первые N строк в нужном порядке. Чтобы выбрать, например, десять последних документов, сочетайте ПЕРВЫЕ и сортировку по убыванию:

ВЫБРАТЬ ПЕРВЫЕ 10
    Продажа.Ссылка КАК Ссылка,
    Продажа.Дата КАК Дата
ИЗ
    Документ.РеализацияТоваровУслуг КАК Продажа
УПОРЯДОЧИТЬ ПО
    Дата УБЫВ

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

Естественная сортировка кодов и артикулов. Если артикулы вида А-2, А-10 должны идти по-человечески, а не по алфавиту, одного запроса мало: текст сортируется посимвольно. Рабочий приём — хранить числовую часть в отдельном числовом реквизите и сортировать по нему, либо добивать номер ведущими нулями при вводе (А-002, А-010), чтобы длина строки совпадала.

Порядок в таблицах значений и других коллекциях

Данные, собранные в памяти, сортируются методом объекта, а не запросом.

Таблица значений и дерево значений. Метод Сортировать принимает строку с колонками и направлением:

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

Сначала строки упорядочатся по складу по возрастанию, при равных складах — по сумме по убыванию. Названия направлений пишутся по-русски: Возр и Убыв.

Список значений. У списка значений есть два метода: СортироватьПоЗначению() и СортироватьПоПредставлению(), каждый принимает направление сортировки как параметр.

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

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

Сортировка табличных частей и табличных документов

Здесь часто возникает недопонимание, поэтому разберём отдельно.

Табличная часть документа. Строки табличной части хранятся в том порядке, в котором их добавили. Интерактивной «вечной» сортировки по клику, как в динамических списках, у табличной части нет — пользователь может менять порядок строк стрелками Переместить вверх/вниз. Если нужно упорядочить табличную часть программно, используйте метод Сортировать:

Документ.Товары.Сортировать("Номенклатура");

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

Табличный документ (макет вывода). У табличного документа — того, что формируется на печать или в отчёт, — встроенной интерактивной сортировки готового результата нет. Порядок строк в нём определяется тем, в каком порядке вы выводите данные. Поэтому сортировать нужно источник: отсортируйте таблицу значений или результат запроса до вывода в макет, и строки лягут в нужном порядке.

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

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

Чаще всего причина не в том, что сортировка сломалась, а в том, что сортируется не то поле или не тем типом. Сопоставьте симптом с причиной:

Диагностика: выберите симптом

Отдельно про регистр и буквы «е»/«ё». Сравнение строк в 1С по умолчанию нечувствительно к регистру, а «е» и «ё» считаются разными символами. Если список расходится с ожиданием именно на словах с «ё» — это оно.

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

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