Как отсортировать данные по нужному полю в 1С 8.3

· 9 мин

Содержание

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

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

Всё написано для платформы 8.3 с интерфейсом «Такси». Принципы одинаковы в Бухгалтерии, ЗУП, УТ и других конфигурациях.

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

Это самый быстрый способ для пользователя. Откройте любой список — номенклатуру, контрагентов, журнал документов — и наведите курсор на заголовок колонки. Щелчок включает сортировку по возрастанию, второй щелчок по той же колонке — по убыванию. Рядом с названием появляется стрелка, она показывает активное направление.

Что полезно знать:

  • 🔹 Сортировка работает по той колонке, которая выведена на экран. Нужного поля нет — добавьте его в список через настройку отображения колонок в меню «Ещё» командной панели.
  • 🔹 Сортировать можно не по всем колонкам. Если щелчок по заголовку ничего не меняет, поле недоступно для упорядочивания (так бывает с вычисляемыми колонками).
  • 🔹 Сортировка запоминается для пользователя. При следующем открытии списка порядок может остаться прежним, и это путает: «куда делись новые документы?» Они просто внизу, потому что порядок задан по другому полю.

Список документов по умолчанию идёт по дате. Если нужно снова увидеть свежие записи сверху, щёлкните по колонке «Дата» и при необходимости щёлкните ещё раз, чтобы стрелка смотрела вниз.

Несколько условий сразу

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

Порядок строк в отчёте

Отчёты на основе системы компоновки данных (а их большинство) собирают порядок строк из настроек варианта. Откройте отчёт, нажмите «Показать настройки» (или «Настройки» в командной панели) и перейдите на вкладку «Сортировка». Порядок такой:

  1. Нажмите «Добавить» и выберите поле, например «Номенклатура» или «Сумма».
  2. Выберите направление: по возрастанию или по убыванию.
  3. Если полей несколько, расставьте их стрелками вверх и вниз: порядок в списке — это приоритет сортировки.
  4. Нажмите «Сформировать».

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

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

Свой отчёт в конструкторе

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

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

Упорядочивание в запросе

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

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

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

  • 🔸 ВОЗР (по умолчанию) — от меньшего к большему, УБЫВ — наоборот. Направление задаётся для каждого поля отдельно.
  • 🔸 Поля перечисляются через запятую, первое имеет наивысший приоритет.
  • 🔸 Сортировать можно по псевдониму поля из ВЫБРАТЬ, например УПОРЯДОЧИТЬ ПО Наименование.
  • 🔸 В запросе с объединением ОБЪЕДИНИТЬ оператор ставится один раз — в конце всего запроса, и в нём используют имена полей первой части.
  • 🔸 При использовании РАЗЛИЧНЫЕ и группировки сортировать можно только по полям, которые остались в результате.

Конструктор запроса

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

Сортировка в запросе нагружает сервер. Если вы упорядочиваете большую выборку, а потом всё равно берёте первые 10 записей, используйте ПЕРВЫЕ 10: тогда лишнее не придётся сортировать и тащить на клиент.

Даты, время и числа в строках

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

Даты. Если поле имеет тип «Дата», порядок хронологический: учитывается и время. Две записи за один день с разным временем упорядочатся правильно. Если же дату хранят в строке (например, в реквизите «01.02.2026» текстом), сортировка пойдёт посимвольно: «01.03.2025» окажется раньше «02.01.2026», хотя по календарю наоборот. Решение — перевести значение в дату или хранить дату с типом «Дата» с составом «Дата».

Числа в строках. Код справочника часто строковый. Тогда «10» встанет перед «2»: сравнивается первый символ, «1» меньше «2». Поэтому в типовых справочниках коды строят с ведущими нулями («000000002»). Если вы сортируете сами такие значения, приведите их к числу — и порядок станет арифметическим.

Пустые значения. Пустая дата (01.01.0001) и пустая ссылка при возрастании идут в самое начало. Если нужно вывести их в конец, добавьте условие в запрос: поле-признак ВЫБОР КОГДА Дата = ДАТАВРЕМЯ(1,1,1) ТОГДА 1 ИНАЧЕ 0 КОНЕЦ и сортируйте сначала по нему.

Регистр букв. В запросе сравнение строк обычно не различает регистр, и «апельсин» не окажется после «Яблока» только из-за строчной буквы. А вот в коде для таблицы значений сравнение задаётся отдельным объектом (о нём ниже).

Нужна сортировка по месяцу без учёта дня? Выберите в запросе НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) и упорядочивайте по этому полю.

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

У справочника с иерархией элементы лежат в группах. Обычная сортировка по наименованию «размажет» дерево: подчинённые строки смешаются с родителями. В запросе для этого есть слово ИЕРАРХИЯ:

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

Теперь порядок сохраняет дерево: сначала группа, под ней её элементы и подгруппы, упорядоченные внутри каждого уровня. Без слова ИЕРАРХИЯ вы получите плоский список по алфавиту.

В отчётах эту роль играет группировка с типом «Иерархия» (или «Иерархия только групп»): в настройках группировки выберите нужный тип, а на вкладке «Сортировка» оставьте поле, по которому упорядочиваются строки внутри групп.

В динамическом списке справочника в пользовательском режиме при включённом дереве групп порядок задан самим справочником: группы идут выше элементов. Если вам нужно, чтобы элементы выстроились в общий список, переключите режим просмотра на обычный список (в меню «Ещё» есть команда, меняющая вид дерева) и затем щёлкните по заголовку.

Без слова ИЕРАРХИЯ не ждите порядка «группа — потомки». Ссылка на родителя для запроса — просто ещё одно поле.

Программная сортировка коллекций значений

В модуле чаще всего сортируют таблицу значений. У неё есть метод Сортировать(): первым параметром — строка с колонками и направлением.

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Контрагент");
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

Строка = ТЗ.Добавить();
Строка.Контрагент = "Ромашка";
Строка.Сумма = 1500;

Строка = ТЗ.Добавить();
Строка.Контрагент = "Альфа";
Строка.Сумма = 3200;

ТЗ.Сортировать("Сумма Убыв, Контрагент");

После вызова первой строкой будет «Альфа» (3200), затем «Ромашка» (1500). Направление пишется после имени колонки через пробел: Убыв или Возр, по умолчанию — возрастание. Колонки перечисляются через запятую, как и в запросе.

Для строк можно передать вторым параметром объект сравнения значений, если нужен особый порядок. Без него используется стандартный.

Список значений и массив

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

Список = Новый СписокЗначений;
Список.Добавить("Яблоки");
Список.Добавить("Груши");
Список.СортироватьПоЗначению(НаправлениеСортировки.Возрастание);

У массива метода сортировки нет. Если нужно упорядочить его элементы, загрузите их в таблицу значений или список, отсортируйте и выгрузите обратно. Для таблицы значений есть метод ВыгрузитьКолонку(), он вернёт массив в новом порядке.

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

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

Свой порядок: не по алфавиту и не по сумме

Иногда нужен порядок, которого нет ни в одном поле. Например, статусы заказов должны идти так: «В работе», «Ожидает оплаты», «Закрыт». По алфавиту получится другое. В запросе это решается вспомогательным полем с весом:

ВЫБРАТЬ
    Заказы.Ссылка КАК Ссылка,
    Заказы.Статус КАК Статус,
    ВЫБОР
        КОГДА Заказы.Статус = "В работе" ТОГДА 1
        КОГДА Заказы.Статус = "Ожидает оплаты" ТОГДА 2
        ИНАЧЕ 3
    КОНЕЦ КАК Вес
ИЗ
    Документ.ЗаказПокупателя КАК Заказы
УПОРЯДОЧИТЬ ПО
    Вес,
    Заказы.Дата УБЫВ

Здесь Статус взят строкой для наглядности; в реальной базе это чаще перечисление, и сравнивать нужно со значением перечисления через ЗНАЧЕНИЕ(Перечисление.…). Вес можно не выводить в итоговую таблицу, если запрос обернуть в выборку из вложенного запроса.

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

Ошибки, из-за которых порядок «ломается»

Четыре ситуации встречаются чаще остальных.

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

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

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

Почему сортировка по колонке не работает?
Скорее всего, колонка вычисляемая или не связана с полем, по которому сервер умеет упорядочивать. Выведите в список реквизит, который хранится в базе, и щёлкните по его заголовку.
Как вернуть исходный порядок в списке?
Щёлкните по заголовку колонки, по которой список упорядочен изначально (для документов — «Дата»), и выберите нужное направление. Если порядок сохранился из прошлого сеанса, сбросьте настройки списка командой в меню «Ещё».
Как сортировать по двум полям одновременно?
В отчёте добавьте два поля на вкладке «Сортировка», в запросе перечислите их через запятую после УПОРЯДОЧИТЬ ПО, в таблице значений укажите обе колонки в строке параметра Сортировать().
Почему «10» идёт раньше «2»?
Значение хранится как строка и сравнивается посимвольно. Приведите его к числу или добавьте ведущие нули.
Можно ли отсортировать массив?
Напрямую нельзя. Загрузите его в список значений или таблицу, отсортируйте и выгрузите обратно.