Упорядочивание по дате в 1С: от щелчка по колонке до запроса
Содержание
Сортировку по дате в 1С делают по-разному, и выбор зависит от того, где она нужна. В списке документов хватит щелчка по заголовку колонки. В отчёте порядок задают в настройках СКД. В коде — оператором УПОРЯДОЧИТЬ ПО в запросе или методом Сортировать у таблицы значений.
Ниже все четыре случая по очереди, с рабочими примерами. Отдельно разобраны составные типы, периоды и скорость на больших объёмах, потому что именно там сортировка по дате ломается чаще всего.
Какой способ выбрать
| Где нужна сортировка | Способ | Что понадобится |
|---|---|---|
| Список документов или справочника | Щелчок по колонке, настройка списка | Работа в обычном режиме |
| Отчёт на СКД | Вкладка «Порядок» в настройках | Права на изменение настроек отчёта |
| Выборка из базы в коде | УПОРЯДОЧИТЬ ПО в запросе | Доступ к модулю или консоли запросов |
| Данные уже в памяти | Сортировать у таблицы значений | Колонка типа Дата |
Если данные можно упорядочить на стороне запроса, делайте это там. Сервер СУБД справляется быстрее, чем перебор в 1С.
Сортировка в списках в пользовательском режиме
Откройте любой журнал, например «Реализация (акты, накладные)». Щёлкните по заголовку колонки «Дата». Появится стрелка: вверх — от старых к новым, вниз — от новых к старым. Повторный щелчок меняет направление.
По умолчанию список документов открывается в порядке даты и номера. Это штатное поведение, его не нужно настраивать.
Если нужно сохранить нестандартный порядок:
- Откройте меню «Ещё» в командной панели списка.
- Выберите «Настроить список…».
- Перейдите на вкладку с порядком и добавьте поле «Дата» с нужным направлением.
- Нажмите «Завершить редактирование».
Настройка сохраняется для вашего пользователя. У коллег порядок останется прежним.
Сортируется только та колонка, которая выведена в список и для которой разработчик разрешил упорядочивание. Если щелчок по заголовку ничего не меняет, поле, скорее всего, вычисляемое или составного типа.
Частая путаница: документы выстроены «неправильно», хотя дата верная. Причина в том, что сортировка идёт по полной дате со временем. Два документа за один день различаются по времени. Если время одинаковое, порядок решает номер или ссылка. Чтобы поставить документ раньше другого в тот же день, меняют время в документе, а не саму дату.
Порядок в конструкторе запросов и СКД
Конструктор запроса
В конструкторе откройте вкладку «Порядок». Перенесите поле с датой в правую часть и выберите направление. В тексте запроса появится строка УПОРЯДОЧИТЬ ПО с этим полем.
Если есть итоги, добавляется ИТОГИ ... ПО, а сортировка применяется к уровням внутри каждой группы. Порядок в итогах описывают отдельно, через УПОРЯДОЧИТЬ ПО после блока ИТОГИ, иначе группы выстроятся не так, как вы рассчитывали.
Схема компоновки данных
Для отчёта на СКД порядок задаётся в двух местах:
- в схеме, на вкладке «Настройки» — это значение по умолчанию;
- в пользовательских настройках отчёта — пользователь может переопределить.
Порядок настройки в конструкторе схемы:
- Откройте нужный вариант отчёта на вкладке «Настройки».
- Выберите раздел «Порядок» на корневом уровне или внутри нужной группировки.
- Добавьте поле даты, укажите «По возрастанию» или «По убыванию».
- Если нужно сортировать внутри группировки по месяцу, добавьте поле-период и выберите нужную детализацию.
Порядок на корне и порядок внутри группировки — разные вещи. Если в группировке «Контрагент» вы задали сортировку по дате на корне, строки внутри контрагента всё равно будут идти в порядке группировки.
Если в отчёте включена группировка по периоду, поле «Период» упорядочивается как значение даты, а не как строка. Но когда период выводят в виде текста «Январь 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С хранит и дату, и время, поэтому сортировка по нему учитывает оба компонента сразу.Почему пустые даты оказываются в начале?
Как получить последние N документов?
ПЕРВЫЕ N вместе с УПОРЯДОЧИТЬ ПО Дата УБЫВ. Без порядка выборка будет произвольной.Сортируется ли таблица значений на форме так же, как в коде?
Сортировать.