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

Отчеты и Аналитика · 10 мин

Как в СКД проверить поле на пустую дату в 1С

Как проверить поле на пустую дату в СКД 1С: выражения в запросе, вычисляемые поля, отборы и ресурсы. Примеры кода, типичные ошибки и FAQ.

Пустая дата в 1С — это дата со значением «01.01.0001 00:00:00», она не равна NULL и не равна пустой строке. Из-за этого разработчики часто получают ошибки, когда пытаются проверить дату в схеме компоновки данных привычным сравнением с NULL или пустой строкой. В СКД проверка на пустую дату может выполняться на нескольких уровнях: в тексте запроса набора данных, в вычисляемых полях, в отборах, в ресурсах и в выражениях оформления.

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

Что такое пустая дата в 1С и почему с ней возникают проблемы

В платформе 1С у типа «Дата» нет состояния «не заполнено» в привычном смысле. Если реквизит типа «Дата» не заполнен, он хранит значение 01.01.0001 00:00:00. Это вполне конкретное значение, поэтому сравнение Поле = NULL вернёт ложь, а проверка Поле = "" вообще приведёт к ошибке несовместимости типов.

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

Проверка на пустую дату в запросе набора данных

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

ВЫБОР

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

ТОГДА "Не оплачен"

ИНАЧЕ "Оплачен"

КОНЕЦ КАК СтатусОплаты

Если поле может содержать NULL (например, после левого соединения), комбинируйте обе проверки:

ВЫБОР

КОГДА Оплаты.Дата ЕСТЬ NULL

ТОГДА "Нет данных"

КОГДА Оплаты.Дата = ДАТАВРЕМЯ(1,1,1)

ТОГДА "Дата не указана"

ИНАЧЕ "Заполнено"

КОНЕЦ КАК Статус

Альтернативный вариант — функция ЗНАЧЕНИЕ, но для дат она неприменима: у даты нет предопределённого пустого значения в перечислении значений. Поэтому для дат всегда используйте именно литерал ДАТАВРЕМЯ(1,1,1). Учтите, что если реквизит имеет составной тип (дата и что-то ещё), сравнение с литералом даты корректно отработает только для значений именно типа «Дата».

bsl
ВЫБОР
    КОГДА ЕСТЬNULL(Т.ДатаОтгрузки, ДАТАВРЕМЯ(1,1,1)) = ДАТАВРЕМЯ(1,1,1)
        ТОГДА "Не отгружено"
    ИНАЧЕ "Отгружено"
КОНЕЦ КАК СтатусОтгрузки

Проверка в вычисляемом поле СКД

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

Выбор

Когда ДатаОплаты = ДатаВремя(1,1,1)

Тогда "Не оплачен"

Иначе "Оплачен"

Конец

Обратите внимание на синтаксис: в языке выражений СКД используются ключевые слова Выбор/Когда/Тогда/Иначе/Конец, а литерал даты пишется как ДатаВремя(1,1,1) — со строчной буквы в отличие от языка запросов, где регистр не важен. Смешивать синтаксис языка запросов и языка выражений в одном месте нельзя — это частая причина ошибки «Ошибка в выражении».

Вычисляемое поле можно использовать дальше в ресурсах, отборах, группировках и условном оформлении. Например, подкрасить строки с незаполненной датой красным фоном через закладку «Условное оформление», указав условие СтатусОплаты = "Не оплачен".

Проверка в отборе СКД

Чтобы отобрать только записи с пустой или наоборот с заполненной датой, на закладке «Отбор» добавьте условие на нужное поле. Проблема в том, что в поле значения отбора нельзя просто ввести 01.01.0001 — интерфейс быстрого отбора часто не даёт выбрать такую дату. Поэтому используются два подхода.

Первый — отбор через параметр. В запросе добавьте условие:

ГДЕ

ВЫБОР

КОГДА &ТолькоБезДаты

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

ИНАЧЕ ИСТИНА

КОНЕЦ

Параметр ТолькоБезДаты типа «Булево» выведите в пользовательские настройки — пользователь сам включит нужный режим. Второй подход — отбор по вычисляемому полю-признаку: создайте поле «ДатаЗаполнена» с выражением ДатаОплаты <> ДатаВремя(1,1,1) и дайте пользователю отбор по нему со значениями «Да/Нет».

Отбор по пустой дате через параметр
  1. 1
    В текст запроса добавьте условие ГДЕ с ВЫБОР по параметру-флагу
  2. 2
    На закладке «Параметры» задайте параметру тип Булево и включите его в список доступных
  3. 3
    На закладке «Настройки» вынесите параметр в пользовательские настройки (быстрый доступ)
  4. 4
    Сформируйте отчёт и проверьте оба режима: с включённым и выключенным флагом

Проверка в ресурсах и итогах

Если нужно посчитать количество записей с пустой датой в итогах, используется выражение ресурса на закладке «Ресурсы». Например, ресурс «КоличествоНеоплаченных»:

Сумма(Выбор

Когда ДатаОплаты = ДатаВремя(1,1,1)

Тогда 1

Иначе 0

Конец)

Такой приём позволяет выводить в группировках и общих итогах число позиций без даты, не создавая отдельных наборов данных. Аналогично можно посчитать долю: разделить сумму признака на Количество(Различные Документ) или общее число строк.

Помните, что выражения ресурсов рассчитываются для каждой группировки отдельно, и если поле даты недоступно на уровне группировки, выражение может вернуть NULL. В таком случае оберните вычисление в проверку или убедитесь, что поле включено в набор выбранных полей нужной группировки.

Если отчёт строится на регистре сведений или регистре накоплений, проверяйте, не попадает ли в выборку служебная дата пустой группировки. При соединении нескольких наборов данных в СКД поле даты из второго набора при отсутствии связи будет NULL, а не 01.01.0001 — обрабатывайте это через ЕСТЬNULL ещё в запросе.
ПЗ
Практическое замечание

Типичные ошибки и их последствия

Ошибки при проверке пустой даты в СКД повторяются от проекта к проекту. Знание типовых случаев экономит время отладки:

  • Сравнение с NULL вместо ДАТАВРЕМЯ(1,1,1) — условие никогда не срабатывает, отчёт показывает все записи как заполненные;
  • Сравнение с пустой строкой — ошибка несовместимости типов при формировании отчёта;
  • Смешение синтаксиса языка запросов и языка выражений СКД — ошибка «Ошибка в выражении» при компоновке;
  • Игнорирование NULL после левого соединения — часть строк попадает «в никуда», итоги не сходятся;
  • Проверка даты в отборе через ввод 01.01.0001 вручную — пользовательский интерфейс часто не позволяет выбрать такую дату, отбор не работает.
Типичные ошибки
01
Проверка «Поле = NULL» для реквизита типа Дата — условие никогда не выполняется, потому что незаполненная дата хранит 01.01.0001
02
Использование ДАТАВРЕМЯ в вычисляемом поле вместо ДатаВремя — ошибка компоновки при формировании отчёта
03
Отсутствие обработки NULL после левого соединения — строки с NULL не попадают ни в одну категорию, итоги расходятся

Как проверить результат работы условия

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

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

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

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

Строка с реквизитом даты 01.01.0001
Норма

Помечена как «дата не заполнена»

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

Попала в категорию заполненных или не попала ни в одну

Строка из левого соединения без пары
Норма

Обработана через ЕСТЬNULL и классифицирована

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

Признак пустой или NULL, строка выпала из итогов

Сумма итогов по категориям
Норма

Равна общему числу строк выборки

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

Меньше общего числа — есть необработанные случаи

FAQ

Чем пустая дата отличается от NULL в запросе СКД?

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

Можно ли проверить пустую дату через функцию ЗНАЧЕНИЕ()?

Нет. Функция ЗНАЧЕНИЕ работает с предопределёнными значениями перечислений, справочников, планов счетов и видов расчёта. У типа «Дата» предопределённого пустого значения нет, поэтому используется литерал ДАТАВРЕМЯ(1,1,1).

Как вывести в отчёте прочерк вместо 01.01.0001?

Создайте вычисляемое поле с выражением «Выбор Когда Дата = ДатаВремя(1,1,1) Тогда "" Иначе ... Конец». Поскольку ветки должны возвращать один тип, вместо самой даты выводите её строковое представление через Формат(Дата, "ДЛФ=D"), а в ветке пустой даты — пустую строку или прочерк.

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

Поле ввода даты в быстрых настройках обычно не позволяет указать 01.01.0001 — минимальная доступная дата ограничена. Решение: отбор через параметр-флаг в запросе или отбор по вычисляемому булеву полю «ДатаЗаполнена» со значениями Да/Нет.

Как проверить дату в выражении условного оформления?

На закладке «Условное оформление» добавьте условие по полю даты с видом сравнения «Равно». Значение 01.01.0001 проще задать через вычисляемое поле-признак: создайте поле «ДатаПустая» с выражением ДатаПоле = ДатаВремя(1,1,1) и оформляйте строки по условию ДатаПустая = Да.

Работает ли проверка для полей с составным типом, включающим дату?

Да, сравнение с ДАТАВРЕМЯ(1,1,1) корректно отработает для значений именно типа «Дата». Но если в поле хранится значение другого типа (например, строка или ссылка), сравнение вернёт ложь, и такая запись будет считаться «заполненной». При необходимости добавьте проверку ТИПЗНАЧЕНИЯ(Поле) = ТИП(Дата).

Итог

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

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