Сортировка данных в 1С 8.3: от кнопки в списке до запроса
Содержание
Отсортировать данные в 1С 8.3 можно четырьмя разными способами, и выбор зависит от того, где вы находитесь: в обычном списке документов, в конструкторе запросов, в коде обработки или в настройках отчёта. В списке достаточно кликнуть по заголовку колонки, в запросе работает конструкция УПОРЯДОЧИТЬ ПО, а в коде — метод Сортировать().
Ниже разберём каждый способ настроить сортировку с точными путями и рабочими примерами кода, а в конце — ошибки, из-за которых строки раз за разом выстраиваются «не так».
УПОРЯДОЧИТЬ ПО — сортировку выполнит сервер СУБД.Сортировать(), а для списка значений — СортироватьПоЗначению().Быстрая сортировка в списках и формах
Самый простой путь — работа мышью прямо в форме списка, он одинаков в Бухгалтерии, ЗУП и Управлении торговлей.
- Наведите курсор на заголовок нужной колонки (например, «Дата» или «Контрагент»).
- Щёлкните по заголовку один раз — строки выстроятся по возрастанию, рядом появится маленькая стрелка ▲.
- Щёлкните ещё раз — порядок сменится на убывание, стрелка повернётся вниз ▼.
Если нужно упорядочить сразу по нескольким колонкам, щёлкните по заголовку правой кнопкой мыши — в контекстном меню будут команды сортировки по возрастанию и по убыванию для этой колонки, их можно применять к нескольким полям подряд.
Для более тонкой настройки откройте меню Еще в командной панели списка и выберите пункт настройки списка. На вкладке с сортировкой слева перечислены доступные поля, справа — те, по которым идёт упорядочивание; для каждого задаётся направление. Эта настройка сохраняется персонально для текущего пользователя и восстановится при следующем открытии формы.
Если колонки нет в списке, её сначала нужно вывести через ту же настройку списка (вкладка с колонками), и только потом она станет доступна для сортировки.
Упорядочивание в конструкторе запросов
Когда данные выбираются запросом, порядок строк задаётся секцией УПОРЯДОЧИТЬ ПО. Без неё СУБД возвращает строки в произвольном порядке — полагаться на «как получилось» нельзя.
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
Номенклатура.Код КАК Код
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование ВОЗР
Ключевые слова направления — ВОЗР (по возрастанию, значение по умолчанию) и УБЫВ (по убыванию). Поля перечисляются через запятую, сортировка применяется последовательно:
УПОРЯДОЧИТЬ ПО
Склад.Наименование ВОЗР,
Регистратор.Дата УБЫВ
Отдельная тонкость — упорядочивание по полю-ссылке. Если написать УПОРЯДОЧИТЬ ПО Товар, строки выстроятся по внутренней ссылке объекта, а не по его названию. Чтобы отсортировать по наименованию, упорядочивайте по конкретному реквизиту (Товар.Наименование) либо добавьте в конец запроса слово АВТОУПОРЯДОЧИВАНИЕ — оно само подставит сортировку по представлению ссылки и учтёт иерархию справочника.
ВЫБРАТЬ
Остатки.Товар КАК Товар,
Остатки.КоличествоОстаток КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
УПОРЯДОЧИТЬ ПО
Товар
АВТОУПОРЯДОЧИВАНИЕ
Если нужны только верхние строки отсортированного набора — например, десять самых крупных сумм, — сочетайте сортировку с ПЕРВЫЕ:
ВЫБРАТЬ ПЕРВЫЕ 10
Продажи.Контрагент КАК Контрагент,
СУММА(Продажи.Сумма) КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
Продажи.Контрагент
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
При сортировке по возрастанию пустые значения (NULL и незаполненные ссылки) оказываются в начале списка, при сортировке по убыванию — в конце. Это стоит учитывать, когда часть строк не заполнена: пустые даты или не указанные контрагенты «всплывут» наверх и могут выглядеть как ошибка выборки.
Нельзя упорядочивать по полям типа «ХранилищеЗначения», а также по неограниченным строкам (строка без указания длины). Такой запрос завершится ошибкой выполнения — для сортировки выбирайте поля ограниченной длины.
Сортировка на встроенном языке 1С
Когда данные уже собраны в коллекцию в памяти, сортировать их можно встроенными методами. Для таблицы значений это метод Сортировать(), которому передаётся строка с полями и направлением:
ТоварыТЗ.Сортировать("Цена Убыв, Наименование Возр");
Поля перечисляются через запятую, после имени поля указывается Возр или Убыв. Регистр слова направления значения не имеет.
Для списка значений есть два отдельных метода — по значению и по тому, как значения отображаются:
Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Список.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
Дерево значений сортируется по строкам, причём второй параметр включает рекурсию по вложенным уровням:
Дерево.Строки.Сортировать("Наименование Возр", Истина);
Отдельно стоит сказать про массив и соответствие. У массива собственного метода сортировки нет — перенесите его значения в список значений или в таблицу значений и сортируйте уже их. Соответствие сортировать тоже нельзя напрямую: соберите ключи в массив, упорядочьте список значений, а затем обходите соответствие в нужном порядке.
Если логика сравнения нестандартная (например, сортировка по длине строки), штатные методы не подойдут — такую задачу проще решить запросом с вычисляемым полем или собрать результат в таблицу значений с дополнительной колонкой-ключом и отсортировать по ней.
Сортировка строк в табличной части документа
Отдельный случай — строки табличной части открытого документа (товары в накладной, начисления в расчётном листке). Здесь порядок строк хранится вместе с документом, поэтому у сортировки две стороны: ручная в форме и программная в коде.
В форме строки двигают вручную. Выделите строку в табличной части и воспользуйтесь кнопками перемещения вверх и вниз в командной панели самой таблицы — так строка встаёт на нужное место. Если в командной панели есть команда сортировки табличной части, она упорядочит строки по выделенной колонке.
Порядок строк в проведённом документе может влиять на последовательность движений по регистрам (например, при списании по партиям). Меняйте порядок строк осознанно и перепроводите документ после правки.
Программно табличная часть сортируется тем же методом, что и таблица значений:
Документ.Товары.Сортировать("Номенклатура Возр");
Если нужно переставить одну строку, используйте метод сдвига:
Строка = Документ.Товары[2];
Документ.Товары.Сдвинуть(Строка, -1); // на одну позицию вверх
После программной сортировки или сдвига строк объект нужно записать, иначе изменения останутся только в памяти.
Настройка сортировки в отчётах на СКД
В отчётах на системе компоновки данных порядок строк задаётся не в коде, а в настройках варианта. Откройте настройки отчёта (в режиме разработки — через конструктор схемы компоновки, в пользовательском режиме — через расширенную настройку) и перейдите на вкладку «Сортировка».
- Нажмите добавление поля и выберите поле, по которому нужно упорядочить результат.
- Задайте направление — по возрастанию или по убыванию.
- При необходимости добавьте второе и третье поле: они применяются сверху вниз по списку.
Сортировку в СКД можно задавать отдельно для каждой группировки — тогда внутри группы строки упорядочиваются независимо от строк верхнего уровня. Сортировать разрешено не только по полям группировки, но и по ресурсам: например, выстроить контрагентов по убыванию суммы продаж, хотя группировка идёт по самому контрагенту.
Если в быстрых настройках отчёта вывести элемент сортировки, конечный пользователь сможет менять порядок сам, не заходя в конструктор. А при иерархической группировке (например, по номенклатуре с группами) сортировка применяется внутри каждого уровня иерархии — группы и элементы внутри них упорядочиваются отдельно.
Для внешних обработок, которые строят собственную таблицу значений и выводят её в таблицу формы, работает тот же метод Сортировать() из предыдущего раздела — порядок задаётся в коде до вывода данных на форму.
Что учесть в динамических списках типовых конфигураций
Формы списков документов и справочников в БП 3.0, ЗУП 3.1 и УТ 11 построены на динамических списках, и правила сортировки для них общие.
- Сортировка по колонке и настройка через меню
Ещеработают одинаково во всех типовых — путь не отличается. - Порядок, заданный пользователем, хранится отдельно для каждого сотрудника, поэтому у разных пользователей один и тот же список может выглядеть по-разному.
- По вычисляемым полям и полям из связанных таблиц сортировка в динамическом списке доступна не всегда — если поле получается сложным соединением, платформа может его заблокировать для упорядочивания.
Если динамический список использует произвольный запрос (флажок произвольного запроса в свойствах списка), управлять порядком можно и через секцию УПОРЯДОЧИТЬ ПО в тексте этого запроса — но пользовательская сортировка по колонкам всё равно останется приоритетной для отображения.
Как сортировать быстро: производительность
На больших объёмах способ сортировки заметно влияет на скорость. Несколько практических правил:
- Сортируйте в запросе, а не в памяти. Конструкция
УПОРЯДОЧИТЬ ПОвыполняется на сервере СУБД, который делает это эффективно. Выгружать весь результат в таблицу значений и сортировать её методомСортировать()дороже. - Упорядочивайте по индексированным полям. Сортировка по полю, для которого есть индекс, выполняется без дополнительной операции упорядочивания в СУБД.
- Во временных таблицах используйте
ИНДЕКСИРОВАТЬ ПО. Если потом по этому полю идёт соединение или сортировка, индекс ускорит оба действия. - Ограничивайте выборку. Если нужны только первые строки, добавьте
ПЕРВЫЕ N— СУБД не будет сортировать весь массив целиком. - Помните про поля-ссылки. Упорядочивание по представлению ссылки (через
АВТОУПОРЯДОЧИВАНИЕ) добавляет соединение с таблицей объекта для получения наименования. По примитивному полю (число, дата, строка) сортировка дешевле.
Типичные ошибки при сортировке и как их избежать
УПОРЯДОЧИТЬ ПО. Без неё СУБД возвращает строки как ей удобно. Добавьте явную сортировку по нужному полю.Возр/Убыв) должны точно совпадать с существующими.Наименование или добавьте АВТОУПОРЯДОЧИВАНИЕ.Ещё один частый источник путаницы — учёт регистра при сортировке строк. Будут ли «А» и «а» стоять рядом, зависит от настроек языка и СУБД базы, а не от текста запроса. Если порядок строк с разным регистром критичен, приводите значение к одному регистру (ВРег() или НРег()) в вычисляемом поле и сортируйте уже по нему.
Частые вопросы
Как задать сортировку сразу по нескольким полям?
УПОРЯДОЧИТЬ ПО — они применяются слева направо. В методе Сортировать() таблицы значений поля тоже пишутся через запятую: "Дата Убыв, Сумма Возр". В списке или отчёте добавьте несколько строк на вкладке сортировки.Запоминается ли сортировка списка для пользователя?
Можно ли отсортировать по полю, которого нет в выбранных данных?
УПОРЯДОЧИТЬ ПО можно указать поле таблицы-источника, даже если его нет в ВЫБРАТЬ. А вот метод Сортировать() работает только по колонкам, которые реально есть в таблице значений.Чем `ВОЗР` отличается от `АВТОУПОРЯДОЧИВАНИЕ`?
ВОЗР и УБЫВ задают направление для конкретного поля. АВТОУПОРЯДОЧИВАНИЕ — отдельное слово в конце запроса: оно само добавляет упорядочивание по представлению полей-ссылок и выстраивает иерархические справочники по уровням.Почему сортировка таблицы значений в коде работает медленно?
Сортировать() выполняется в памяти приложения. На больших объёмах перенесите упорядочивание в запрос: УПОРЯДОЧИТЬ ПО отрабатывает на сервере СУБД и обычно заметно быстрее.