К статье
Практический материал

Разработка и Конфигурация · 12 мин

Какая дата больше при сравнении в 1С: правила, примеры и подводные камни

Как в 1С сравнивать даты: операторы сравнения, функции запроса, пустая дата, состав даты и время. Примеры кода, типичные ошибки и проверка результата.

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

Во встроенном языке 1С даты сравниваются напрямую операторами >, <, =, >=, <=, <>. Большей считается более поздняя дата: чем дальше момент времени от начала отсчёта, тем значение больше. Например, '20260115' > '20260110' вернёт Истина, потому что 15 января позже 10 января.

Главные ошибки возникают не из-за самих операторов, а из-за данных: пустые даты, строки вместо дат, разный состав даты (с временем и без) и сравнение границ периода с учётом секунд. Ниже разобраны все эти сценарии с примерами кода и способами проверки.

Как 1С определяет, какая дата больше

Тип Дата в 1С хранит момент времени с точностью до секунды. Внутри платформы значение упорядочено по шкале времени: чем позже момент, тем больше значение. Поэтому сравнение двух дат работает так же, как сравнение чисел, — платформа просто определяет, какой момент наступает позже.

При сравнении учитывается всё: год, месяц, день, часы, минуты и секунды. Дата '20260315120000' (15 марта, 12:00) больше, чем '20260315000000' (начало того же дня), хотя календарный день один и тот же. Это частая причина «странных» результатов при проверке равенства дат документов.

Пример простого сравнения во встроенном языке:

Дата1 = '20260510';       // 10 мая

Дата2 = '20260520'; // 20 мая

Если Дата2 > Дата1 Тогда

Сообщить("Дата2 больше — она позже");

КонецЕсли;

Сравнение дат операторами встроенного языка

Для значений типа Дата доступны все шесть операторов сравнения. Никаких специальных функций для ответа на вопрос «какая дата больше» не требуется — достаточно знака > или <.

Если Документ.Дата > ТекущаяДата() Тогда

// документ датирован будущим числом

КонецЕсли;

Если ДатаНачала <= ДатаОкончания Тогда

// период задан корректно

КонецЕсли;

Обратите внимание на оператор <=: при проверке границ периода он безопаснее строгого <, потому что допускает нулевую длительность (начало равно концу). Если бизнес-логика требует, чтобы конец был строго позже начала, используйте строгое неравенство и явно сообщайте пользователю об ошибке.

Для получения большей из двух дат удобно использовать тернарную логику через Если или функцию-обёртку:

Функция МаксимальнаяДата(Дата1, Дата2)

Если Дата1 > Дата2 Тогда

Возврат Дата1;

Иначе

Возврат Дата2;

КонецЕсли;

КонецФункции

Сравнение дат в запросе

В языке запросов даты сравниваются теми же знаками в секции ГДЕ или в условиях соединения. Значения-параметры передаются через параметры запроса, литералы даты записываются как ДАТАВРЕМЯ(2026, 5, 10) или ДАТАВРЕМЯ(2026, 5, 10, 23, 59, 59) с указанием времени.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Реализация.Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Дата > &ДатаОтбора";

Запрос.УстановитьПараметр("ДатаОтбора", '20260101');

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

В запросах также доступны функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, которые приводят дату к границе дня, месяца, квартала или года. С их помощью сравнение «какая дата больше» сводится к сравнению одинаково округлённых значений, что исключает влияние времени.

Как корректно отобрать документы за один день
  1. 1
    Передайте в запрос параметр с нужной датой без времени
  2. 2
    В условии напишите: Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&День, ДЕНЬ) И КОНЕЦПЕРИОДА(&День, ДЕНЬ)
  3. 3
    Выполните запрос и проверьте, что попали документы с любым временем внутри дня
  4. 4
    Убедитесь, что документы соседних дней в выборку не попали

Пустая дата и незаполненные реквизиты

Незаполненный реквизит типа Дата содержит значение '00010101'. При сравнении оно ведёт себя как обычная дата и оказывается меньше любой реальной. Поэтому условие Если СрокОплаты < ТекущаяДата() Тогда сработает и для документа, где срок оплаты вообще не указан, — программа решит, что срок давно просрочен.

Чтобы отличить «дату не заполнили» от «дата в прошлом», используйте функцию ЗначениеЗаполнено() или явное сравнение с пустой датой:

Если Не ЗначениеЗаполнено(СрокОплаты) Тогда

Сообщить("Срок оплаты не указан");

ИначеЕсли СрокОплаты < ТекущаяДата() Тогда

Сообщить("Срок оплаты истёк");

КонецЕсли;

В запросах аналогичная проверка: условие ГДЕ Реквизит = ДАТАВРЕМЯ(1, 1, 1) отбирает записи с пустой датой. Если нужно исключить их из сравнения, добавьте условие И Реквизит <> ДАТАВРЕМЯ(1, 1, 1).

Типичные ошибки
01
Сравнение незаполненного реквизита с текущей датой без проверки ЗначениеЗаполнено — пустая дата трактуется как давно прошедшая
02
Сравнение дат оператором = без приведения к началу дня — документы того же дня с разным временем считаются разными
03
Сравнение строк с датами в формате ДД.ММ.ГГГГ — строки сравниваются посимвольно, и 31.01.2026 окажется «больше», чем 01.12.2026
04
Использование границы 23:59:59 вместо функции КонецДня — при смене точности учёта времени логика ломается

Сравнение дат с разным составом: день против даты со временем

Реквизиты в 1С могут иметь состав даты «Дата», «Время» или «Дата и время». Значение с составом «Дата» всегда имеет время 00:00:00. При сравнении такого значения с датой-временем того же дня первая окажется меньше: '20260510' < '20260510143000' — Истина.

Это влияет на отборы по периодам. Если верхняя граница задана как дата без времени, документы, проведённые в этот день после полуночи, в условие Дата <= &КонецПериода не попадут. Безопасные варианты: приводить границу функцией КонецДня(), использовать строгое неравенство с началом следующего дня или применять объект Граница с видом «Включая».

КонецПериода = КонецДня('20260510');  // 10.05 23:59:59

// или

Если Документ.Дата < НачалоДня('20260511') Тогда

// всё, что раньше 11 мая 00:00:00

КонецЕсли;

При сравнении моментов времени документов (дата плюс ссылка) используйте тип МоментВремени: он позволяет корректно упорядочить документы, проведённые в одну секунду, где простое сравнение дат даст равенство.

Способы задать верхнюю границу периода

КонецДня(Дата)

Просто и читаемо; ограничение — точность до секунды, при более точном учёте времени возможны пропуски

Дата < НачалоДня(СледующийДень)

Надёжно при любой точности времени; требует вычисления следующего дня

Граница с видом Включая

Правильный вариант для моментов времени и динамических списков; сложнее в написании

Что делать, если даты хранятся строкой или числом

Если дата попала в базу как строка (например, из обмена или Excel), сравнение операторами даст результат по правилам сравнения строк — посимвольно. Строка «31.01.2026» будет «больше» строки «01.12.2026», хотя по времени январь раньше декабря. Перед сравнением строку нужно преобразовать в дату.

Во встроенном языке надёжный способ — разобрать строку и собрать дату конструктором Дата(Год, Месяц, День) или использовать XMLЗначение для формата ISO. Простое присваивание Дата = "10.05.2026" не выполняет преобразование автоматически.

В запросе строковое поле можно преобразовать через ПОДСТРОКА и ДАТАВРЕМЯ, но это громоздко и медленно. Правильное решение — хранить даты в реквизитах типа Дата, а строковые представления использовать только на этапе загрузки с немедленной конвертацией.

Проверка результата сравнения

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

Быстро проверить поведение можно через внешнюю обработку или консоль кода: вычислить выражение '20260101' > '20231231235959' и убедиться, что результат соответствует ожиданию. Для запросов аналогичную проверку выполняют в консоли запросов, подставляя параметры с граничными значениями.

Признак корректной логики — симметричность: если Дата1 > Дата2 даёт Истина, то Дата2 > Дата1 должно давать Ложь, а Дата1 = Дата2 — Ложь. Если равенство и неравенство одновременно «не срабатывают», почти наверняка в сравнении участвует значение другого типа или различается время.

Контрольные точки

Как проверить результат

Сравнение двух известных дат
Норма

Более поздняя дата даёт Истина в условии Дата1 > Дата2

Тревожный признак

Результат противоположный — вероятно, сравниваются строки, а не даты

Документы одного дня
Норма

Отбор за день включает документы с любым временем

Тревожный признак

Попадают только документы на 00:00:00 — граница задана без КонецДня

Незаполненный реквизит
Норма

Пустая дата обрабатывается отдельной веткой условия

Тревожный признак

Пустая дата попадает в условие «просрочено»

Равные даты
Норма

Оператор = возвращает Истина для одинаковых моментов

Тревожный признак

Равенство не срабатывает из-за разного времени — нужно НачалоДня

FAQ

Какая дата больше: 01.01.2026 или 31.12.2023?

Больше 01.01.2026 — это более поздний момент времени. В 1С сравнение идёт по шкале времени: год, затем месяц, день и время. Любая дата 2026 года больше любой даты 2023 года независимо от дня и месяца.

Почему условие Дата = ТекущаяДата() никогда не срабатывает?

ТекущаяДата() возвращает дату со временем до секунды, а реквизиты часто хранят только день (время 00:00:00). Равенство требует совпадения и времени. Сравнивайте НачалоДня(ТекущаяДата()) с НачалоДня(Реквизит) или проверяйте попадание в интервал дня.

Как сравнить даты, если одна из них может быть пустой?

Сначала проверьте ЗначениеЗаполнено() для обеих дат. Пустая дата ('00010101') меньше любой реальной, поэтому без проверки условие «дата в прошлом» сработает и для незаполненного поля. Обработайте пустое значение отдельной веткой.

Как в запросе выбрать документы позже заданной даты?

Используйте условие ГДЕ Документ.Дата > &ПараметрДаты и передайте параметр типа Дата. Если нужно включить весь заданный день, сравнивайте с НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) через >= или используйте КОНЕЦПЕРИОДА для верхней границы.

Что больше: дата документа или момент времени?

Это разные типы, и сравнивать их напрямую некорректно. МоментВремени включает дату и ссылку на документ, что позволяет упорядочить документы внутри одной секунды. Для сравнения позиций документов используйте МоментВремени, для календарных проверок — дату.

Можно ли сравнивать даты, записанные строкой «10.05.2026»?

Технически строки сравнятся, но по алфавиту, а не по времени: «31.01.2026» окажется больше «01.12.2026». Перед сравнением преобразуйте строку в тип Дата, иначе результат будет логически неверным.

Итог

Что важно запомнить

Большей считается более поздняя дата; сравнение выполняется операторами >, <, = как в коде, так и в запросе. Перед сравнением проверяйте заполненность даты, приводите значения к одинаковому составу (день или дата со временем) и никогда не сравнивайте даты как строки. Граничные случаи — пустая дата, конец дня и документы в одну секунду — проверяйте отдельными тестами.