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