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

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

Как сравнить дни дат в 1С

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

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

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

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

Тип «Дата» в 1С всегда содержит и календарную дату, и время. Значение 15.03.2026 10:23:45 не равно 15.03.2026 18:05:12, хотя оба момента относятся к одному дню. Если написать условие Если ДатаДокумента = ТекущаяДатаСеанса() Тогда, оно сработает только при совпадении до секунды — то есть практически никогда.

Отдельная ловушка — пустая дата. Она равна 01.01.0001 00:00:00, и сравнение с ней корректно работает оператором равенства, но функции типа НачалоДня для пустой даты вернут ту же пустую дату, что иногда маскирует ошибки в логике.

Сравнение дней через НачалоДня и КонецДня

Самый распространённый приём — привести обе даты к началу дня и сравнить полученные значения. Функция НачалоДня(Дата) возвращает ту же дату со временем 00:00:00, а КонецДня(Дата) — с временем 23:59:59.

bsl
Если НачалоДня(ДатаДокумента) = НачалоДня(ТекущаяДатаСеанса()) Тогда
	Сообщить("Документ датирован сегодняшним днём");
КонецЕсли;

Этот способ подходит, когда нужно проверить равенство дней или их порядок (раньше/позже). Сравнения «больше» и «меньше» после приведения к началу дня трактуются однозначно: НачалоДня(Дата1) < НачалоДня(Дата2) означает, что день первой даты раньше.

КонецДня удобен для проверки попадания в границу: например, условие «дата оплаты не позже даты отгрузки» корректно записать как ДатаОплаты <= КонецДня(ДатаОтгрузки). Тогда оплата в любое время того же дня считается выполненной в срок.

Разность дат в днях

Когда нужно узнать, сколько дней между датами, или сравнить интервал с заданным числом, используется функция РазностьДат(Дата1; Дата2; Тип). Третий параметр задаёт единицу измерения: ДЕНЬ, ЧАС, МИНУТА и другие. Результат — целое число: сколько полных единиц указанного типа укладывается между датами.

bsl
ДнейПросрочки = РазностьДат(ДатаОплатыПоДоговору, ТекущаяДатаСеанса(), "ДЕНЬ");
Если ДнейПросрочки > 0 Тогда
	Сообщить("Оплата просрочена на " + ДнейПросрочки + " дн.");
КонецЕсли;

Обратите внимание на знак результата: если вторая дата раньше первой, разность будет отрицательной. Поэтому для проверки «наступил ли срок» удобно сравнивать результат с нулём, а не с конкретным числом.

Учтите особенность подсчёта: разность считается в полных днях с точностью до секунд. Между 15.03 23:00 и 16.03 01:00 функция вернёт 0, хотя календарные дни разные. Если нужна разница именно в календарных днях, сначала примените НачалоДня к обеим датам, а затем РазностьДат.

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

В языке запросов 1С доступны аналогичные функции. Для сравнения по дню используют НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) и КОНЕЦПЕРИОДА(Дата, ДЕНЬ), для вычисления интервала — РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ).

bsl
ВЫБРАТЬ
	Реализация.Ссылка КАК Документ
ИЗ
	Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
	НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) = &НужныйДень

Если задача — выбрать документы за конкретный день, эффективнее не преобразовывать поле Дата, а задать диапазон: Дата МЕЖДУ &НачалоДня И &КонецДня, где параметры вычислены в коде функциями НачалоДня и КонецДня. Такой запрос может использовать индекс по дате и работает быстрее на больших таблицах.

Способы сравнения дней

НачалоДня + сравнение

Универсально для проверки равенства и порядка дней в коде

РазностьДат с типом ДЕНЬ

Когда нужно число дней между датами или проверка наступления срока

МЕЖДУ в запросе

Оптимально для отбора записей за день в больших таблицах

Формат в строку

Только для вывода пользователю, не для логики сравнения

Проверка попадания даты в период

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

Для работы с периодами также полезны функции НачалоМесяца, КонецМесяца, НачалоНедели, ДобавитьМесяц. Например, проверка «дата в текущем месяце» записывается как НачалоМесяца(Дата) = НачалоМесяца(ТекущаяДатаСеанса()).

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

Как выбрать приём

Нужно узнать, один ли это календарный деньСравните НачалоДня(Дата1) и НачалоДня(Дата2)
Нужно число дней между датамиИспользуйте РазностьДат с типом ДЕНЬ
Нужно отобрать записи за день в запросеПередайте границы параметрами и используйте МЕЖДУ
Нужно проверить наступление срока оплатыСравните текущую дату с КонецДня(СрокОплаты)

Типичные ошибки и подводные камни

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

Третья ошибка — забыть про пустые даты. Если реквизит не заполнен, НачалоДня вернёт 01.01.0001, и условие «дата меньше сегодняшней» неожиданно сработает. Перед сравнением проверяйте заполненность через ЗначениеЗаполнено(Дата).

Типичные ошибки
01
Сравнение дат напрямую без НачалоДня — условие почти никогда не выполняется
02
ТекущаяДата() на клиенте вместо ТекущаяДатаСеанса() — расхождение дней при разных часовых поясах
03
Сравнение через Формат() в строку — медленно и зависит от настроек формата
04
Отсутствие проверки на пустую дату — ложные срабатывания условий
05
Ожидание, что РазностьДат считает календарные дни — она считает полные сутки

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

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

Для запросов проверяйте результат в консоли запросов: сначала убедитесь, что параметры-границы заполнены правильно (начало дня 00:00:00, конец 23:59:59), затем что отбор возвращает ожидаемые документы, включая проведённые в конце дня.

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

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

Условие равенства дней
Норма

Срабатывает для дат одного дня с разным временем

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

Не срабатывает при визуально одинаковых датах — не отброшено время

Отбор за день в запросе
Норма

Попадают документы с 00:00:00 по 23:59:59

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

Теряются документы конца дня — верхняя граница задана без КонецДня

Расчёт просрочки
Норма

Число дней совпадает с ручным подсчётом по календарю

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

Результат на день меньше — РазностьДат посчитала полные сутки

Итог

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

Дата в 1С содержит время, поэтому дни сравнивают через НачалоДня или РазностьДат с типом ДЕНЬ. В запросах отбор за день делайте через МЕЖДУ с параметрами-границами, а пустые даты проверяйте заранее.

Частые вопросы

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

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

Как узнать, сколько дней между двумя датами?

Используйте РазностьДат(Дата1; Дата2; "ДЕНЬ"). Для календарной разницы сначала примените НачалоДня к обеим датам, иначе функция посчитает полные сутки с точностью до секунд.

Как проверить, что дата документа — сегодняшняя?

Сравните НачалоДня(ДатаДокумента) с НачалоДня(ТекущаяДатаСеанса()). Прямое сравнение с ТекущаяДатаСеанса() не подходит, так как включает время до секунды.

Чем ТекущаяДатаСеанса отличается от ТекущаяДата?

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

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

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

Что делать, если дата может быть не заполнена?

Перед сравнением проверьте ЗначениеЗаполнено(Дата). Пустая дата равна 01.01.0001, и без проверки условия вида «дата меньше текущей» будут ложно срабатывать для незаполненных реквизитов.