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