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

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

Как в 1С сравнить значение с пустой датой

Как в 1С сравнить значение с пустой датой: конструктор Дата(1,1,1), запросы, условия в коде, типичные ошибки и проверка результата.

Пустая дата в 1С — это не NULL и не строка, а вполне конкретное значение: 1 января 0001 года, то есть 00010101000000. Именно поэтому сравнение с пустой датой выполняется через конструктор Дата(1,1,1) или через строковый литерал даты '00010101'. Попытка проверить дату на пустоту через ПустаяСтрока() или сравнение с Неопределено не даст результата — это одна из самых частых ошибок начинающих разработчиков.

Задача встречается постоянно: отобрать документы без даты оплаты, найти сотрудников без даты увольнения, проверить, заполнен ли реквизит «Дата окончания действия». В зависимости от контекста — встроенный язык, запрос, СКД или условное оформление — синтаксис проверки немного различается, и важно понимать каждый вариант.

Что такое пустая дата в 1С

В платформе 1С:Предприятие 8 тип «Дата» всегда имеет значение — он не может быть «ничем». Когда реквизит даты не заполнен, платформа хранит начальное значение: 1 января 0001 года, 0 часов 0 минут 0 секунд. Во встроенном языке это значение создаётся конструктором Дата(1,1,1).

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

Сравнение с пустой датой во встроенном языке

Основной способ — прямое сравнение с конструктором даты:

Если Документ.ДатаОплаты = Дата(1,1,1) Тогда

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

КонецЕсли;

Работают и равнозначные варианты: Дата(1,1,1,0,0,0) с явным указанием времени и строковый литерал '00010101' в операциях, где платформа выполняет неявное преобразование. Однако явный конструктор Дата(1,1,1) предпочтительнее — он читается однозначно и не зависит от контекста преобразования типов.

Обратная проверка — «дата заполнена» — выполняется через неравенство:

Если Сотрудник.ДатаУвольнения <> Дата(1,1,1) Тогда

// сотрудник уволен

КонецЕсли;

bsl
Если РеквизитДата = Дата(1,1,1) Тогда
    // дата пустая
ИначеЕсли РеквизитДата > ТекущаяДатаСеанса() Тогда
    // дата в будущем
КонецЕсли;

Для переменных, которые могут содержать не только дату, но и Неопределено, сначала проверяйте тип: Если ТипЗнч(Значение) = Тип("Дата") И Значение = Дата(1,1,1) Тогда. Это защитит от ошибочной логики, когда Неопределено «проскочит» проверку на пустую дату и код пойдёт по неверной ветке.

Проверка пустой даты в запросе

В языке запросов 1С пустая дата записывается как конструктор ДАТАВРЕМЯ(1,1,1) либо передаётся параметром. Оба способа корректны, но параметр удобнее при переиспользовании текста запроса.

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

РеализацияТоваровУслуг.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1)

Вариант с параметром:

Запрос.Текст = "ВЫБРАТЬ ... ГДЕ ДатаОплаты = &ПустаяДата";

Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1));

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

Пустая дата в СКД и настройках отчётов

В схеме компоновки данных условие на пустую дату добавляется в отбор как обычное сравнение: поле — вид сравнения «Равно» — значение. В поле значения можно ввести дату 01.01.0001 вручную или выбрать её в календаре, прокрутив к минимальному году. В пользовательском режиме это не всегда удобно, поэтому для отчётов, которыми пользуются не программисты, лучше выносить параметр «Только без даты оплаты» типа «Булево» и обрабатывать его в запросе:

ГДЕ

(НЕ &ТолькоБезДатыОплаты

ИЛИ Документ.ДатаОплаты = ДАТАВРЕМЯ(1,1,1))

В выражениях СКД (вычисляемые поля, ресурсы) доступен тот же конструктор ДатаВремя(1,1,1) внутри языка выражений компоновки. Для условного оформления, например подсветки строк с незаполненной датой красным, условие строится аналогично: поле = 01.01.0001.

Как отобрать документы без даты оплаты
  1. 1
    Откройте консоль запросов или модуль, где формируется выборка
  2. 2
    Добавьте условие ГДЕ ДатаОплаты = ДАТАВРЕМЯ(1,1,1) или параметр &ПустаяДата = Дата(1,1,1)
  3. 3
    Если поле из левого соединения, оберните его в ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1))
  4. 4
    Выполните запрос и убедитесь, что в результат попали документы с отображаемой пустой датой
  5. 5
    Проверьте обратный случай: документы с заполненной датой не должны попасть в выборку

Проверка на форме и в условном оформлении

На управляемой форме реквизит даты можно проверить в обработчиках ПередЗаписью или ОбработкаПроверкиЗаполнения. Стандартная механика — отказ от записи с сообщением пользователю:

Если Объект.ДатаОкончания = Дата(1,1,1) Тогда

Отказ = Истина;

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Не указана дата окончания действия";

Сообщение.Поле = "ДатаОкончания";

Сообщение.УстановитьДанные(Объект);

Сообщение.Сообщить();

КонецЕсли;

Если требуется просто визуально выделить пустые даты в списке, используйте условное оформление формы списка: элемент отбора «ДатаОплаты Равно 01.01.0001», оформление — цвет текста или фона. Это не требует программирования и работает в динамических списках без доработки запроса.

Альтернативные способы проверки

Функция ЗначениеЗаполнено(Значение) универсальна: она возвращает Ложь и для пустой даты, и для Неопределено, и для пустой ссылки. Это удобно, когда тип переменной заранее неизвестен. Но у универсальности есть цена: по коду не видно, что именно проверялось, а для логики «дата должна быть именно пустой, а не неопределённой» функция не подходит.

Ещё один приём — сравнение через начало дня: НачалоДня(МояДата) = Дата(1,1,1). Он не добавляет ничего к прямому сравнению, так как пустая дата и так имеет нулевое время, и используется только когда нужно отбросить время у заполненных дат для других целей.

Способы проверки пустой даты

Сравнение с Дата(1,1,1)

Точная проверка именно пустой даты. Подходит везде: код, запрос (ДАТАВРЕМЯ(1,1,1)), СКД. Не ловит NULL и Неопределено.

ЗначениеЗаполнено()

Универсальная проверка для любых типов, включая Неопределено. Не различает пустую дату и другие пустые значения.

ЕСТЬNULL + ДАТАВРЕМЯ(1,1,1)

Обязателен в запросах с левыми соединениями, где вместо пустой даты приходит NULL. Только для языка запросов.

Типичные ошибки и как их избежать

Самая распространённая ошибка — сравнение даты со строкой "" или проверка через ПустаяСтрока(). Дата — не строка, такая проверка всегда даст Ложь, и ветка «дата не заполнена» никогда не выполнится. Вторая частая проблема — забытый ЕСТЬNULL в запросах с соединениями, из-за чего часть документов «теряется» из отчёта.

Третья группа ошибок — сравнение с NULL там, где его нет, и наоборот. Запомните правило: в таблице, где реквизит физически хранится, незаполненная дата — это ДАТАВРЕМЯ(1,1,1); NULL появляется только как результат соединений и итогов. Если условие не срабатывает, выведите значение поля в консоль запросов и посмотрите, что там на самом деле.

Типичные ошибки
01
Сравнение даты с пустой строкой "" — условие никогда не выполняется, дата остаётся необработанной
02
Проверка через Неопределено для реквизита даты — Неопределено не равно пустой дате, проверка бесполезна
03
Отсутствие ЕСТЬNULL при левом соединении — строки с NULL выпадают из выборки, отчёт занижает данные
04
Сравнение с ДАТАВРЕМЯ(1,1,1) поля, содержащего время, при поиске конкретного дня — время мешает равенству, используйте границы периода
Контрольные точки

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

Значение реквизита в отладчике
Норма

Показывает 01.01.0001 0:00:00

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

Показывает Неопределено или NULL — нужна другая проверка

Результат запроса
Норма

В выборку попали все документы с пустой датой

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

Часть документов отсутствует — вероятно NULL из соединения

Обратная выборка (дата <> пустой)
Норма

Сумма двух выборок равна общему числу записей

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

Сумма меньше — есть NULL, которые не попали ни в одно условие

FAQ

Чему равна пустая дата в 1С?

Пустая дата равна 1 января 0001 года, 00:00:00. Во встроенном языке она создаётся конструктором Дата(1,1,1), в языке запросов — ДАТАВРЕМЯ(1,1,1). Именно это значение хранится в незаполненном реквизите типа «Дата».

Можно ли сравнивать дату с Неопределено?

Технически сравнение выполнится, но всегда даст Ложь: Неопределено — это отсутствие значения, а пустая дата — вполне конкретное значение типа «Дата». Для реквизитов документов и справочников проверяйте равенство с Дата(1,1,1), а Неопределено оставьте для переменных и возвращаемых значений функций.

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

Оберните поле в ЕСТЬNULL: ГДЕ ЕСТЬNULL(Таблица.Дата, ДАТАВРЕМЯ(1,1,1)) = ДАТАВРЕМЯ(1,1,1). Без этого строки, где в присоединённой таблице нет записи, содержат NULL и не пройдут условие равенства.

Почему ЗначениеЗаполнено возвращает Ложь для пустой даты?

Потому что функция считает незаполненными значения по умолчанию для каждого типа, а для типа «Дата» значение по умолчанию — как раз 01.01.0001. Это удобно для универсальных проверок, но если нужно отличить пустую дату от Неопределено, используйте прямое сравнение с Дата(1,1,1).

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

Добавьте элемент отбора: поле — нужный реквизит даты, вид сравнения «Равно», значение — 01.01.0001. Ту же логику используйте в условном оформлении, чтобы подсветить такие строки цветом без изменения запроса списка.

Чем ДАТАВРЕМЯ(1,1,1) отличается от параметра с Дата(1,1,1)?

По результату — ничем, оба варианта дают одно значение. Конструктор ДАТАВРЕМЯ пишется прямо в тексте запроса и не требует установки параметра, а параметр удобнее, когда одно и то же значение используется в нескольких местах запроса или текст запроса формируется динамически.

Итог

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

Пустая дата в 1С — это Дата(1,1,1), а не Неопределено и не пустая строка. В коде сравнивайте напрямую, в запросах используйте ДАТАВРЕМЯ(1,1,1), а при соединениях таблиц обязательно обрабатывайте NULL через ЕСТЬNULL. Проверяйте результат на данных, где пустые даты точно есть.