Разработка и Конфигурация · 9 мин
Сравнение дат в 1С: как определить, какая дата больше
Как сравнить две даты в 1С и определить, какая больше: операторы сравнения, функции запроса, типовые ошибки с пустой датой и временем.
Задача «какая дата больше» возникает в 1С постоянно: при проверке сроков договоров, выборке документов за период, расчёте просрочки платежей, сортировке событий. Встроенный язык 1С поддерживает прямое сравнение дат операторами «>», «<», «>=», «<=», «=», а язык запросов — те же операции в условиях ГДЕ и конструкциях ВЫБОР. Проблемы обычно связаны не с самим сравнением, а с пустыми датами, различием даты и даты-времени, часовыми поясами и границами периодов.
Дата в 1С хранится с точностью до секунды. Это значит, что два значения с одинаковым числом, но разным временем — например, 10.03.2026 00:00:00 и 10.03.2026 14:30:00 — для платформы являются разными датами, и первая строго меньше второй. Именно из-за этого «съезжают» отборы по периоду и сравнения, которые визуально выглядят равными.
Ниже разобраны основные способы сравнения: в коде на встроенном языке, в запросах, в СКД и динамических списках, а также типичные ошибки и способы их проверки.
Сравнение дат в коде на встроенном языке
Самый простой случай — сравнение двух переменных типа Дата. Операторы работают так же, как с числами:
Если ДатаОтгрузки > ДатаЗаказа Тогда
Сообщить("Отгрузка позже заказа");
КонецЕсли;
Получить текущую дату сеанса можно функцией ТекущаяДатаСеанса() — это предпочтительный способ на сервере, поскольку она учитывает настройки сеанса. Функция ТекущаяДата() берёт время клиентского компьютера и может отличаться от серверного, что вредно при проверках сроков.
Для вычисления разницы между датами даты можно вычитать — результат будет в секундах. Чтобы получить разницу в днях, разность делят на 86400 (60 × 60 × 24):
РазницаВДнях = (ДатаОплаты - ДатаОтгрузки) / 86400;
Если ДатаОкончания < ТекущаяДатаСеанса() Тогда
Сообщить("Срок действия истёк");
КонецЕсли;
// Разница в днях
ПросрочкаДней = (ТекущаяДатаСеанса() - ДатаПлановойОплаты) / 86400;Для сдвига даты назад или вперёд используйте функцию ДобавитьМесяц(Дата, ЧислоМесяцев) — она корректно обрабатывает переходы между месяцами разной длины. Простое прибавление секунд к дате работает для дней, но для месяцев даёт ошибки из-за разного числа дней.
Сравнение дат в запросах 1С
В языке запросов даты сравниваются в условии ГДЕ теми же операторами. Дату-константу удобнее передавать параметром, а не формировать строкой:
ВЫБРАТЬ
Реализация.Ссылка,
Реализация.Дата
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Дата > &НачалоПериода
И Реализация.Дата <= &КонецПериода
Литерал даты в тексте запроса задаётся ключевым словом ДАТАВРЕМЯ: ДАТАВРЕМЯ(2026, 3, 10, 0, 0, 0). Если время не указать, подставляется начало дня. Ошибка в порядке аргументов (год, месяц, день) — частая причина «пустых» выборок.
Для сравнения только по календарному дню без учёта времени применяйте функции НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) и КОНЕЦПЕРИОДА(Дата, ДЕНЬ). Конец периода возвращает последнюю секунду дня (23:59:59), поэтому условие «Дата <= КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)» корректно захватывает весь день.
Пустая дата и её роль при сравнении
Пустая дата в 1С — это значение 01.01.0001 00:00:00. Она меньше любой реальной даты. Если реквизит «ДатаОплаты» не заполнен, условие ДатаОплаты < ТекущаяДатаСеанса() вернёт Истина, и документ ошибочно попадёт в «просроченные». Это одна из самых массовых причин неверных отчётов по дебиторке.
Проверку на пустую дату делайте явно. В коде — сравнение с пустым значением: Если ДатаОплаты = Дата(1,1,1) Тогда ... либо через ЗначениеЗаполнено(ДатаОплаты). В запросе — условие Дата <> ДАТАВРЕМЯ(1,1,1).
Если реквизит составного типа и в нём может оказаться не дата, а другой тип, сравнение дат может завершиться ошибкой или дать неожиданный результат. В запросах такие поля приводят через ВЫРАЗИТЬ(Поле КАК ДАТА).
Дата против даты-времени: как сравнивать только дни
Когда нужно ответить на вопрос «какая дата больше» в смысле «какой день позже», время следует отбросить. В коде это делается через НачалоДня(Дата):
Если НачалоДня(Дата1) > НачалоДня(Дата2) Тогда
// Дата1 — более поздний день
КонецЕсли;
В запросе аналог — НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Для сравнения по месяцу или кварталу используйте соответствующие значения периода: МЕСЯЦ, КВАРТАЛ, ГОД. Это полезно, например, при проверке «документ в том же месяце, что и оплата».
Отдельный случай — документы с одинаковой датой, но разным временем внутри секунды. У документа есть позиция на оси времени (дата + ссылка), и два документа с одинаковой датой всё равно упорядочены. Если нужен строгий порядок «что позже», сравнивайте моменты времени через МоментВремени или поле ссылки, а не только дату.
Сравнение дат в СКД, динамических списках и отборах
В динамических списках и отчётах на СКД пользовательские отборы «больше», «больше или равно», «в периоде» работают с датами напрямую. Проблема та же: вид сравнения «Равно» для даты с непустым временем почти никогда не сработает, потому что ищется точное совпадение до секунды. Для отбора «за день» используйте «В периоде» или «Больше или равно началу дня И Меньше или равно концу дня».
В параметрах СКД удобно задавать тип «Стандартный период» — платформа сама подставит дату начала 00:00:00 и дату окончания 23:59:59, что исключает потерю последнего дня. Если параметры — отдельные даты, в тексте запроса оберните окончание в КОНЕЦПЕРИОДА.
Как выбрать способ сравнения
Проверка результата и контрольные точки
После реализации сравнения проверьте его на граничных случаях: равные даты, пустая дата, даты на границе суток (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), для сравнения по дню отбрасывайте время через НачалоДня или НАЧАЛОПЕРИОДА, а верхнюю границу периода задавайте через КОНЕЦПЕРИОДА. Для серверных проверок сроков используйте ТекущаяДатаСеанса().