Разработка и Конфигурация · 12 мин
Какая дата больше при сравнении в 1С: правила, примеры и подводные камни
Как в 1С сравнивать даты: операторы сравнения, функции запроса, пустая дата, состав даты и время. Примеры кода, типичные ошибки и проверка результата.
Сравнение дат — одна из самых частых операций в коде 1С: отбор документов за период, проверка срока действия договора, контроль последовательности проведения. При этом вопрос «какая дата больше» не всегда имеет очевидный ответ: результат зависит от того, сравниваются ли значения типа Дата, строки с датами, даты с разным составом (только день или день со временем), и от того, где выполняется сравнение — во встроенном языке или в запросе.
Во встроенном языке 1С даты сравниваются напрямую операторами >, <, =, >=, <=, <>. Большей считается более поздняя дата: чем дальше момент времени от начала отсчёта, тем значение больше. Например, '20260115' > '20260110' вернёт Истина, потому что 15 января позже 10 января.
Главные ошибки возникают не из-за самих операторов, а из-за данных: пустые даты, строки вместо дат, разный состав даты (с временем и без) и сравнение границ периода с учётом секунд. Ниже разобраны все эти сценарии с примерами кода и способами проверки.
Как 1С определяет, какая дата больше
Тип Дата в 1С хранит момент времени с точностью до секунды. Внутри платформы значение упорядочено по шкале времени: чем позже момент, тем больше значение. Поэтому сравнение двух дат работает так же, как сравнение чисел, — платформа просто определяет, какой момент наступает позже.
При сравнении учитывается всё: год, месяц, день, часы, минуты и секунды. Дата '20260315120000' (15 марта, 12:00) больше, чем '20260315000000' (начало того же дня), хотя календарный день один и тот же. Это частая причина «странных» результатов при проверке равенства дат документов.
Пример простого сравнения во встроенном языке:
Дата1 = '20260510'; // 10 мая
Дата2 = '20260520'; // 20 мая
Если Дата2 > Дата1 Тогда
Сообщить("Дата2 больше — она позже");
КонецЕсли;
Сравнение дат операторами встроенного языка
Для значений типа Дата доступны все шесть операторов сравнения. Никаких специальных функций для ответа на вопрос «какая дата больше» не требуется — достаточно знака > или <.
Если Документ.Дата > ТекущаяДата() Тогда
// документ датирован будущим числом
КонецЕсли;
Если ДатаНачала <= ДатаОкончания Тогда
// период задан корректно
КонецЕсли;
Обратите внимание на оператор <=: при проверке границ периода он безопаснее строгого <, потому что допускает нулевую длительность (начало равно концу). Если бизнес-логика требует, чтобы конец был строго позже начала, используйте строгое неравенство и явно сообщайте пользователю об ошибке.
Для получения большей из двух дат удобно использовать тернарную логику через Если или функцию-обёртку:
Функция МаксимальнаяДата(Дата1, Дата2)
Если Дата1 > Дата2 Тогда
Возврат Дата1;
Иначе
Возврат Дата2;
КонецЕсли;
КонецФункции
Сравнение дат в запросе
В языке запросов даты сравниваются теми же знаками в секции ГДЕ или в условиях соединения. Значения-параметры передаются через параметры запроса, литералы даты записываются как ДАТАВРЕМЯ(2026, 5, 10) или ДАТАВРЕМЯ(2026, 5, 10, 23, 59, 59) с указанием времени.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата > &ДатаОтбора";
Запрос.УстановитьПараметр("ДатаОтбора", '20260101');
Типичная задача в запросе — отбор документов за день включительно. Правильный приём: сравнивать дату документа с началом дня нижней границы и концом дня верхней границы, либо использовать виртуальную таблицу с параметром периода. Прямое сравнение Дата = &День не сработает, если у документов время отлично от 00:00:00.
В запросах также доступны функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, которые приводят дату к границе дня, месяца, квартала или года. С их помощью сравнение «какая дата больше» сводится к сравнению одинаково округлённых значений, что исключает влияние времени.
- 1Передайте в запрос параметр с нужной датой без времени
- 2В условии напишите: Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&День, ДЕНЬ) И КОНЕЦПЕРИОДА(&День, ДЕНЬ)
- 3Выполните запрос и проверьте, что попали документы с любым временем внутри дня
- 4Убедитесь, что документы соседних дней в выборку не попали
Пустая дата и незаполненные реквизиты
Незаполненный реквизит типа Дата содержит значение '00010101'. При сравнении оно ведёт себя как обычная дата и оказывается меньше любой реальной. Поэтому условие Если СрокОплаты < ТекущаяДата() Тогда сработает и для документа, где срок оплаты вообще не указан, — программа решит, что срок давно просрочен.
Чтобы отличить «дату не заполнили» от «дата в прошлом», используйте функцию ЗначениеЗаполнено() или явное сравнение с пустой датой:
Если Не ЗначениеЗаполнено(СрокОплаты) Тогда
Сообщить("Срок оплаты не указан");
ИначеЕсли СрокОплаты < ТекущаяДата() Тогда
Сообщить("Срок оплаты истёк");
КонецЕсли;
В запросах аналогичная проверка: условие ГДЕ Реквизит = ДАТАВРЕМЯ(1, 1, 1) отбирает записи с пустой датой. Если нужно исключить их из сравнения, добавьте условие И Реквизит <> ДАТАВРЕМЯ(1, 1, 1).
Сравнение дат с разным составом: день против даты со временем
Реквизиты в 1С могут иметь состав даты «Дата», «Время» или «Дата и время». Значение с составом «Дата» всегда имеет время 00:00:00. При сравнении такого значения с датой-временем того же дня первая окажется меньше: '20260510' < '20260510143000' — Истина.
Это влияет на отборы по периодам. Если верхняя граница задана как дата без времени, документы, проведённые в этот день после полуночи, в условие Дата <= &КонецПериода не попадут. Безопасные варианты: приводить границу функцией КонецДня(), использовать строгое неравенство с началом следующего дня или применять объект Граница с видом «Включая».
КонецПериода = КонецДня('20260510'); // 10.05 23:59:59
// или
Если Документ.Дата < НачалоДня('20260511') Тогда
// всё, что раньше 11 мая 00:00:00
КонецЕсли;
При сравнении моментов времени документов (дата плюс ссылка) используйте тип МоментВремени: он позволяет корректно упорядочить документы, проведённые в одну секунду, где простое сравнение дат даст равенство.
Способы задать верхнюю границу периода
Просто и читаемо; ограничение — точность до секунды, при более точном учёте времени возможны пропуски
Надёжно при любой точности времени; требует вычисления следующего дня
Правильный вариант для моментов времени и динамических списков; сложнее в написании
Что делать, если даты хранятся строкой или числом
Если дата попала в базу как строка (например, из обмена или Excel), сравнение операторами даст результат по правилам сравнения строк — посимвольно. Строка «31.01.2026» будет «больше» строки «01.12.2026», хотя по времени январь раньше декабря. Перед сравнением строку нужно преобразовать в дату.
Во встроенном языке надёжный способ — разобрать строку и собрать дату конструктором Дата(Год, Месяц, День) или использовать XMLЗначение для формата ISO. Простое присваивание Дата = "10.05.2026" не выполняет преобразование автоматически.
В запросе строковое поле можно преобразовать через ПОДСТРОКА и ДАТАВРЕМЯ, но это громоздко и медленно. Правильное решение — хранить даты в реквизитах типа Дата, а строковые представления использовать только на этапе загрузки с немедленной конвертацией.
Проверка результата сравнения
После написания условия проверьте его на граничных значениях, а не только на типовых. Минимальный набор тестовых случаев: равные даты, разница в одну секунду, пустая дата с каждой стороны, даты разных лет, дата без времени против даты с временем.
Быстро проверить поведение можно через внешнюю обработку или консоль кода: вычислить выражение '20260101' > '20231231235959' и убедиться, что результат соответствует ожиданию. Для запросов аналогичную проверку выполняют в консоли запросов, подставляя параметры с граничными значениями.
Признак корректной логики — симметричность: если Дата1 > Дата2 даёт Истина, то Дата2 > Дата1 должно давать Ложь, а Дата1 = Дата2 — Ложь. Если равенство и неравенство одновременно «не срабатывают», почти наверняка в сравнении участвует значение другого типа или различается время.
Как проверить результат
Более поздняя дата даёт Истина в условии Дата1 > Дата2
Результат противоположный — вероятно, сравниваются строки, а не даты
Отбор за день включает документы с любым временем
Попадают только документы на 00:00:00 — граница задана без КонецДня
Пустая дата обрабатывается отдельной веткой условия
Пустая дата попадает в условие «просрочено»
Оператор = возвращает Истина для одинаковых моментов
Равенство не срабатывает из-за разного времени — нужно НачалоДня
FAQ
Какая дата больше: 01.01.2026 или 31.12.2023?
Больше 01.01.2026 — это более поздний момент времени. В 1С сравнение идёт по шкале времени: год, затем месяц, день и время. Любая дата 2026 года больше любой даты 2023 года независимо от дня и месяца.
Почему условие Дата = ТекущаяДата() никогда не срабатывает?
ТекущаяДата() возвращает дату со временем до секунды, а реквизиты часто хранят только день (время 00:00:00). Равенство требует совпадения и времени. Сравнивайте НачалоДня(ТекущаяДата()) с НачалоДня(Реквизит) или проверяйте попадание в интервал дня.
Как сравнить даты, если одна из них может быть пустой?
Сначала проверьте ЗначениеЗаполнено() для обеих дат. Пустая дата ('00010101') меньше любой реальной, поэтому без проверки условие «дата в прошлом» сработает и для незаполненного поля. Обработайте пустое значение отдельной веткой.
Как в запросе выбрать документы позже заданной даты?
Используйте условие ГДЕ Документ.Дата > &ПараметрДаты и передайте параметр типа Дата. Если нужно включить весь заданный день, сравнивайте с НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) через >= или используйте КОНЕЦПЕРИОДА для верхней границы.
Что больше: дата документа или момент времени?
Это разные типы, и сравнивать их напрямую некорректно. МоментВремени включает дату и ссылку на документ, что позволяет упорядочить документы внутри одной секунды. Для сравнения позиций документов используйте МоментВремени, для календарных проверок — дату.
Можно ли сравнивать даты, записанные строкой «10.05.2026»?
Технически строки сравнятся, но по алфавиту, а не по времени: «31.01.2026» окажется больше «01.12.2026». Перед сравнением преобразуйте строку в тип Дата, иначе результат будет логически неверным.
Что важно запомнить
Большей считается более поздняя дата; сравнение выполняется операторами >, <, = как в коде, так и в запросе. Перед сравнением проверяйте заполненность даты, приводите значения к одинаковому составу (день или дата со временем) и никогда не сравнивайте даты как строки. Граничные случаи — пустая дата, конец дня и документы в одну секунду — проверяйте отдельными тестами.