Сортировка данных в 1С 8.3 — от клика по колонке до УПОРЯДОЧИТЬ ПО
Содержание
Чтобы сделать сортировку в 1С, пользователю достаточно щёлкнуть по заголовку колонки списка: первый щелчок сортирует по возрастанию, второй — по убыванию. Разработчик сортирует в запросе конструкцией УПОРЯДОЧИТЬ ПО Поле УБЫВ, в отчёте на СКД — на вкладке «Порядок», а в коде — методом Сортировать() у таблицы значений.
Какой способ выбрать, зависит от того, кто и где сортирует. Пользователю нужен интерфейс и настройки отчёта. Программисту — запрос, если данные приходят из базы, и методы коллекций, если данные уже в памяти. Ниже по каждому варианту — что работает и где чаще всего ошибаются.
Сортировка в списках и табличных частях без программирования
В интерфейсе «Такси» сортировка доступна в любом динамическом списке: справочники, журналы документов, регистры.
Сортировка щелчком по колонке
- Откройте список, например
Справочники → Номенклатураили журнал документов . - Щёлкните по заголовку нужной колонки. Рядом с названием появится стрелка.
- Щёлкните ещё раз — порядок сменится на обратный.
Список запомнит выбранную сортировку для вашего пользователя. В следующий раз форма откроется в том же порядке.
Сортировка по нескольким полям
Щелчок по колонке сортирует только по одному полю. Если нужно «сначала по контрагенту, внутри — по дате», откройте настройку списка через меню Ещё в командной панели формы. На вкладке «Сортировка» перетащите поля в правую часть в нужном порядке и задайте направление каждому.
- 🔼 «По возрастанию» — от А до Я, от меньшего к большему, от старой даты к новой.
- 🔽 «По убыванию» — наоборот.
- ↕️ Порядок строк в правой части и есть приоритет: верхнее поле главное.
В той же настройке есть кнопка возврата стандартных настроек. Она полезна, если список «сломался» после экспериментов и строки идут в странном порядке.
Табличная часть документа
В табличных частях (товары, услуги, сотрудники) сортировка меняет фактический порядок строк. Выделите колонку и найдите в меню Ещё команды сортировки по возрастанию и убыванию. После записи документа строки сохранятся в новом порядке, и номера строк пересчитаются.
Если документ уже передан контрагенту или выгружен по ЭДО, пересортировка табличной части изменит нумерацию строк в печатной форме. Для проведённых и отправленных документов лучше не трогать порядок.
Сортировка в иерархических справочниках
В режиме иерархического просмотра группы всегда идут выше элементов внутри каждого уровня. Сортировка по колонке работает внутри уровня, а не по всему справочнику. Нужен сплошной алфавитный список — переключите вид на «Список» в меню Ещё.
Программная сортировка: УПОРЯДОЧИТЬ ПО в языке запросов
В запросе порядок строк задаёт секция УПОРЯДОЧИТЬ ПО. Без неё СУБД возвращает строки в произвольном порядке. Он может совпасть с ожидаемым на тестовой базе и разойтись на рабочей.
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Номенклатура.Наименование КАК Наименование,
СУММА(Продажи.Сумма) КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ,
Наименование
Что здесь происходит:
- 🔢
Сумма УБЫВ— сначала самые крупные продажи. - 🔤
Наименование— при равной сумме по алфавиту. СловоВОЗРможно не писать, это направление по умолчанию. - 🏷️ В
УПОРЯДОЧИТЬ ПОможно ссылаться на псевдонимы полей изВЫБРАТЬ.
Полезные варианты конструкции
| Конструкция | Что делает | Когда нужна |
|---|---|---|
УПОРЯДОЧИТЬ ПО Поле УБЫВ | Сортировка по убыванию | Топ продаж, последние документы |
УПОРЯДОЧИТЬ ПО Поле1, Поле2 | Многоуровневая сортировка | Группировка по контрагенту, затем по дате |
УПОРЯДОЧИТЬ ПО Поле ИЕРАРХИЯ | Порядок с учётом иерархии справочника | Выборка групп и элементов «деревом» |
АВТОУПОРЯДОЧИВАНИЕ | Платформа подставляет порядок по умолчанию для ссылочных полей | Быстрые выборки, где точный порядок не критичен |
ВЫБРАТЬ ПЕРВЫЕ 10 … УПОРЯДОЧИТЬ ПО | Топ-N | Десять самых дорогих позиций |
Сортировка по ссылочному полю
Если упорядочить по полю типа СправочникСсылка.Номенклатура, платформа сортирует не по внутреннему идентификатору, а по порядку объекта по умолчанию: у справочников — обычно по наименованию или коду, у документов — по дате. Для этого ей приходится обращаться к таблице самого объекта.
На небольших выборках разницы не видно. На сотнях тысяч строк лучше явно указать поле: УПОРЯДОЧИТЬ ПО Наименование, если наименование уже выбрано в запросе.
Документы с одинаковой датой
Сортировка документов только по полю Дата даёт сбой, когда у нескольких документов совпадает время с точностью до секунды. Так бывает при групповом вводе, загрузке из банка или обмене. Порядок таких документов между запусками может меняться.
Для хронологического порядка используйте момент времени:
УПОРЯДОЧИТЬ ПО
Документ.МоментВремени
Момент времени учитывает и дату, и ссылку на документ, поэтому порядок однозначен. Именно так платформа упорядочивает документы при расчёте остатков, и в отчётах «по хронологии» стоит придерживаться того же правила.
Как сделать сортировку в конструкторе запроса
Если пишете запрос не вручную, откройте конструктор запроса и перейдите на вкладку «Порядок». Перенесите поля из левой части в правую и выберите направление в колонке «Тип упорядочивания». Флажок «Автоупорядочивание» там же.
Временные таблицы и вложенные запросы: где порядок теряется
Частая ловушка — ставить УПОРЯДОЧИТЬ ПО в запрос, который помещает данные во временную таблицу.
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
УПОРЯДОЧИТЬ ПО
Остатки.КоличествоОстаток УБЫВ
Временная таблица — это таблица СУБД, а у таблицы нет «порядка строк». При следующем ВЫБРАТЬ … ИЗ ВТ_Остатки строки могут прийти как угодно.
Правило простое:
- Во временных таблицах и вложенных запросах сортировку не ставьте.
- Исключение — связка с
ПЕРВЫЕ N: там порядок определяет, какие именно N строк попадут в выборку. - Итоговый порядок задавайте в последнем запросе пакета, который возвращает результат.
ВЫБРАТЬ
ВТ.Номенклатура,
ВТ.КоличествоОстаток
ИЗ
ВТ_Остатки КАК ВТ
УПОРЯДОЧИТЬ ПО
ВТ.КоличествоОстаток УБЫВ
ИНДЕКСИРОВАТЬ ПО — это не сортировка
Конструкция ИНДЕКСИРОВАТЬ ПО Номенклатура у временной таблицы ускоряет соединения и отборы по этому полю. Порядок строк при выборке она не задаёт. Путать эти две вещи — типичная причина «плавающей» сортировки в отчётах.
Сортировка в отчётах на СКД
В системе компоновки данных порядок задают в настройках, а не в тексте запроса набора данных. СКД сама собирает итоговый запрос, группирует данные и выводит их по своим правилам. Сортировка из запроса набора данных до вывода обычно не доживает.
В конфигураторе (для разработчика)
- Откройте схему компоновки данных.
- Перейдите на вкладку «Настройки».
- Выделите нужную группировку в структуре отчёта (или сам отчёт, если порядок общий).
- На нижней вкладке «Порядок» добавьте поля и задайте направление.
Порядок можно задать отдельно для каждой группировки. Например, контрагенты — по убыванию выручки, а номенклатура внутри контрагента — по алфавиту.
Поле «Авто» в порядке группировки означает «по полям самой группировки». Если вы добавили своё поле выше «Авто», оно станет главным.
В режиме пользователя
В большинстве типовых отчётов БП 3.0, ЗУП 3.1 и УТ 11 нажмите «Настройки» и найдите вкладку или раздел «Сортировка». Отметьте поле и направление, затем «Закрыть и сформировать».
Чтобы отсортировать отчёт по сумме, а не по названию, поле с суммой должно быть ресурсом или выводиться в отчёт. Иначе его нет в списке доступных полей.
Динамический список: сортировка программно
Если нужно задать порядок списка при открытии формы, используйте настройки компоновки динамического списка:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементПорядка = Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Дата");
ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
ЭлементПорядка.Использование = Истина;
КонецПроцедуры
Так новые документы окажутся сверху. Пользовательская сортировка, сохранённая ранее, может перекрыть этот порядок — при отладке проверьте на чистых настройках.
Сортировка коллекций в памяти: таблица значений, список значений
Когда данные уже получены и обработаны в коде, сортировать их повторным запросом не нужно.
Таблица значений — метод Сортировать() принимает строку с колонками и направлениями через запятую:
ТаблицаТоваров.Сортировать("Склад, Сумма Убыв");
Табличная часть объекта сортируется так же:
ДокументОбъект.Товары.Сортировать("Номенклатура");
Список значений — два метода:
СписокКодов.СортироватьПоЗначению(НаправлениеСортировки.Возр);
СписокКодов.СортироватьПоПредставлению(НаправлениеСортировки.Убыв);
Массив собственного метода сортировки не имеет. Практичный приём — загрузить значения в список значений, отсортировать и выгрузить обратно:
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(МассивЧисел);
Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);
МассивЧисел = Список.ВыгрузитьЗначения();
Если в колонке таблицы значений лежат ссылки, порядок по такой колонке может не совпасть с алфавитным. Нужна сортировка «как видит пользователь» — добавьте колонку с наименованием и сортируйте по ней.
Производительность сортировки и индексы
Сортировка в запросе выполняется на стороне СУБД. На маленьких таблицах она почти бесплатна. На больших — может стать самой дорогой частью запроса.
Что ускоряет
- 📇 Индекс по полю сортировки. У реквизита справочника или документа в конфигураторе есть свойство «Индексировать». Значение «Индексировать с доп. упорядочиванием» строит индекс, удобный для сортировки списков по этому реквизиту.
- ✂️
ПЕРВЫЕ N. Если пользователю нужны 20 последних документов, не выбирайте 200 000 и не сортируйте их в коде. - 🎯 Отбор до сортировки. Сначала сузьте выборку условием
ГДЕпо периоду или организации, потом сортируйте.
Что замедляет
- 🐢 Сортировка динамического списка по неиндексированному реквизиту на большой таблице. Каждое открытие формы — полная сортировка на сервере СУБД.
- 🔗 Сортировка по полям «через точку» (
Документ.Контрагент.ИНН) — каждое разыменование добавляет соединение. - 🧮 Сортировка по вычисляемому выражению (
ВЫБОР … КОГДА), по которому индекс использовать нельзя.
Индекс ускоряет чтение, но замедляет запись и раздувает базу. Ставьте его только на реквизиты, по которым реально сортируют и отбирают большие списки. После изменения свойства «Индексировать» нужно обновить конфигурацию базы данных — на этом шаге требуется монопольный доступ, поэтому делайте это вне рабочего времени.
Частые ошибки при сортировке и как их исправить
Ещё одна неочевидная деталь — коды справочников с префиксом. Код 00-000010 встанет выше 00-000009 правильно, только пока длина и формат кода одинаковы. После ручной правки кодов без ведущих нулей сортировка по коду ломается, и лечится это только приведением кодов к единому виду.