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

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

Как сравнить время в 1С: способы, функции и примеры

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

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

Основная ловушка — это то, что дата всегда содержит время. Значение '20260115' — это 15 января 2026 года, 00:00:00, а не «весь день». Если сравнивать документ, проведённый в 14:30, с такой датой, результат будет отличаться от ожидаемого. Ниже разобраны рабочие способы сравнения: операторы, функции разницы, выделение времени без даты, сравнение в запросах и типовые ошибки.

Как 1С хранит дату и время и почему это важно

Тип Дата в 1С объединяет календарную дату и время суток в одном значении с точностью до секунды. Пустая дата — '00010101' (1 января 0001 года, 00:00:00). Литерал даты записывается в одинарных кавычках в формате ГГГГММДДччммсс, где время можно опускать: '20260301143000' — 1 марта 2026 года, 14:30:00.

Из-за такого устройства сравнение «документ от 15 марта» с датой '20260315' на самом деле сравнивает с полуночью 15 марта. Документ, созданный в 09:15 утра 15 марта, окажется больше этой даты. Для проверки вхождения в день сравнивайте с границами: НачалоДня(ДатаДокумента) = НачалоДня(ДатаПроверки) или используйте диапазон от начала до конца дня.

Сравнение дат и времени операторами

Простейший и самый надёжный способ — обычные операторы сравнения. Они работают с датами точно так же, как с числами: чем позже момент, тем больше значение.

Если ДатаДокумента > ТекущаяДата() Тогда

Сообщить("Дата документа в будущем");

КонецЕсли;

Если СрокОплаты <= ТекущаяДата() Тогда

// срок наступил или уже прошёл

КонецЕсли;

Оператор равенства = сравнивает значения с точностью до секунды. Два значения, отличающиеся на одну секунду, считаются разными. Поэтому проверка «дата равна сегодня» через ДатаДокумента = НачалоДня(ТекущаяДата()) почти всегда неверна — правильно сравнивать начала дней обеих дат или использовать диапазон.

Для проверки попадания в интервал используйте двойное условие:

Если ДатаДокумента >= НачалоПериода

И ДатаДокумента <= КонецДня(КонецПериода) Тогда

// документ внутри периода включительно

КонецЕсли;

Типичные ошибки
01
Сравнение даты документа с датой без времени через «=»: 14:30:00 никогда не равно 00:00:00, условие не срабатывает
02
Проверка «за сегодня» через Дата = ТекущаяДата(): совпадение возможно только с точностью до секунды
03
Сравнение строкового представления даты вместо типа Дата: строки сравниваются по алфавиту, а не по хронологии

Как получить разницу между датами и временем

Вычитание двух дат возвращает разницу в секундах — это число, с которым можно выполнять арифметику и сравнения:

РазницаСекунд = ДатаОкончания - ДатаНачала;

РазницаМинут = РазницаСекунд / 60;

РазницаЧасов = РазницаСекунд / 3600;

Если (ТекущаяДата() - ДатаОтправки) > 86400 Тогда

// прошло больше суток (86400 секунд)

КонецЕсли;

Для разницы в календарных единицах (дни, месяцы) простое деление не всегда корректно из-за разной длины месяцев и високосных лет. Для целых дней между датами используйте (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400 — так исключается влияние времени суток. Для месячных интервалов удобны функции ДобавитьМесяц() и сравнение с полученной границей вместо подсчёта секунд.

Если нужно проверить, что между событиями прошло не менее заданного времени, надёжнее сравнивать не разницу с числом, а сдвинутую дату: Если ТекущаяДата() >= ДатаНачала + 3600 Тогда — прошёл час. Это читается проще и меньше подвержено ошибкам округления.

Как сравнить только время без даты

Задача «событие произошло после 18:00» требует отбросить календарную часть. Встроенной функции «время дня» в языке нет, поэтому применяют два подхода.

Первый — разложить время на составляющие и сравнить числа:

ВремяСекунд = Час(ПроверяемаяДата) * 3600

+ Минута(ПроверяемаяДата) * 60

+ Секунда(ПроверяемаяДата);

Если ВремяСекунд >= 18 * 3600 Тогда

// событие после 18:00

КонецЕсли;

Второй — привести оба значения к одной условной дате через сдвиг: вычесть из даты её начало дня и прибавить к фиксированной базе. Фактически это то же количество секунд от полуночи: ВремяДня = ПроверяемаяДата - НачалоДня(ПроверяемаяДата). Результат — число секунд от 0 до 86399, которое удобно сравнивать с границами смен, например Если ВремяДня >= 8*3600 И ВремяДня < 20*3600 Тогда — дневная смена с 08:00 до 20:00.

Порядок действий при сравнении времени суток
  1. 1
    Выделите время из даты: ВремяСек = Дата - НачалоДня(Дата)
  2. 2
    Задайте границы в секундах: начало смены 8*3600, конец 20*3600
  3. 3
    Сравните: ВремяСек >= Начало И ВремяСек < Конец
  4. 4
    Проверьте граничные значения: ровно 08:00:00 и 19:59:59
  5. 5
    Убедитесь, что ночной интервал через полночь обрабатывается отдельным условием

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

В языке запросов 1С сравнение выполняется теми же операторами в секции ГДЕ, но параметры нужно передавать именно как даты, а не как строки. Частая ошибка — передать строку "01.03.2026" и получить либо ошибку сравнения типов, либо пустой результат.

ВЫБРАТЬ

Заказ.Ссылка,

Заказ.Дата

ИЗ

Документ.ЗаказПокупателя КАК Заказ

ГДЕ

Заказ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

В виртуальных таблицах регистров (остатки, обороты) период задаётся параметрами виртуальной таблицы — это работает быстрее, чем фильтрация в ГДЕ по физической таблице, потому что отбор выполняется на уровне итогов.

Сравнение вариантов

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

Когда нужно сравнить два момента времени целиком; ограничение — точность до секунды, равенство ловит только точное совпадение

Вычитание дат

Когда нужна разница в секундах с последующим пересчётом; ограничение — не учитывает календарную разную длину месяцев

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

Когда сравнивают дни без времени; ограничение — теряется информация о времени внутри дня

РАЗНОСТЬДАТ в запросе

Когда разница нужна прямо в выборке без обхода результата; ограничение — работает только в тексте запроса

Проверка результата и граничные случаи

После написания условия проверьте его на граничных значениях: ровно полночь, последняя секунда дня (23:59:59), пустая дата, даты в разных месяцах и годах. Большинство ошибок сравнения дат обнаруживается именно на границах интервалов.

Отдельно проверьте поведение с часовыми поясами, если база используется в нескольких регионах или сеансах с разными настройками. Функция ТекущаяДата() возвращает дату сеанса, которая может отличаться от времени сервера и от времени клиента. В клиент-серверном режиме сравнивайте значения, полученные из одного источника, иначе документ, записанный «сейчас» на сервере, может оказаться «в будущем» относительно клиентской даты.

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

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

Сравнение «за сегодня»
Норма

Используется диапазон от НачалоДня до КонецДня или сравнение начал дней

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

Дата сравнивается с ТекущаяДата() через равенство

Граница интервала
Норма

Документ ровно в 00:00:00 и в 23:59:59 попадает куда задумано

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

Документы крайнего дня пропадают из выборки

Пустые даты
Норма

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

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

Пустые даты проходят условие «меньше заданной»

Источник текущего времени
Норма

Сравниваются даты из одного источника (сервер или сеанс)

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

Серверная дата сравнивается с клиентской при разных часовых поясах

Частые ошибки и как их избежать

Первая ошибка — сравнение даты со строкой. Если реквизит хранит дату как строку (например, при загрузке из Excel или обмена), преобразуйте её в тип Дата до сравнения, иначе сравнение будет лексикографическим: строка «09.01.2026» окажется «больше» строки «10.01.2026».

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

FAQ

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

Сравните их начала дня: НачалоДня(Дата1) = НачалоДня(Дата2). Так вы отбрасываете время суток и сравниваете только календарную часть.

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

Вычтите одну дату из другой — получите разницу в секундах — и разделите на 60: Минуты = (Дата2 - Дата1) / 60. При необходимости округлите через Цел() или Окр().

Почему условие «Дата = ТекущаяДата()» никогда не срабатывает?

Потому что равенство проверяется с точностью до секунды, а момент выполнения уже ушёл вперёд. Сравнивайте диапазоны или начала дней вместо точного равенства.

Как сравнить только часы, например «позже 18:00»?

Выделите время в секундах от полуночи: ВремяСек = Дата - НачалоДня(Дата) и сравните с 18 * 3600. Альтернатива — сложить Час(Дата)*3600 + Минута(Дата)*60 + Секунда(Дата).

Чем отличается ТекущаяДата() на клиенте и на сервере?

На клиенте возвращается время компьютера пользователя, на сервере — время сервера 1С. При разных часовых поясах значения различаются, поэтому в серверной логике используйте серверное время и не смешивайте источники в одном сравнении.

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

Передайте параметр &Граница = ТекущаяДата() - 86400 и условие Документ.Дата >= &Граница. Либо используйте ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -1) прямо в тексте запроса.

Итог

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

Дата в 1С всегда содержит время с точностью до секунды, поэтому сравнивайте значения операторами, а попадание в день — через НачалоДня и КонецДня. Разница дат — это секунды; для сравнения только времени выделяйте секунды от полуночи. Проверяйте граничные значения, пустые даты и источник текущего времени.