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

Разработка и Конфигурация · 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)).

bsl
Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1));
// В тексте запроса: ГДЕ Документ.ДатаОплаты = &ПустаяДата

Пустая дата в СКД и отборах динамических списков

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

При программной установке отбора динамического списка пустую дату передают как обычное значение. Это удобно, когда нужно показать только записи с незаполненной датой, например незакрытые заказы или документы без даты оплаты.

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаЗакрытия");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Дата(1, 1, 1);

ЭлементОтбора.Использование = Истина;

Помните, что в запросах СКД с периодическими регистрами сведений отсутствующая запись о периоде — это не пустая дата, а отсутствие строки. Фильтровать такие ситуации нужно через соединения и проверку на NULL, а не через сравнение с ДАТАВРЕМЯ(1,1,1).

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

Типичные ошибки
01
Сравнение даты с пустой строкой или нулём: условие Дата = "" всегда ложно или вызывает ошибку преобразования, правильно — Дата = Дата(1,1,1) или Не ЗначениеЗаполнено(Дата).
02
Игнорирование NULL в запросах с соединениями: условие Реквизит = &ПустаяДата отсекает NULL-строки, из-за чего часть данных теряется; нужно ЕСТЬNULL или дополнительное условие ЕСТЬ NULL.
03
Использование Дата("00010101") вместо конструктора: строковое преобразование зависит от региональных настроек и менее читаемо, чем Дата(1,1,1).
04
Ожидание, что очистка поля в форме запишет объект: изменение реквизита лишь ставит признак модифицированности, запись нужно выполнять явно.

Ещё одна распространённая проблема — отображение пустой даты в печатных формах и отчётах. Если вывести значение Дата(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 в соединениях и про необходимость записи объекта после изменения.