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

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

Чему равна пустая дата в 1С и как с ней работать

Чему равна пустая дата в 1С: значение 01.01.0001, проверка через ЗначениеЗаполнено(), сравнение с '00010101', особенности в запросах и типичные ошибки разработчиков.

Пустая дата в 1С — это не отсутствие значения и не NULL, а вполне конкретное значение типа «Дата»: 1 января 0001 года, то есть Дата(1, 1, 1). В строковом виде для сравнений она записывается как "00010101" или "00010101000000" с учётом времени. Именно это значение платформа присваивает реквизиту типа «Дата», пока пользователь или код не заполнил его реальным содержимым.

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

Какое значение имеет пустая дата в 1С

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

Во встроенном языке это значение можно получить несколькими способами: Дата(1, 1, 1), литерал '00010101' или '00010101000000' (год, месяц, день, часы, минуты, секунды). Все три записи дают одинаковый результат, и сравнение между ними возвращает Истина.

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

Как проверить дату на пустоту в коде

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

Альтернатива — прямое сравнение: Если Дата = '00010101' Тогда ... КонецЕсли; или Если Дата = Дата(1,1,1) Тогда. Такой вариант работает быстрее и читается однозначно, но применим только к реквизитам, которые гарантированно имеют тип «Дата». Если переменная может содержать другой тип, сравнение выдаст ошибку или неожиданный результат.

bsl
Если НЕ ЗначениеЗаполнено(Документ.ДатаОплаты) Тогда
    Сообщить("Дата оплаты не указана");
КонецЕсли;

// эквивалентная проверка
Если Документ.ДатаОплаты = '00010101' Тогда
    // дата пустая
КонецЕсли;

Проверку через ЗначениеЗаполнено() стоит использовать по умолчанию: она безопасна при сомнениях в типе данных и единообразна по всему коду. Прямое сравнение с литералом уместно в циклах и обработках больших объёмов данных, где важна скорость и тип реквизита известен точно.

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

В языке запросов пустая дата задаётся конструкцией ДАТАВРЕМЯ(1, 1, 1) либо передаётся параметром. Практичный приём — объявить параметр &ПустаяДата и передать в него Дата(1,1,1) из кода: так условие читается понятнее, а параметр можно переиспользовать в нескольких местах запроса.

Типичное условие отбора выглядит так: ГДЕ Документ.ДатаОплаты = &ПустаяДата — для поиска документов без даты оплаты, или с отрицанием ГДЕ Документ.ДатаОплаты <> &ПустаяДата — для отбора только заполненных. Помните, что сравнение с NULL здесь не работает: если поле получено левым соединением и может быть NULL, нужна проверка ЕСТЬ NULL или функция ЕСТЬNULL(Поле, &ПустаяДата).

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

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

Как вывести пустую дату в отчёте без «01.01.0001»

Стандартная проблема отчётов: незаполненная дата выводится как «01.01.0001» или «01.01.01», что выглядит как мусор. В СКД это решается через формат поля: на закладке «Наборы данных» или в настройках поля задайте форматную строку ДФ=dd.MM.yyyy; ДП=' '. Параметр ДП задаёт представление пустой даты — пустую строку или прочерк.

В запросе аналогичный эффект даёт конструкция ВЫБОР КОГДА Поле = ДАТАВРЕМЯ(1,1,1) ТОГДА NULL ИНАЧЕ Поле КОНЕЦ либо подмена строковым представлением. В макетах табличных документов при программном выводе проверяйте значение перед записью в ячейку и выводите пустую строку вместо даты.

Как скрыть пустую дату в отчёте СКД
  1. 1
    Откройте схему компоновки данных и перейдите к настройкам поля с датой
  2. 2
    В свойстве «Оформление» найдите параметр «Формат»
  3. 3
    Укажите форматную строку: ДФ=dd.MM.yyyy; ДП=' '
  4. 4
    Сформируйте отчёт и убедитесь, что вместо 01.01.0001 выводится пустая ячейка

Пустая дата в разных контекстах: реквизиты, СКД, обмен

Реквизиты объектов и формы

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

Регистры и границы периодов

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

Обмен данными и внешние форматы

При выгрузке в XML, JSON или CSV пустая дата сериализуется как «0001-01-01T00:00:00». Внешние системы могут не принимать такое значение или интерпретировать его как реальную дату. Перед выгрузкой заменяйте пустые даты на NULL, пустую строку или отдельный признак — в зависимости от требований принимающей стороны. При загрузке выполняйте обратное преобразование.

Типичные ошибки при работе с пустой датой

Самая частая ошибка — сравнение даты с пустой строкой или с нулём: Если Дата = "" Тогда. Такое сравнение всегда ложно (или вызывает ошибку приведения типов), и проверка молча не срабатывает. Вторая распространённая ошибка — смешение пустой даты и NULL в запросах с соединениями: поле равно NULL, а разработчик проверяет его на равенство ДАТАВРЕМЯ(1,1,1), и условие не срабатывает.

Третья группа ошибок — вычисления с пустой датой. Разность двух дат, где одна пустая, даёт огромное отрицательное число секунд, и расчёт просрочки или стажа улетает в абсурдные значения. Перед любой арифметикой с датами проверяйте обе на заполненность.

Типичные ошибки
01
Сравнение даты с пустой строкой "" вместо '00010101' — условие никогда не выполняется
02
Проверка поля из левого соединения на равенство пустой дате вместо ЕСТЬ NULL — записи теряются
03
Арифметика с непроверенной датой — отрицательные периоды и неверная просрочка в отчётах
04
Вывод 01.01.0001 в печатную форму без форматной строки — документ выглядит бракованным

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

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

Быстрая проверка в консоли кода: выполните Сообщить(ЗначениеЗаполнено(Дата(1,1,1))) — должно вернуться Ложь, и Сообщить('00010101' = Дата(1,1,1)) — Истина. Если оба выражения дают ожидаемый результат, логика проверки построена верно.

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

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

ЗначениеЗаполнено(Дата(1,1,1))
Норма

Возвращает Ложь

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

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

Отчёт с незаполненной датой
Норма

Пустая ячейка или прочерк

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

Отображается 01.01.0001

Запрос с левым соединением
Норма

NULL обрабатывается через ЕСТЬ NULL или ЕСТЬNULL

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

Записи с NULL выпадают из результата

Часто задаваемые вопросы

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

Это значение типа «Дата», равное 01.01.0001 00:00:00. В виде литерала оно записывается как '00010101' или '00010101000000', в функции — Дата(1, 1, 1). Числовым или строковым типом оно не является, хотя с литералом-датой сравнивается напрямую.

Почему ЗначениеЗаполнено() лучше сравнения с '00010101'?

Функция универсальна: она корректно работает с любым типом реквизита и не упадёт с ошибкой, если переменная вдруг содержит не дату. Прямое сравнение быстрее, но требует гарантии типа и менее читаемо для тех, кто будет сопровождать код.

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

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

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

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

Можно ли сделать, чтобы пустая дата отображалась как прочерк?

Да. В форматной строке поля задайте параметр ДП: например, Формат(Дата, "ДФ=dd.MM.yyyy; ДП='—'") выведет прочерк вместо 01.01.0001. В СКД тот же параметр задаётся в оформлении поля.

Опасно ли использовать пустую дату в отборах по периоду?

Да, если делать это неявно. В виртуальных таблицах регистров пустая дата в параметре означает «без ограничения», и расчёт пойдёт по всей базе. Всегда проверяйте параметры периода на заполненность перед выполнением запроса.

Итог

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

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