Сортировка по возрастанию в 1С: где и чем её включить
Содержание
Чтобы отсортировать по возрастанию в 1С, достаточно щёлкнуть по заголовку колонки в списке: стрелка у названия покажет направление. В отчёте то же делается в настройках на вкладке сортировки, в запросе — оператором УПОРЯДОЧИТЬ ПО ... ВОЗР, в коде — методом Сортировать() таблицы значений.
Способ зависит от того, где лежат данные. У списка сортировка живёт в форме и запоминается пользователем. У отчёта она хранится в настройках варианта. У запроса и кода — в самом тексте программы. Ниже все четыре случая с примерами и подводными камнями.
Сортировка в списках и формах: что нажать пользователю
Откройте любой список — номенклатуру, контрагентов, документы. Щёлкните по заголовку колонки один раз: строки выстроятся по возрастанию, у заголовка появится стрелка. Второй щелчок развернёт порядок на убывание.
Что полезно знать:
- 🔹 сортировка по колонке работает, только если колонка не помечена как несортируемая разработчиком; у части вычисляемых колонок щелчок ничего не даёт;
- 🔹 порядок запоминается для вашего пользователя и возвращается при следующем открытии списка;
- 🔹 по двум колонкам сразу обычным щелчком не отсортировать: щелчок заменяет предыдущий порядок.
Если нужна сортировка по нескольким полям (например, сначала по группе, затем по наименованию), откройте меню «Ещё» в командной панели списка и найдите команду настройки списка. Там есть раздел порядка: добавьте нужные поля и для каждого выберите направление «По возрастанию». Для динамических списков (а большинство справочников и журналов именно такие) это работает без доработки конфигурации.
Список документов по умолчанию идёт по дате. Если нужен порядок по номеру, помните: номер — строка, и «10» окажется раньше «2». Подробнее в разделе про типы данных.
Табличные части документов сортируются иначе. В обычной табличной части строки стоят в порядке ввода, а щелчок по заголовку у части конфигураций сортирует их только на время просмотра, не меняя данные. Если в форме есть кнопки «Подбор» и «Переместить вверх/вниз», это ручная расстановка строк, и она сохраняется в документе.
Порядок в отчётах и на СКД
Большинство отчётов в современных конфигурациях построены на системе компоновки данных (СКД). Сортировка там — часть настроек варианта отчёта.
Как включить у пользователя:
- Откройте отчёт и нажмите «Настройки» в командной панели.
- Перейдите на вкладку сортировки (в упрощённом режиме настроек её может не быть — переключитесь на расширенный).
- Добавьте поле, по которому надо упорядочить, и выберите направление «По возрастанию».
- Сформируйте отчёт заново.
Порядок полей в списке важен. Первое поле — главное, второе упорядочивает строки внутри равных значений первого. Это обычная многоуровневая сортировка, как в таблице Excel.
Если отчёт сгруппирован, сортировка применяется внутри каждой группировки. Хотите упорядочить сами группы, например контрагентов по алфавиту, а не договоры внутри них, — задайте порядок на уровне нужной группировки в структуре отчёта, а не только общий.
Разработчику, который собирает схему компоновки в конфигураторе, доступны те же настройки: порядок можно задать в варианте по умолчанию и в отдельных группировках. Обратите внимание на «Автоупорядочивание»: оно подставляет порядок по умолчанию для поля (для ссылки — по представлению). Если вам нужен строго определённый порядок, добавляйте поле явно.
Сохранённый вариант отчёта хранит свою сортировку. Если вы поменяли порядок, но не сохранили вариант, при следующем открытии вернётся прежний.
Оператор УПОРЯДОЧИТЬ ПО в языке запросов
В запросе сортировка пишется в самом конце текста, после ГДЕ, СГРУППИРОВАТЬ ПО и ИМЕЮЩИЕ:
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ЭтоГруппа
УПОРЯДОЧИТЬ ПО
Наименование ВОЗР,
Артикул ВОЗР
Слово ВОЗР можно не писать: направление по умолчанию именно возрастание. Но явная запись читается лучше, особенно рядом с УБЫВ в соседних полях.
Правила, которые чаще всего путают:
- ✅ в
УПОРЯДОЧИТЬ ПОможно указывать псевдонимы полей выборки и поля через точку (Контрагент.Наименование); - ✅ несколько полей перечисляются через запятую, у каждого свой
ВОЗРилиУБЫВ; - ✅ у объединения (
ОБЪЕДИНИТЬ) порядок задаётся один раз, в последнем запросе, и относится ко всему результату; - ✅ при запросе с итогами (
ИТОГИ ... ПО) используйтеАВТОУПОРЯДОЧИВАНИЕлибо явно перечисляйте поля — тогда дерево итогов отсортируется предсказуемо.
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
Продажи.Сумма КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
УПОРЯДОЧИТЬ ПО
Контрагент.Наименование,
Сумма ВОЗР
Здесь контрагенты идут по алфавиту их наименований, а внутри одного контрагента суммы растут. Если написать просто УПОРЯДОЧИТЬ ПО Контрагент, порядок по наименованию не гарантируется: ссылка — не строка. Указывайте реквизит явно.
Как сортируются числа, строки, даты и ссылки
Один и тот же «по возрастанию» ведёт себя по-разному в зависимости от типа поля.
| Тип | Как идёт порядок | Подвох |
|---|---|---|
| Число | от меньшего к большему, отрицательные раньше | нет |
| Строка | по символам слева направо | «10» раньше «2», «А-1» раньше «Б-1» |
| Дата | от ранней к поздней | пустая дата 01.01.0001 идёт первой |
| Булево | Ложь, затем Истина | в списке это колонка с флажками |
| Ссылка | зависит от того, по чему упорядочиваете | сортируйте по реквизиту, не по самой ссылке |
NULL / Неопределено | в запросах считаются меньше любого значения | попадают в начало |
Самая частая жалоба: номера документов «идут не по порядку». Номер в 1С — строка с ведущими нулями (00000010). Пока длина фиксирована, всё хорошо. Если же в нумерации есть префиксы разной длины или номер введён руками без нулей, строки ломают порядок. Лекарство — выравнивать длину номеров при вводе либо сортировать по дате и номеру вместе.
Со строками есть ещё один момент: регистр и буква «Ё». Регистр учитывается или нет в зависимости от СУБД и настроек базы, поэтому не закладывайте на него логику. Если нужен надёжный порядок, приводите строки к одному регистру в запросе функцией ВЕРХНИЙРЕГИСТР.
Пустые значения удобнее увести вниз. Прямого оператора для этого нет, но можно добавить в запрос вычисляемое поле-флаг и упорядочить сначала по нему:
ВЫБРАТЬ
Договоры.Наименование КАК Наименование,
Договоры.ДатаОкончания КАК ДатаОкончания,
ВЫБОР
КОГДА Договоры.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1)
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ КАК ПустаяДата
ИЗ
Справочник.ДоговорыКонтрагентов КАК Договоры
УПОРЯДОЧИТЬ ПО
ПустаяДата,
ДатаОкончания ВОЗР
Договоры без даты окончания окажутся в конце, а остальные выстроятся от ближайшего.
Программная сортировка в коде модулей
В коде чаще всего сортируют таблицу значений. У неё есть метод Сортировать(), который принимает строку с колонками и направлением:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Наименование");
Таблица.Колонки.Добавить("Сумма");
Строка = Таблица.Добавить();
Строка.Наименование = "Бета";
Строка.Сумма = 300;
Строка = Таблица.Добавить();
Строка.Наименование = "Альфа";
Строка.Сумма = 500;
Строка = Таблица.Добавить();
Строка.Наименование = "Альфа";
Строка.Сумма = 100;
Таблица.Сортировать("Наименование ВОЗР, Сумма ВОЗР");
После вызова порядок строк такой: Альфа 100, Альфа 500, Бета 300. Сортировка меняет саму таблицу, а не создаёт копию, поэтому если исходный порядок ещё нужен, сначала сделайте Таблица.Скопировать().
Для списка значений есть СортироватьПоЗначению() и СортироватьПоПредставлению():
Список = Новый СписокЗначений;
Список.Добавить("Яблоко");
Список.Добавить("Арбуз");
Список.Добавить("Груша");
Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);
Результат: Арбуз, Груша, Яблоко. Для простого массива такого метода нет — выгрузите значения в список или таблицу, отсортируйте и верните обратно через ВыгрузитьЗначения():
Массив = Список.ВыгрузитьЗначения();
Если в таблице разнотипные значения в одной колонке, порядок определяется типами, и результат читается плохо. Поддерживайте в колонке один тип, при необходимости задайте его в Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число")).
Сортировать в коде то, что можно упорядочить в запросе, обычно не стоит: база сделает это быстрее, особенно если есть подходящий индекс.
Свой порядок, который не совпадает с алфавитом
Иногда «по возрастанию» нужно не по значению, а по смыслу: сначала «Срочно», затем «Обычно», затем «Низкий». Алфавит тут не поможет, а числового кода у значений нет. В запросе порядок задаёт вычисляемое поле:
ВЫБРАТЬ
Задачи.Наименование КАК Наименование,
Задачи.Важность КАК Важность,
ВЫБОР
КОГДА Задачи.Важность = "Срочно" ТОГДА 1
КОГДА Задачи.Важность = "Обычно" ТОГДА 2
ИНАЧЕ 3
КОНЕЦ КАК Порядок
ИЗ
Справочник.Задачи КАК Задачи
УПОРЯДОЧИТЬ ПО
Порядок ВОЗР,
Наименование ВОЗР
Если значения — элементы перечисления, их порядок задан в конфигураторе и совпадает с порядком в списке значений перечисления. Поле типа перечисления в запросе сортируется именно по этому порядку, а не по названиям. Поэтому для статусов удобнее завести перечисление, чем хранить текст.
В таблице значений тот же приём решается дополнительной колонкой: заполните её числом по правилу и отсортируйте по ней, а затем при необходимости удалите колонку методом Колонки.Удалить().
Если порядок всё равно не тот
Разберите причину по симптому, не меняя настроек наугад.
- 🔸 Строки идут «в перемешку» внутри одной группы. Не указан второй уровень сортировки. Добавьте вторым полем наименование или дату: при равных значениях первого поля СУБД вправе вернуть строки в любом порядке, и порядок может меняться от запуска к запуску.
- 🔸 В отчёте сортировка есть, а в выводе её нет. Сортировка относится к другой группировке, чем та, что видна на экране. Откройте структуру отчёта и проверьте порядок на нужном уровне.
- 🔸 В списке стрелка стоит, а порядок странный. Колонка показывает представление, а упорядочивается по другому полю (например, по ссылке или по коду). Откройте настройку списка и выберите для сортировки видимый реквизит.
- 🔸 Числа в колонке идут как текст. Тип поля — строка. Для пользователя обходной путь — отбор и сортировка по другой колонке, для разработчика — смена типа реквизита с миграцией данных.
- 🔸 Запрос с
ПЕРВЫЕотдаёт не те строки. БезУПОРЯДОЧИТЬ ПО«первые» — это просто первые попавшиеся. Порядок нужен всегда, если важно, какие именно строки вернутся.
УПОРЯДОЧИТЬ ПО в конце текста, у каждого поля ВОЗР или УБЫВ.Сортировать("Колонка ВОЗР"), для списка значений СортироватьПоЗначению.Скорость: когда сортировка тормозит
Небольшой список сортируется мгновенно. На сотнях тысяч строк картина другая.
Что помогает:
- 🔹 упорядочивайте по полям, по которым в базе есть индекс (у справочников это код и наименование, у регистров — измерения); тогда СУБД читает данные уже в нужном порядке;
- 🔹 не сортируйте по реквизитам через длинную цепочку точек: каждое обращение через точку — дополнительное соединение таблиц;
- 🔹 ограничивайте выборку:
ВЫБРАТЬ ПЕРВЫЕ 100вместе сУПОРЯДОЧИТЬ ПОзабирает только нужную верхушку, а не весь набор; - 🔹 для отчётов отбирайте данные условием до сортировки, а не после;
- 🔹 не сортируйте на клиенте то, что пришло с сервера; передавайте уже готовый порядок.
Если сортировка по нужной колонке в динамическом списке подвисает, проверьте, не вычисляется ли колонка выражением. Сортировка по вычисляемому выражению идёт без индекса, поэтому при необходимости перенесите сортировку на реальный реквизит.
Менять свойства динамических списков и индексацию — задача разработчика. Пользователю достаточно знать: если сортировка по какой-то колонке очень медленная, лучше сузить период или отбор.
Частые вопросы
Как отсортировать в 1С по убыванию?
УБЫВ, в коде — Убыв.Почему «10» идёт раньше «2»?
Можно ли сохранить сортировку списка для всех пользователей?
Почему после обновления отчёта сортировка слетела?
Как отсортировать массив?
СортироватьПоЗначению(НаправлениеСортировки.Возр) и выгрузите обратно методом ВыгрузитьЗначения().