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

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

Как сравнить две даты в 1С: операторы, функции и примеры

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

Сравнение дат — одна из самых частых операций во встроенном языке 1С: проверка срока действия договора, отбор документов за период, контроль даты запрета редактирования. Хорошая новость в том, что тип «Дата» в 1С поддерживает прямые операторы сравнения, и в большинстве случаев достаточно конструкции вида Если Дата1 > Дата2 Тогда. Сложности начинаются, когда в дате хранится время, когда нужно получить разницу в днях или когда одно из значений оказывается пустым.

Во встроенном языке 1С дата хранится с точностью до секунды. Это значит, что две даты, которые на экране выглядят одинаково (например, 15.03.2026), могут быть не равны друг другу, если у одной из них время 00:00:00, а у другой — 14:32:17. Именно эта особенность порождает большинство ошибок при сравнении.

Ниже разобраны все основные способы: прямые операторы, функции работы с датами, сравнение без учёта времени, сравнение в запросах и типичные ловушки с пустыми значениями.

Прямое сравнение дат операторами

Тип «Дата» во встроенном языке поддерживает все стандартные операторы сравнения: =, <>, >, <, >=, <=. Сравнение выполняется по полному значению даты, включая время.

ДатаНачала = '20260310000000';

ДатаОкончания = '20260320000000';

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

Сообщить("Дата начала позже даты окончания — ошибка ввода");

КонецЕсли;

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

Сообщить("Даты совпадают");

КонецЕсли;

Литерал даты записывается в одинарных кавычках в формате ГГГГММДДччммсс. Время можно опустить — тогда оно считается равным 00:00:00: '20260310'.

Проверка попадания даты в диапазон выполняется двумя условиями, объединёнными оператором И:

Если ПроверяемаяДата >= ДатаНачала И ПроверяемаяДата <= ДатаОкончания Тогда

// дата входит в период включительно

КонецЕсли;

Сравнение дат без учёта времени

Самая частая практическая задача — узнать, относятся ли две даты к одному календарному дню. Прямое сравнение на равенство здесь не подходит, потому что время у значений обычно разное. Решение — привести обе даты к началу дня функцией НачалоДня().

Если НачалоДня(ДатаДокумента) = НачалоДня(ТекущаяДатаСеанса()) Тогда

Сообщить("Документ проведён сегодня");

КонецЕсли;

Аналогично работают функции НачалоМесяца(), НачалоКвартала(), НачалоГода(), НачалоНедели() — они позволяют сравнивать даты по принадлежности к периоду:

Если НачалоМесяца(Дата1) = НачалоМесяца(Дата2) Тогда

// обе даты попадают в один календарный месяц

КонецЕсли;

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

Сравнение вариантов

НачалоДня(Дата1) = НачалоДня(Дата2)

Проверка, что даты относятся к одному дню. Универсальный и читаемый способ.

Прямое сравнение Дата1 = Дата2

Подходит только когда время гарантированно совпадает или нулевое. Иначе даёт ложное «не равно».

Сравнение через Формат()

Формат(Дата, "ДЛФ=D") — сравнение строк. Работает, но медленнее и хуже читается; использовать не рекомендуется.

Разница между датами: секунды, дни, месяцы

Вычитание двух дат в 1С даёт разницу в секундах — это число, а не дата. Чтобы получить разницу в днях, результат делят на количество секунд в сутках (86400), предварительно отбросив время через НачалоДня():

РазницаВСекундах = ДатаОкончания - ДатаНачала;

РазницаВДнях = (НачалоДня(ДатаОкончания) - НачалоДня(ДатаНачала)) / 86400;

Для разницы в месяцах и годах простого деления недостаточно из-за разной длины месяцев. Используйте функцию Месяц() и Год() с ручным расчётом либо, в управляемых приложениях, функции из общих модулей БСП (например, ОбщегоНазначения не содержит готовой разницы в месяцах, но есть ДобавитьМесяц() для обратной задачи).

РазницаМесяцев = (Год(Дата2) - Год(Дата1)) * 12 + Месяц(Дата2) - Месяц(Дата1);

Обратная операция — сдвиг даты — выполняется функцией ДобавитьМесяц(Дата, КоличествоМесяцев) для месяцев и простым прибавлением секунд для дней: НоваяДата = Дата + 7 * 86400; прибавит неделю.

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

В языке запросов 1С даты сравниваются теми же операторами, но параметры удобнее передавать явно. Для сравнения без времени в запросе есть функции НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА():

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Реализация.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";

Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));

Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));

Ключевой момент: оператор МЕЖДУ включает обе границы, поэтому правую границу передают как КонецДня() — значение 23:59:59. Если передать просто дату без времени, документы последнего дня, проведённые после полуночи, в выборку не попадут.

В условии ГДЕ можно также сравнивать дату с пустой: ГДЕ Документ.ДатаОплаты = &ПустаяДата, передав параметр '00010101', либо использовать конструкцию ДатаВремя(1,1,1) прямо в тексте запроса.

bsl
Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда
    Сообщить("Даты совпадают по дню");
ИначеЕсли Дата1 > Дата2 Тогда
    Сообщить("Дата1 позже Дата2");
Иначе
    Сообщить("Дата1 раньше Дата2");
КонецЕсли;

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

Пустая дата в 1С — это значение 01.01.0001 00:00:00, литерал '00010101'. Сравнение с ней выполняется обычным оператором равенства, но предпочтительнее функция ЗначениеЗаполнено(), которая корректно работает и с другими типами:

Если Не ЗначениеЗаполнено(Документ.ДатаОплаты) Тогда

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

КонецЕсли;

// эквивалентная проверка

Если Документ.ДатаОплаты = '00010101' Тогда

// дата пустая

КонецЕсли;

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

Типичные ошибки
01
Сравнение дат на равенство без НачалоДня(): из-за разного времени одинаковые дни считаются разными, и условие никогда не срабатывает.
02
Сравнение пустой даты с текущей без проверки ЗначениеЗаполнено(): пустое значение меньше любой даты, логика проверки ломается.
03
Передача в запрос правой границы без КонецДня(): документы последнего дня периода теряются.
04
Получение разницы в днях делением разности с временем: дробный результат округляется непредсказуемо.
05
Сравнение дат, преобразованных в строки: строковое сравнение «10.02.2026» и «09.03.2026» даёт неверный порядок.

Текущая дата: ТекущаяДата или ТекущаяДатаСеанса

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

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

Сообщить("Нельзя проводить документ будущей датой");

КонецЕсли;

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

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

Как выбрать действие

Нужно узнать, какая из двух дат позжеИспользуйте прямые операторы >, <, = — время учитывается автоматически.
Нужно сравнить только календарные дниПриведите обе даты через НачалоДня() и сравнивайте результаты.
Нужна разница в дняхВычтите НачалоДня(Дата1) из НачалоДня(Дата2) и разделите на 86400.
Сравнение выполняется в запросе по периодуПередавайте границы параметрами: НачалоДня() для начала и КонецДня() для окончания.
Одно из значений может быть пустымСначала проверьте ЗначениеЗаполнено(), только потом сравнивайте.

Проверка результата и отладка

Быстрый способ убедиться, что сравнение работает как ожидается, — вывести оба значения с полным временем. Функция Формат(Дата, "ДФ='dd.MM.yyyy HH:mm:ss'") покажет скрытое время, из-за которого условие ведёт себя неожиданно.

Сообщить("Дата1: " + Формат(Дата1, "ДФ='dd.MM.yyyy HH:mm:ss'"));

Сообщить("Дата2: " + Формат(Дата2, "ДФ='dd.MM.yyyy HH:mm:ss'"));

Сообщить("Равны по дню: " + (НачалоДня(Дата1) = НачалоДня(Дата2)));

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

Для прикладного кода полезно выносить логику сравнения в отдельную функцию общего модуля — например, ДатыВОдномДне(Дата1, Дата2). Это убирает дублирование и снижает риск, что в одном месте время будет отброшено, а в другом — забудут.

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

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

Сравнение на равенство двух дат одного дня
Норма

НачалоДня(Дата1) = НачалоДня(Дата2) возвращает Истина

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

Условие ложно — проверьте, что обе даты приведены через НачалоДня()

Выборка документов за период в запросе
Норма

В выборку попадают документы первого и последнего дня периода

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

Документы последнего дня отсутствуют — правая граница передана без КонецДня()

Разница между датами в днях
Норма

Целое число, совпадающее с подсчётом по календарю

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

Дробное число или смещение на сутки — время не отброшено

Проверка необязательного реквизита с датой
Норма

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

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

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

Ответы на частые вопросы

Как сравнить две даты в 1С без учёта времени?

Приведите обе даты к началу дня: Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда. Аналогично работают НачалоМесяца(), НачалоГода() и другие функции усечения периода — они позволяют сравнивать даты с точностью до нужного интервала.

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

Вычтите начала дней и разделите на число секунд в сутках: (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400. Без НачалоДня() получите дробное значение из-за времени внутри дат.

Почему две одинаковые даты сравниваются как разные?

Потому что дата в 1С хранит время с точностью до секунды. Значения 15.03.2026 00:00:00 и 15.03.2026 09:41:00 на экране могут выглядеть одинаково, но не равны. Выведите обе даты через Формат() с шаблоном, включающим время, чтобы увидеть разницу.

Как проверить, что дата не заполнена?

Используйте ЗначениеЗаполнено(Дата) — функция вернёт Ложь для пустой даты. Альтернатива — сравнение с литералом '00010101'. Учитывайте, что пустая дата меньше любой заполненной, поэтому перед сравнением с другими датами заполненность проверяют отдельно.

Как сравнить даты в запросе 1С?

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

Что возвращает вычитание двух дат в 1С?

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

Итог

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

Даты в 1С сравниваются обычными операторами, но время внутри значения — главный источник ошибок. Для сравнения по дню применяйте НачалоДня(), для границ периода в запросах — НачалоДня() и КонецДня(), для разницы в днях делите разность начал дней на 86400, а пустые даты всегда проверяйте через ЗначениеЗаполнено() до сравнения.