Разработка и Конфигурация · 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'. Литерал работает и в коде, и в условиях отбора динамических списков, и в параметрах запросов.
ПустаяДата = Дата(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' в тексте запроса не работает — это особенность, о которой часто забывают.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказы.Ссылка КАК Заказ
|ИЗ
| Документ.ЗаказПокупателя КАК Заказы
|ГДЕ
| Заказы.ДатаОплаты = ДАТАВРЕМЯ(1,1,1)";
// альтернатива — через параметр:
Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1));Второй вариант — передать пустую дату параметром: Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1)); и в тексте писать Заказы.ДатаОплаты = &ПустаяДата. Это удобно, когда значение формируется динамически или используется в нескольких местах запроса.
Если поле даты участвует в левом соединении, добавьте обработку NULL. Типовой приём — функция ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)): она заменяет NULL на пустую дату, после чего достаточно одного сравнения. Либо проверяйте оба условия через ИЛИ.
Проверка даты на пустоту
Универсальный способ — функция ЗначениеЗаполнено(Значение). Для даты она возвращает Ложь, если значение равно 01.01.0001, и Истина для любой реальной даты. Это предпочтительный вариант в проверках перед записью и в условиях бизнес-логики, потому что он одинаково работает для всех типов.
Прямое сравнение Если ДатаДокумента = '00010101' Тогда тоже корректно и выполняется чуть явнее. Оба подхода равнозначны для типа «Дата». Чего делать не стоит — сравнивать с пустой строкой "" или с Неопределено: это другие значения, и сравнение даст ложь даже для незаполненной даты.
Как проверить результат
Поле даты визуально пустое
Отображается 01.01.0001 — значение не очищено
Возвращает Ложь для незаполненной даты
Возвращает Истина — в реквизите реальная дата
Находит все документы без даты
Пустой результат при заведомо незаполненных полях — проверьте NULL из соединений
Пустая дата в формах и отборах
В управляемой форме поле ввода даты очищается вручную: выделите содержимое и нажмите Delete или Backspace, либо выберите «Очистить» в контекстном меню поля. После этого реквизит принимает значение 01.01.0001, а поле отображается пустым. Простое стирание цифр без подтверждения (Enter или перехода на другое поле) может не зафиксировать изменение.
В настройках отборов динамических списков и отчётов на СКД пустую дату задают через вид сравнения «Равно» со значением, которое оставляют незаполненным, либо через «Не заполнено», если такой вид сравнения доступен. В отчётах на СКД надёжнее использовать условие в запросе набора данных с ДАТАВРЕМЯ(1,1,1), чем полагаться на пользовательские отборы.
- 1Откройте документ и перейдите в поле даты
- 2Выделите содержимое поля и нажмите Delete
- 3Нажмите Enter или перейдите на другое поле для фиксации
- 4Проверьте, что поле отображается пустым
- 5Запишите документ
Пустая дата как граница периода
Частый сценарий — отбор «с даты по дату», где одна из границ может быть не задана. Проверяйте границы через ЗначениеЗаполнено() и добавляйте условие в запрос только для заполненных параметров. Сравнение Дата >= '00010101' формально пропустит всё, но явное построение условия читается лучше и не создаёт ложных ограничений.
Пустая дата при обмене и внешних данных
При выгрузке в XML пустая дата сериализуется как 0001-01-01T00:00:00. Некоторые внешние системы (и сам формат xsd:dateTime в отдельных реализациях) не принимают год 0001, поэтому при интеграциях пустую дату часто заменяют на отсутствие тега или на NULL в базе-приёмнике. Согласуйте это поведение в формате обмена заранее.
При загрузке из CSV или Excel пустая ячейка даты через Дата() или приведение типов может вызвать ошибку преобразования. Перед присвоением проверяйте строку на пустоту: Если ПустаяСтрока(СтрокаДаты) Тогда Реквизит = '00010101'; Иначе ....
Частые ошибки и как их избежать
Самая распространённая ошибка — уверенность, что незаполненная дата равна пустой строке или Неопределено. Тип «Дата» всегда содержит значение; проверять нужно именно на 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. Это поведение нужно согласовать в описании формата обмена.