Упорядочивание по дате в 1С: от щелчка по колонке до запроса

· 9 мин

Содержание

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

Ниже все четыре случая по очереди, с рабочими примерами. Отдельно разобраны составные типы, периоды и скорость на больших объёмах, потому что именно там сортировка по дате ломается чаще всего.

Какой способ выбрать

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

Если данные можно упорядочить на стороне запроса, делайте это там. Сервер СУБД справляется быстрее, чем перебор в 1С.

Сортировка в списках в пользовательском режиме

Откройте любой журнал, например «Реализация (акты, накладные)». Щёлкните по заголовку колонки «Дата». Появится стрелка: вверх — от старых к новым, вниз — от новых к старым. Повторный щелчок меняет направление.

По умолчанию список документов открывается в порядке даты и номера. Это штатное поведение, его не нужно настраивать.

Если нужно сохранить нестандартный порядок:

  1. Откройте меню «Ещё» в командной панели списка.
  2. Выберите «Настроить список…».
  3. Перейдите на вкладку с порядком и добавьте поле «Дата» с нужным направлением.
  4. Нажмите «Завершить редактирование».

Настройка сохраняется для вашего пользователя. У коллег порядок останется прежним.

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

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

Порядок в конструкторе запросов и СКД

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

В конструкторе откройте вкладку «Порядок». Перенесите поле с датой в правую часть и выберите направление. В тексте запроса появится строка УПОРЯДОЧИТЬ ПО с этим полем.

Если есть итоги, добавляется ИТОГИ ... ПО, а сортировка применяется к уровням внутри каждой группы. Порядок в итогах описывают отдельно, через УПОРЯДОЧИТЬ ПО после блока ИТОГИ, иначе группы выстроятся не так, как вы рассчитывали.

Схема компоновки данных

Для отчёта на СКД порядок задаётся в двух местах:

  • в схеме, на вкладке «Настройки» — это значение по умолчанию;
  • в пользовательских настройках отчёта — пользователь может переопределить.

Порядок настройки в конструкторе схемы:

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

Порядок на корне и порядок внутри группировки — разные вещи. Если в группировке «Контрагент» вы задали сортировку по дате на корне, строки внутри контрагента всё равно будут идти в порядке группировки.

Если в отчёте включена группировка по периоду, поле «Период» упорядочивается как значение даты, а не как строка. Но когда период выводят в виде текста «Январь 2026», сортировка пойдёт по алфавиту. Всегда упорядочивайте по самому полю даты, а не по его текстовому представлению.

Сортировка в коде через объект Запрос

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

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |    Реализация.Ссылка КАК Ссылка,
    |    Реализация.Дата КАК Дата,
    |    Реализация.Номер КАК Номер
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК Реализация
    |ГДЕ
    |    Реализация.Дата МЕЖДУ &Начало И &Конец
    |    И Реализация.Проведен
    |
    |УПОРЯДОЧИТЬ ПО
    |    Реализация.Дата УБЫВ,
    |    Реализация.Ссылка УБЫВ";
Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДата()));

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Формат(Выборка.Дата, "ДЛФ=DT") + " " + Выборка.Номер);
КонецЦикла;

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

Ещё два приёма, которые часто нужны:

  • АВТОУПОРЯДОЧИВАНИЕ — система сама упорядочит результат по полям ссылочных типов с учётом основного представления (для документа — дата и номер). Полезно, когда нужен «естественный» порядок без ручного перечисления.
  • ПЕРВЫЕ 100 вместе с УПОРЯДОЧИТЬ ПО Дата УБЫВ даёт сто последних записей. Без сортировки ПЕРВЫЕ вернёт произвольные сто.

Если нужно упорядочить по месяцу, а не по точному моменту, используйте функцию НАЧАЛОПЕРИОДА:

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

Выборка по периоду и порядок вывода в макете

Частая задача: вывести в печатную форму или отчёт документы за период в хронологическом порядке. Параметры периода передают в запрос, а порядок задают в самом запросе, не полагаясь на то, что «обычно они и так идут по дате».

Три правила, которые избавляют от сюрпризов:

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

Порядок по нескольким полям

Дата редко бывает единственным ключом. Типовые сочетания:

ЗадачаПорядок
Журнал: свежие сверху, внутри дня по номеруДата УБЫВ, Номер УБЫВ
Отчёт по контрагентам с хронологией внутриГруппировка по контрагенту, порядок Дата
Последняя запись по каждому объектуСортировка Период УБЫВ, затем отбор первой записи на объект
Стабильная выгрузка в файлДата, затем Ссылка

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

Сортировка таблицы значений

Когда данные уже в памяти:

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

Колонка «Дата» должна быть типа Дата. Если в неё попала строка вида «15.03.2026», сортировка пойдёт по символам и «02.04.2026» окажется раньше «15.03.2026» только случайно. Для текстового ключа, который должен упорядочиваться как дата, используйте формат «год-месяц-день»: Формат(Дата, "ДФ=yyyyMMdd"). Строки такого вида сортируются в хронологическом порядке.

Динамический список на форме

Если список на управляемой форме построен на динамическом списке, порядок по умолчанию задаёт разработчик в свойстве «Порядок» самого списка. Пользователь переопределяет его щелчком по колонке. Из кода порядок меняют через свойство Порядок динамического списка:

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

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

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

Составные типы, пустые даты и периоды

Поле составного типа

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

Решение — привести поле к одному типу прямо в запросе:

ВЫБРАТЬ
    ВЫРАЗИТЬ(Таблица.Значение КАК Дата) КАК ДатаЗначения
ИЗ
    ...
УПОРЯДОЧИТЬ ПО
    ДатаЗначения

Значения, которые к дате не приводятся, станут NULL. Они упорядочатся как наименьшие и окажутся в начале при сортировке по возрастанию.

Пустая дата

Пустая дата в 1С — это 01.01.0001 00:00:00. Она меньше любой реальной. Поэтому при сортировке по убыванию пустые уходят в конец, а по возрастанию — в начало, и именно в начале списка появляются «странные» строки с пустым значением.

Чтобы убрать их в конец при возрастающем порядке, добавьте признак в запрос:

ВЫБРАТЬ
    ВЫБОР КОГДА Таблица.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1) ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК Пустая,
    Таблица.ДатаОплаты КАК ДатаОплаты
ИЗ
    ...
УПОРЯДОЧИТЬ ПО
    Пустая,
    ДатаОплаты

Периоды и регистры сведений

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

Скорость сортировки при больших объёмах

На таблицах в сотни тысяч строк порядок по дате может заметно тормозить. Что проверить:

  • ✅ Индексация. Документы по дате индексируются штатно, а вот реквизит документа типа Дата, добавленный разработчиком, по умолчанию не индексируется. Для него в свойствах реквизита включают индексирование. Такое изменение делает разработчик конфигурации.
  • ✅ Отбор до сортировки. Ограничьте период в ГДЕ. Упорядочивать за три года, когда нужен последний месяц, расточительно.
  • ✅ Ограничение количества. ПЕРВЫЕ N вместе с сортировкой по индексированному полю читает ровно столько записей, сколько нужно.
  • ✅ Вычисления в сортировке. Сортировка по выражению (НАЧАЛОПЕРИОДА(...), ВЫБОР) не использует индекс по исходному полю. Если можно, сортируйте по самому полю.
  • ✅ Временные таблицы. Если результат нужен несколько раз в одном запросе, поместите его во временную таблицу и добавьте ИНДЕКСИРОВАТЬ ПО Дата.

Для файловой базы с тяжёлым отчётом разницу чувствует каждый пользователь, а в клиент-серверной с MS SQL или PostgreSQL проблема чаще в отсутствии подходящего индекса. Замеряйте время запроса в консоли запросов до и после правки, а не «на глаз».

Типичные ошибки и как их исправить

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

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

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