Сортировка данных в 1С 8.3 — от клика по колонке до УПОРЯДОЧИТЬ ПО

· 9 мин

Содержание

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

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

Сортировка в списках и табличных частях без программирования

В интерфейсе «Такси» сортировка доступна в любом динамическом списке: справочники, журналы документов, регистры.

Сортировка щелчком по колонке

  1. Откройте список, например Справочники → Номенклатура или журнал документов .
  2. Щёлкните по заголовку нужной колонки. Рядом с названием появится стрелка.
  3. Щёлкните ещё раз — порядок сменится на обратный.

Список запомнит выбранную сортировку для вашего пользователя. В следующий раз форма откроется в том же порядке.

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

Щелчок по колонке сортирует только по одному полю. Если нужно «сначала по контрагенту, внутри — по дате», откройте настройку списка через меню Ещё в командной панели формы. На вкладке «Сортировка» перетащите поля в правую часть в нужном порядке и задайте направление каждому.

  • 🔼 «По возрастанию» — от А до Я, от меньшего к большему, от старой даты к новой.
  • 🔽 «По убыванию» — наоборот.
  • ↕️ Порядок строк в правой части и есть приоритет: верхнее поле главное.

В той же настройке есть кнопка возврата стандартных настроек. Она полезна, если список «сломался» после экспериментов и строки идут в странном порядке.

Табличная часть документа

В табличных частях (товары, услуги, сотрудники) сортировка меняет фактический порядок строк. Выделите колонку и найдите в меню Ещё команды сортировки по возрастанию и убыванию. После записи документа строки сохранятся в новом порядке, и номера строк пересчитаются.

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

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

В режиме иерархического просмотра группы всегда идут выше элементов внутри каждого уровня. Сортировка по колонке работает внутри уровня, а не по всему справочнику. Нужен сплошной алфавитный список — переключите вид на «Список» в меню Ещё.

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

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

ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.Номенклатура.Наименование КАК Наименование,
    СУММА(Продажи.Сумма) КАК Сумма
ИЗ
    РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
    Продажи.Номенклатура
УПОРЯДОЧИТЬ ПО
    Сумма УБЫВ,
    Наименование

Что здесь происходит:

  • 🔢 Сумма УБЫВ — сначала самые крупные продажи.
  • 🔤 Наименование — при равной сумме по алфавиту. Слово ВОЗР можно не писать, это направление по умолчанию.
  • 🏷️ В УПОРЯДОЧИТЬ ПО можно ссылаться на псевдонимы полей из ВЫБРАТЬ.

Полезные варианты конструкции

КонструкцияЧто делаетКогда нужна
УПОРЯДОЧИТЬ ПО Поле УБЫВСортировка по убываниюТоп продаж, последние документы
УПОРЯДОЧИТЬ ПО Поле1, Поле2Многоуровневая сортировкаГруппировка по контрагенту, затем по дате
УПОРЯДОЧИТЬ ПО Поле ИЕРАРХИЯПорядок с учётом иерархии справочникаВыборка групп и элементов «деревом»
АВТОУПОРЯДОЧИВАНИЕПлатформа подставляет порядок по умолчанию для ссылочных полейБыстрые выборки, где точный порядок не критичен
ВЫБРАТЬ ПЕРВЫЕ 10 … УПОРЯДОЧИТЬ ПОТоп-NДесять самых дорогих позиций

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

Если упорядочить по полю типа СправочникСсылка.Номенклатура, платформа сортирует не по внутреннему идентификатору, а по порядку объекта по умолчанию: у справочников — обычно по наименованию или коду, у документов — по дате. Для этого ей приходится обращаться к таблице самого объекта.

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

Документы с одинаковой датой

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

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

УПОРЯДОЧИТЬ ПО
    Документ.МоментВремени

Момент времени учитывает и дату, и ссылку на документ, поэтому порядок однозначен. Именно так платформа упорядочивает документы при расчёте остатков, и в отчётах «по хронологии» стоит придерживаться того же правила.

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

Если пишете запрос не вручную, откройте конструктор запроса и перейдите на вкладку «Порядок». Перенесите поля из левой части в правую и выберите направление в колонке «Тип упорядочивания». Флажок «Автоупорядочивание» там же.

Временные таблицы и вложенные запросы: где порядок теряется

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

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

Временная таблица — это таблица СУБД, а у таблицы нет «порядка строк». При следующем ВЫБРАТЬ … ИЗ ВТ_Остатки строки могут прийти как угодно.

Правило простое:

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

ИНДЕКСИРОВАТЬ ПО — это не сортировка

Конструкция ИНДЕКСИРОВАТЬ ПО Номенклатура у временной таблицы ускоряет соединения и отборы по этому полю. Порядок строк при выборке она не задаёт. Путать эти две вещи — типичная причина «плавающей» сортировки в отчётах.

Сортировка в отчётах на СКД

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

В конфигураторе (для разработчика)

  1. Откройте схему компоновки данных.
  2. Перейдите на вкладку «Настройки».
  3. Выделите нужную группировку в структуре отчёта (или сам отчёт, если порядок общий).
  4. На нижней вкладке «Порядок» добавьте поля и задайте направление.

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

Поле «Авто» в порядке группировки означает «по полям самой группировки». Если вы добавили своё поле выше «Авто», оно станет главным.

В режиме пользователя

В большинстве типовых отчётов БП 3.0, ЗУП 3.1 и УТ 11 нажмите «Настройки» и найдите вкладку или раздел «Сортировка». Отметьте поле и направление, затем «Закрыть и сформировать».

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

Динамический список: сортировка программно

Если нужно задать порядок списка при открытии формы, используйте настройки компоновки динамического списка:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ЭлементПорядка = Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Дата");
    ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
    ЭлементПорядка.Использование = Истина;

КонецПроцедуры

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

Сортировка коллекций в памяти: таблица значений, список значений

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

Таблица значений — метод Сортировать() принимает строку с колонками и направлениями через запятую:

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

Табличная часть объекта сортируется так же:

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

Список значений — два метода:

СписокКодов.СортироватьПоЗначению(НаправлениеСортировки.Возр);
СписокКодов.СортироватьПоПредставлению(НаправлениеСортировки.Убыв);

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

Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(МассивЧисел);
Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);
МассивЧисел = Список.ВыгрузитьЗначения();

Если в колонке таблицы значений лежат ссылки, порядок по такой колонке может не совпасть с алфавитным. Нужна сортировка «как видит пользователь» — добавьте колонку с наименованием и сортируйте по ней.

Производительность сортировки и индексы

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

Что ускоряет

  • 📇 Индекс по полю сортировки. У реквизита справочника или документа в конфигураторе есть свойство «Индексировать». Значение «Индексировать с доп. упорядочиванием» строит индекс, удобный для сортировки списков по этому реквизиту.
  • ✂️ ПЕРВЫЕ N. Если пользователю нужны 20 последних документов, не выбирайте 200 000 и не сортируйте их в коде.
  • 🎯 Отбор до сортировки. Сначала сузьте выборку условием ГДЕ по периоду или организации, потом сортируйте.

Что замедляет

  • 🐢 Сортировка динамического списка по неиндексированному реквизиту на большой таблице. Каждое открытие формы — полная сортировка на сервере СУБД.
  • 🔗 Сортировка по полям «через точку» (Документ.Контрагент.ИНН) — каждое разыменование добавляет соединение.
  • 🧮 Сортировка по вычисляемому выражению (ВЫБОР … КОГДА), по которому индекс использовать нельзя.

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

Частые ошибки при сортировке и как их исправить

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

Ещё одна неочевидная деталь — коды справочников с префиксом. Код 00-000010 встанет выше 00-000009 правильно, только пока длина и формат кода одинаковы. После ручной правки кодов без ведущих нулей сортировка по коду ломается, и лечится это только приведением кодов к единому виду.

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

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