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