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