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

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

Как указать пустую дату в 1С: код, запросы и формы

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

Пустая дата в 1С — это отсутствие значения в реквизите типа «Дата»: документ без срока оплаты, справочник без даты окончания действия, отбор без ограничения по периоду. В отличие от NULL в запросах, пустая дата — это вполне конкретное значение, равное 1 января 0001 года, и платформа хранит его именно так.

Путаница возникает из-за того, что пустую дату можно задать несколькими способами: конструктором Дата(1,1,1), строковым литералом '00010101', очисткой поля в форме или параметром запроса. Каждый вариант имеет свои нюансы, а ошибка при сравнении приводит к тому, что отбор «не срабатывает» и документы теряются в отчётах.

Ниже разобраны все рабочие способы указать и проверить пустую дату: во встроенном языке, в запросах, в формах и при обмене данными, а также типичные ошибки, из-за которых сравнение с пустой датой ведёт себя неожиданно.

Что такое пустая дата в 1С и чем она отличается от NULL

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

NULL — другое понятие. Он появляется только в запросах при левом соединении, когда для записи основной таблицы не нашлось пары в присоединяемой. NULL означает «записи нет вообще», а пустая дата — «запись есть, но дата в ней не заполнена». Сравнение Реквизит = '00010101' не найдёт NULL, а проверка ЕСТЬ NULL не найдёт пустую дату.

Практический вывод: при поиске «документов без даты оплаты» нужно проверять оба случая — и равенство пустой дате, и NULL, если поле приходит из соединения. Иначе часть записей выпадет из выборки.

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

В коде на встроенном языке есть два основных способа указать пустую дату. Первый — конструктор: Дата(1,1,1). Параметры — год, месяц, день, далее опционально часы, минуты, секунды. Вызов Дата(1,1,1) возвращает 01.01.0001 00:00:00.

Второй способ — строковой литерал даты: '00010101'. Формат — ГГГГММДД, без разделителей, в одинарных кавычках. Можно дописать время: '00010101000000'. Литерал работает и в коде, и в условиях отбора динамических списков, и в параметрах запросов.

bsl
ПустаяДата = Дата(1,1,1);
// или литералом:
ПустаяДата = '00010101';

// присвоение реквизиту
Объект.ДатаОкончания = '00010101';

// проверка
Если Объект.ДатаОкончания = '00010101' Тогда
    Сообщить("Дата не заполнена");
КонецЕсли;

Оба варианта дают одинаковый результат, выбор — вопрос стиля. Конструктор Дата(1,1,1) читается явнее, литерал короче и удобен в строковых выражениях. Важно не путать с Дата(1,1,1,0,0,0) — это то же самое значение, просто с явно указанным временем.

Очистка реквизита даты программно

Чтобы «очистить» дату в объекте, достаточно присвоить ей пустое значение: Документ.ДатаОплаты = '00010101';. После записи объекта поле в форме будет отображаться пустым. Отдельного метода «Очистить» для примитивного типа «Дата» не существует.

Пустая дата в запросах 1С

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

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Заказы.Ссылка КАК Заказ
|ИЗ
|    Документ.ЗаказПокупателя КАК Заказы
|ГДЕ
|    Заказы.ДатаОплаты = ДАТАВРЕМЯ(1,1,1)";

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

Второй вариант — передать пустую дату параметром: Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1)); и в тексте писать Заказы.ДатаОплаты = &ПустаяДата. Это удобно, когда значение формируется динамически или используется в нескольких местах запроса.

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

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

Универсальный способ — функция ЗначениеЗаполнено(Значение). Для даты она возвращает Ложь, если значение равно 01.01.0001, и Истина для любой реальной даты. Это предпочтительный вариант в проверках перед записью и в условиях бизнес-логики, потому что он одинаково работает для всех типов.

Прямое сравнение Если ДатаДокумента = '00010101' Тогда тоже корректно и выполняется чуть явнее. Оба подхода равнозначны для типа «Дата». Чего делать не стоит — сравнивать с пустой строкой "" или с Неопределено: это другие значения, и сравнение даст ложь даже для незаполненной даты.

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

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

Отображение в форме
Норма

Поле даты визуально пустое

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

Отображается 01.01.0001 — значение не очищено

ЗначениеЗаполнено(Реквизит)
Норма

Возвращает Ложь для незаполненной даты

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

Возвращает Истина — в реквизите реальная дата

Запрос с условием = ДАТАВРЕМЯ(1,1,1)
Норма

Находит все документы без даты

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

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

Пустая дата в формах и отборах

В управляемой форме поле ввода даты очищается вручную: выделите содержимое и нажмите Delete или Backspace, либо выберите «Очистить» в контекстном меню поля. После этого реквизит принимает значение 01.01.0001, а поле отображается пустым. Простое стирание цифр без подтверждения (Enter или перехода на другое поле) может не зафиксировать изменение.

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

Очистка даты в форме документа
  1. 1
    Откройте документ и перейдите в поле даты
  2. 2
    Выделите содержимое поля и нажмите Delete
  3. 3
    Нажмите Enter или перейдите на другое поле для фиксации
  4. 4
    Проверьте, что поле отображается пустым
  5. 5
    Запишите документ

Пустая дата как граница периода

Частый сценарий — отбор «с даты по дату», где одна из границ может быть не задана. Проверяйте границы через ЗначениеЗаполнено() и добавляйте условие в запрос только для заполненных параметров. Сравнение Дата >= '00010101' формально пропустит всё, но явное построение условия читается лучше и не создаёт ложных ограничений.

Пустая дата при обмене и внешних данных

При выгрузке в XML пустая дата сериализуется как 0001-01-01T00:00:00. Некоторые внешние системы (и сам формат xsd:dateTime в отдельных реализациях) не принимают год 0001, поэтому при интеграциях пустую дату часто заменяют на отсутствие тега или на NULL в базе-приёмнике. Согласуйте это поведение в формате обмена заранее.

При загрузке из CSV или Excel пустая ячейка даты через Дата() или приведение типов может вызвать ошибку преобразования. Перед присвоением проверяйте строку на пустоту: Если ПустаяСтрока(СтрокаДаты) Тогда Реквизит = '00010101'; Иначе ....

Типичные ошибки
01
Сравнение даты с пустой строкой "" — условие никогда не выполняется, хотя поле визуально пустое
02
Использование '00010101' в тексте запроса — в запросах строковый литерал не работает, нужен ДАТАВРЕМЯ(1,1,1)
03
Игнорирование NULL при левом соединении — записи без пары выпадают из выборки
04
Сравнение с Неопределено — это другое значение, проверка всегда даёт Ложь
05
Присвоение даты из внешнего файла без проверки пустой строки — ошибка преобразования типа

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

Самая распространённая ошибка — уверенность, что незаполненная дата равна пустой строке или Неопределено. Тип «Дата» всегда содержит значение; проверять нужно именно на 01.01.0001. Вторая по частоте — перенос привычки из кода в запрос: литерал '00010101' в тексте запроса вызовет ошибку или неверный результат, только ДАТАВРЕМЯ(1,1,1).

Ещё одна ловушка — составная дата с временем. Если реквизит имеет состав «Дата и время», а вы сравниваете с ДАТАВРЕМЯ(1,1,1) без времени, значения совпадут, так как время по умолчанию 00:00:00. Но при сравнении реальных дат «по день» без учёта времени условие Равно не сработает — используйте функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА.

В типовых конфигурациях для проверки заполненности даты почти всегда используется ЗначениеЗаполнено(). Следование этому же стилю в собственных доработках упрощает чтение кода и снижает риск ошибок при сравнении разных типов.
ПЗ
Практическое замечание
Итог

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

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

Частые вопросы

Чем отличается Дата(1,1,1) от '00010101'?

Ничем по результату: оба выражения дают значение 01.01.0001 00:00:00. Конструктор Дата(1,1,1) нагляднее и позволяет задать время, литерал '00010101' короче и удобен в строковых контекстах. В тексте запроса не работает ни тот, ни другой — там нужна функция ДАТАВРЕМЯ(1,1,1).

Почему запрос с условием на пустую дату ничего не находит?

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

Как очистить дату в форме документа?

Выделите содержимое поля, нажмите Delete или Backspace, затем зафиксируйте ввод клавишей Enter или переходом на другое поле. Поле станет визуально пустым — это значит, что реквизит равен 01.01.0001. После этого запишите документ.

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

Технически сравнение выполнится, но всегда даст Ложь: тип «Дата» никогда не равен Неопределено и пустой строке. Незаполненная дата равна только 01.01.0001. Для проверки используйте ЗначениеЗаполнено() или сравнение с '00010101'.

Как задать пустую дату параметром запроса?

Передайте значение из кода: Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1)); — и используйте в тексте запроса условие вида Поле = &ПустаяДата. Это удобно, когда одно и то же пороговое значение применяется в нескольких условиях.

Что происходит с пустой датой при выгрузке в XML?

Она сериализуется как 0001-01-01T00:00:00. Некоторые внешние системы не принимают год 0001, поэтому в обменах пустую дату часто заменяют отсутствующим элементом или NULL. Это поведение нужно согласовать в описании формата обмена.