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