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

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

Как в 1С получить пустую дату

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

Пустая дата в 1С — это специальное значение типа «Дата», которое означает отсутствие даты: начало отсчёта календаря, 01.01.0001 00:00:00. Она нужна, когда реквизит объявлен типом «Дата», но фактического значения у него ещё нет: документ не проведён, срок не назначен, период не выбран.

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

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

Что такое пустая дата и когда она нужна

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

Практические ситуации, где требуется пустая дата: очистка реквизита документа, инициализация переменной перед расчётом, признак «срок не установлен» в договоре, граница отбора «без ограничения по дате», сброс отложенного значения в регистре сведений.

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

Основные способы получить пустую дату в коде

Функция Дата(1,1,1)

Самый универсальный способ — встроенная функция Дата() с параметрами год, месяц, день. Вызов Дата(1,1,1) возвращает пустую дату. Можно также передать часы, минуты и секунды, но для пустого значения они всегда нули.

// Присвоение пустой даты переменной

ПустаяДата = Дата(1, 1, 1);

// Очистка реквизита объекта

Объект.ДатаОкончания = Дата(1, 1, 1);

Литерал даты

Литерал даты записывается в одинарных кавычках в формате ГГГГММДД. Пустая дата как литерал — '00010101'. Этот способ компактнее и часто используется в сравнениях прямо в условиях.

Если Документ.ДатаОплаты = '00010101' Тогда

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

КонецЕсли;

Значение по умолчанию

Если переменная объявлена и ей присваивается результат функции, возвращающей дату, но логика не отработала — значение может остаться пустым автоматически. То же касается новых реквизитов: свежесозданный объект с реквизитом типа «Дата» уже содержит пустую дату без каких-либо действий разработчика.

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

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

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

Если НЕ ЗначениеЗаполнено(Объект.ДатаОтгрузки) Тогда

// дата не заполнена

КонецЕсли;

Если Объект.ДатаОтгрузки = Дата(1,1,1) Тогда

// тот же результат, но проверка строго по типу Дата

КонецЕсли;

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

Сравнение способов проверки

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

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

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

Точно и наглядно для реквизитов чистого типа «Дата», но не сработает для Неопределено или NULL

Литерал '00010101'

Компактно в условиях, но снижает читаемость для тех, кто не знает формат литералов

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Заказы.Ссылка

|ИЗ

| Документ.ЗаказПокупателя КАК Заказы

|ГДЕ

| Заказы.ДатаОтгрузки = &ПустаяДата";

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

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

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

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

Чтобы «обнулить» дату в реквизите объекта, достаточно присвоить ему Дата(1,1,1) и записать объект. На форме пользователь очищает поле даты стандартной кнопкой очистки или клавишей, но программно поле ввода очищается через присвоение связанному реквизиту пустого значения.

// Очистка реквизита документа

ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

ДокументОбъект.ДатаПоставки = Дата(1,1,1);

ДокументОбъект.Записать();

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

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

Самая частая ошибка — сравнение даты с пустой строкой: Если Реквизит.Дата = "" Тогда. Такое условие никогда не выполнится, потому что типы разные, и логика молча работает неправильно. Вторая типичная проблема — вывод пустой даты в отчёт без обработки: пользователь видит «01.01.0001», что выглядит как сбой.

Для представления пустой даты пустой строкой используйте функцию Формат() с форматной строкой:

// Пустая дата отобразится как пустая строка

СтрокаДаты = Формат(Объект.ДатаОплаты, "ДЛФ=D");

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

Типичные ошибки
01
Сравнение даты с пустой строкой "" — условие никогда не срабатывает, логика молча ломается
02
Вывод пустой даты в отчёт без Формат() — пользователь видит 01.01.0001 вместо пустого поля
03
Сравнение реквизита составного типа с Дата(1,1,1) — при значении Неопределено проверка даёт неверный результат
04
Использование пустой даты как признака «без ограничения периода» в отборах — записи с реальной датой 01.01.0001 попадут в ту же группу

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

Проверить, что вы получили именно пустую дату, просто: выведите значение через Сообщить() или посмотрите в отладчике — отображается как 01.01.0001 0:00:00. Дополнительно убедитесь, что ЗначениеЗаполнено() для этого значения возвращает Ложь.

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

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

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

Значение в отладчике или сообщении
Норма

Отображается 01.01.0001 0:00:00

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

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

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

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

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

Возвращает Истина — дата не пустая

Отбор в запросе по пустой дате
Норма

Выбираются только записи с незаполненной датой

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

Пустой результат или ошибка типов — проверьте параметр

Итог

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

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

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

Чем пустая дата отличается от Неопределено?

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

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

Добавьте условие ГДЕ Реквизит.Дата > ДАТАВРЕМЯ(1,1,1) или неравенство <> ДАТАВРЕМЯ(1,1,1). Вариант со строгим сравнением «больше» обычно читабельнее и однозначно отсекает пустые значения.

Почему в отчёте вместо пустого поля выводится 01.01.0001?

Потому что пустая дата — реальное значение, и при прямом выводе платформа показывает его как есть. Примените Формат(Значение, "ДЛФ=D") в коде или настройте формат поля в макете/СКД, чтобы пустая дата отображалась пустой строкой.

Можно ли использовать пустую дату как границу периода «без ограничения»?

Технически да, но это неудобно и рискованно: любая реальная дата больше пустой, поэтому условие «Дата >= ПустаяДата» выберет всё. Для неограниченных отборов лучше передавать признак отдельным параметром и динамически формировать текст запроса или использовать СКД с необязательными отборами.

Работает ли Дата(1,1,1) в тонком клиенте и на сервере?

Да, функция Дата() и литералы дат доступны во всех контекстах исполнения встроенного языка: на сервере, в толстом и тонком клиенте, в веб-клиенте. Поведение пустой даты одинаково везде.

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

В стандартной обработке группового изменения реквизитов выберите нужный реквизит типа «Дата» и оставьте поле значения пустым — при выполнении реквизит получит значение 01.01.0001. Перед запуском на большом объёме проверьте действие на одной-двух записях и убедитесь, что очистка не нарушит проведение и обмены.