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

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

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

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

Задача «какая дата больше» возникает в 1С постоянно: при проверке сроков договоров, выборке документов за период, расчёте просрочки платежей, сортировке событий. Встроенный язык 1С поддерживает прямое сравнение дат операторами «>», «<», «>=», «<=», «=», а язык запросов — те же операции в условиях ГДЕ и конструкциях ВЫБОР. Проблемы обычно связаны не с самим сравнением, а с пустыми датами, различием даты и даты-времени, часовыми поясами и границами периодов.

Дата в 1С хранится с точностью до секунды. Это значит, что два значения с одинаковым числом, но разным временем — например, 10.03.2026 00:00:00 и 10.03.2026 14:30:00 — для платформы являются разными датами, и первая строго меньше второй. Именно из-за этого «съезжают» отборы по периоду и сравнения, которые визуально выглядят равными.

Ниже разобраны основные способы сравнения: в коде на встроенном языке, в запросах, в СКД и динамических списках, а также типичные ошибки и способы их проверки.

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

Самый простой случай — сравнение двух переменных типа Дата. Операторы работают так же, как с числами:

Если ДатаОтгрузки > ДатаЗаказа Тогда

Сообщить("Отгрузка позже заказа");

КонецЕсли;

Получить текущую дату сеанса можно функцией ТекущаяДатаСеанса() — это предпочтительный способ на сервере, поскольку она учитывает настройки сеанса. Функция ТекущаяДата() берёт время клиентского компьютера и может отличаться от серверного, что вредно при проверках сроков.

Для вычисления разницы между датами даты можно вычитать — результат будет в секундах. Чтобы получить разницу в днях, разность делят на 86400 (60 × 60 × 24):

РазницаВДнях = (ДатаОплаты - ДатаОтгрузки) / 86400;
bsl
Если ДатаОкончания < ТекущаяДатаСеанса() Тогда
    Сообщить("Срок действия истёк");
КонецЕсли;

// Разница в днях
ПросрочкаДней = (ТекущаяДатаСеанса() - ДатаПлановойОплаты) / 86400;

Для сдвига даты назад или вперёд используйте функцию ДобавитьМесяц(Дата, ЧислоМесяцев) — она корректно обрабатывает переходы между месяцами разной длины. Простое прибавление секунд к дате работает для дней, но для месяцев даёт ошибки из-за разного числа дней.

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

В языке запросов даты сравниваются в условии ГДЕ теми же операторами. Дату-константу удобнее передавать параметром, а не формировать строкой:

ВЫБРАТЬ

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

Реализация.Дата

ИЗ

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

ГДЕ

Реализация.Дата > &НачалоПериода

И Реализация.Дата <= &КонецПериода

Литерал даты в тексте запроса задаётся ключевым словом ДАТАВРЕМЯ: ДАТАВРЕМЯ(2026, 3, 10, 0, 0, 0). Если время не указать, подставляется начало дня. Ошибка в порядке аргументов (год, месяц, день) — частая причина «пустых» выборок.

Для сравнения только по календарному дню без учёта времени применяйте функции НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) и КОНЕЦПЕРИОДА(Дата, ДЕНЬ). Конец периода возвращает последнюю секунду дня (23:59:59), поэтому условие «Дата <= КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)» корректно захватывает весь день.

Пустая дата и её роль при сравнении

Пустая дата в 1С — это значение 01.01.0001 00:00:00. Она меньше любой реальной даты. Если реквизит «ДатаОплаты» не заполнен, условие ДатаОплаты < ТекущаяДатаСеанса() вернёт Истина, и документ ошибочно попадёт в «просроченные». Это одна из самых массовых причин неверных отчётов по дебиторке.

Проверку на пустую дату делайте явно. В коде — сравнение с пустым значением: Если ДатаОплаты = Дата(1,1,1) Тогда ... либо через ЗначениеЗаполнено(ДатаОплаты). В запросе — условие Дата <> ДАТАВРЕМЯ(1,1,1).

Если реквизит составного типа и в нём может оказаться не дата, а другой тип, сравнение дат может завершиться ошибкой или дать неожиданный результат. В запросах такие поля приводят через ВЫРАЗИТЬ(Поле КАК ДАТА).

Типичные ошибки
01
Сравнение без проверки на пустую дату — незаполненный реквизит попадает в просрочку, потому что 01.01.0001 меньше любой даты
02
Сравнение дат с временем при проверке «тот же день» — 10.03 00:00 и 10.03 15:00 считаются разными значениями
03
Использование ТекущаяДата() на клиенте вместо ТекущаяДатаСеанса() — при расхождении времени клиента и сервера проверки сроков дают ложный результат
04
Граница периода с временем 00:00:00 вместо конца дня — документы за последний день теряются из выборки

Дата против даты-времени: как сравнивать только дни

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

Если НачалоДня(Дата1) > НачалоДня(Дата2) Тогда

// Дата1 — более поздний день

КонецЕсли;

В запросе аналог — НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Для сравнения по месяцу или кварталу используйте соответствующие значения периода: МЕСЯЦ, КВАРТАЛ, ГОД. Это полезно, например, при проверке «документ в том же месяце, что и оплата».

Отдельный случай — документы с одинаковой датой, но разным временем внутри секунды. У документа есть позиция на оси времени (дата + ссылка), и два документа с одинаковой датой всё равно упорядочены. Если нужен строгий порядок «что позже», сравнивайте моменты времени через МоментВремени или поле ссылки, а не только дату.

Сравнение дат в СКД, динамических списках и отборах

В динамических списках и отчётах на СКД пользовательские отборы «больше», «больше или равно», «в периоде» работают с датами напрямую. Проблема та же: вид сравнения «Равно» для даты с непустым временем почти никогда не сработает, потому что ищется точное совпадение до секунды. Для отбора «за день» используйте «В периоде» или «Больше или равно началу дня И Меньше или равно концу дня».

В параметрах СКД удобно задавать тип «Стандартный период» — платформа сама подставит дату начала 00:00:00 и дату окончания 23:59:59, что исключает потерю последнего дня. Если параметры — отдельные даты, в тексте запроса оберните окончание в КОНЕЦПЕРИОДА.

Маршрут решения

Как выбрать способ сравнения

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

Проверка результата и контрольные точки

После реализации сравнения проверьте его на граничных случаях: равные даты, пустая дата, даты на границе суток (23:59:59 и 00:00:00 следующего дня), переход через месяц и год. Именно на границах всплывают ошибки с временем и пустыми значениями.

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

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

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

Отбор за последний день периода
Норма

Документы за весь день попадают в выборку до 23:59:59

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

Документы после 00:00 последнего дня отсутствуют — граница задана без КОНЕЦПЕРИОДА

Документы без даты оплаты
Норма

Не попадают в отчёт по просрочке

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

Все незаполненные даты считаются просроченными — нет проверки на пустую дату

Сравнение «тот же день»
Норма

Даты 10.03 09:00 и 10.03 18:00 признаются равными по дню

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

Признаются разными — сравнение идёт с учётом времени без НачалоДня

FAQ: частые вопросы о сравнении дат в 1С

Как узнать, какая из двух дат больше, в коде 1С?

Используйте обычные операторы: выражение Дата1 > Дата2 вернёт Истина, если Дата1 позже. Для сравнения только по календарному дню оберните обе даты в НачалоДня().

Почему условие «Дата = &Дата» в запросе ничего не находит?

Скорее всего, в поле даты хранится время, отличное от 00:00:00, а параметр передан как начало дня. Точное равенство требует совпадения до секунды. Замените условие на диапазон: Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ).

Чему равна пустая дата и как её отфильтровать?

Пустая дата — 01.01.0001 00:00:00. В запросе отфильтруйте её условием Дата <> ДАТАВРЕМЯ(1,1,1), в коде — проверкой Дата = Дата(1,1,1) или функцией ЗначениеЗаполнено().

Как посчитать разницу между датами в днях?

Вычтите одну дату из другой — получите разницу в секундах — и разделите на 86400. Для календарной разницы в месяцах такой способ не подходит: используйте РАЗНОСТЬДАТ(Дата1, Дата2, МЕСЯЦ) в запросе.

ТекущаяДата() или ТекущаяДатаСеанса() — что использовать?

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

Как сравнить даты с учётом часовых поясов?

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

Итог

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

Даты в 1С сравниваются обычными операторами и в коде, и в запросах. Перед сравнением проверяйте пустую дату (01.01.0001), для сравнения по дню отбрасывайте время через НачалоДня или НАЧАЛОПЕРИОДА, а верхнюю границу периода задавайте через КОНЕЦПЕРИОДА. Для серверных проверок сроков используйте ТекущаяДатаСеанса().