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

Разработка и Конфигурация · 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. 1
    Определите, нужно ли учитывать время в сравнении
  2. 2
    Приведите обе даты к нужной границе через НачалоДня() или КонецДня()
  3. 3
    Выполните сравнение операторами =, <, >
  4. 4
    Проверьте результат на граничных значениях: начало и конец периода

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

В языке запросов 1С даты сравниваются теми же операторами, но сравнивать поле с датой нужно через параметр, а не конкатенацию строк. Параметр передаётся с типом «Дата», что исключает ошибки преобразования.

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

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

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка

|ИЗ

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

|ГДЕ

| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

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

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

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

В запросах также доступны функции работы с датами: НАЧАЛОПЕРИОДА(Дата, ДЕНЬ), КОНЕЦПЕРИОДА(Дата, МЕСЯЦ), ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 7) и РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) для вычисления разницы. Это позволяет выполнять сравнения и расчёты прямо на сервере СУБД без выгрузки данных в код.

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

Проверка пустой даты и сравнение с NULL

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

Если ДатаОплаты = '00010101' Тогда

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

КонецЕсли;

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

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

КонецЕсли;

В запросах ситуация сложнее: поле может содержать NULL, если оно получено через левое соединение и записи в связанной таблице нет. Сравнение NULL-значения с любой датой даёт не Истину и не Ложь, а NULL, поэтому условие просто не сработает. Для таких случаев применяйте ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)) или проверку «Поле ЕСТЬ NULL».

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

Типичные ошибки
01
Сравнение даты со строкой "15.03.2026" — типы не совпадают, результат всегда неверен
02
Верхняя граница периода через НачалоДня() — теряются документы последнего дня
03
Сравнение с ТекущаяДата() без НачалоДня() при проверке «сегодня» — время ломает равенство
04
Игнорирование NULL в запросах с левым соединением — записи выпадают из выборки
05
Использование строкового сравнения дат в формате ДД.ММ.ГГГГ — сортировка и сравнение работают неправильно

Сравнение дат в СКД и на формах

В схеме компоновки данных даты сравниваются через отборы: пользователь задаёт условие «больше», «меньше», «в периоде» прямо в настройках отчёта. Для периодических отчётов удобнее использовать стандартные параметры НачалоПериода и КонецПериода — СКД автоматически добавляет их в запрос и отбор.

На управляемых формах сравнение дат обычно выполняется в обработчиках ПриИзменении или ПриЗаписи. Например, при изменении даты отгрузки можно проверить, не раньше ли она даты заказа, и предупредить пользователя. Все правила сравнения здесь те же — операторы и функции НачалоДня()/КонецДня().

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

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

Операторы =, <, > в коде

Универсально и быстро; требует контроля времени в значениях

НачалоДня()/КонецДня()

Для сравнения без учёта времени и периодов; чуть больше кода

Условия в запросе с параметрами

Для выборок из базы; быстро на больших объёмах, но нужно помнить про 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' или ЗначениеЗаполнено(). Граничные значения периода — главная точка проверки любого условия.