Разработка и Конфигурация · 9 мин
Как сделать пустую дату в 1С
Как задать пустую дату в 1С: конструктор Дата(1,1,1), проверка на пустоту, пустая дата в запросах и на форме. Примеры кода и типичные ошибки.
Пустая дата в 1С — это не отсутствие значения и не NULL, а вполне конкретная дата: 1 января 0001 года, то есть Дата(1,1,1). Платформа использует её как значение по умолчанию для реквизитов типа «Дата», пока пользователь или код не заполнил поле. Понимание этого механизма важно, потому что сравнение с пустой датой, проверка заполненности и выборка в запросах строятся именно на этом значении.
Задача «сделать пустую дату» возникает в нескольких ситуациях: нужно очистить реквизит документа или справочника, проверить, заполнено ли поле, передать пустую дату параметром в запрос или отбор, а также корректно обработать поле ввода на форме. Во всех случаях используется одно и то же значение, но синтаксис и подходы различаются в зависимости от контекста — встроенный язык, запрос или управляемая форма.
Что такое пустая дата в 1С и чем она отличается от NULL
В платформе 1С тип «Дата» не может быть «ничем». Если реквизит объявлен с типом «Дата» и не заполнен, он хранит значение 01.01.0001 00:00:00. Это называется значением по умолчанию типа. Аналогично пустое число — это 0, а пустая строка — строка нулевой длины.
NULL — совсем другая сущность, она встречается только в запросах при соединениях таблиц, когда для записи не нашлось пары. Если реквизит составного типа допускает NULL или результат левого соединения не содержит данных, значение будет NULL, а не пустой датой. Смешивание этих понятий — частая причина ошибок: проверка Дата = Дата(1,1,1) не сработает для NULL, и наоборот.
Как присвоить пустую дату в коде
Самый прямой способ — использовать конструктор даты с параметрами год, месяц, день:
Объект.ДатаОкончания = Дата(1, 1, 1);
Альтернативный вариант — строковый литерал в формате «ГГГГММДДччммсс»:
Объект.ДатаОкончания = Дата("00010101");
// или с временем
Объект.ДатаОкончания = Дата("00010101000000");
Оба способа дают идентичный результат. Строковый вариант удобен, когда нужно явно показать состав даты, а числовой конструктор читается быстрее. Если реквизит имеет составной тип (например, «Дата» и «Строка»), присвоение Дата(1,1,1) установит именно дату, а присвоение Неопределено сбросит значение в «ничего не выбрано» — это разные состояния.
// Очистка реквизита типа Дата
Документ.ДатаОплаты = Дата(1, 1, 1);
// Проверка на пустоту
Если Документ.ДатаОплаты = Дата(1, 1, 1) Тогда
Сообщить("Дата оплаты не указана");
КонецЕсли;Как проверить, что дата пустая
Универсальный способ — функция ЗначениеЗаполнено(). Она возвращает Ложь для пустой даты, пустой строки, нуля, Неопределено и пустых ссылок:
Если НЕ ЗначениеЗаполнено(Объект.ДатаОтгрузки) Тогда
Сообщить("Заполните дату отгрузки");
КонецЕсли;
Если нужно отличить именно пустую дату от других пустых значений (например, в составном реквизите), используйте прямое сравнение:
Если Объект.ДатаОтгрузки = Дата(1, 1, 1) Тогда
// именно пустая дата, а не NULL и не Неопределено
КонецЕсли;
Для проверки на NULL в результатах запроса применяйте ЕСТЬ NULL или функцию ЕСТЬNULL(). Помните: ЗначениеЗаполнено(NULL) вернёт Ложь, поэтому в обработке выборки из запроса с соединениями сначала отсекайте NULL, иначе логика проверки даты может сработать не так, как ожидается.
Пустая дата в запросах
В языке запросов пустая дата записывается литералом ДАТАВРЕМЯ(1,1,1). Типичное применение — отбор документов без даты оплаты или подстановка пустой даты в виртуальную таблицу:
ВЫБРАТЬ
Заказы.Ссылка
ИЗ
Документ.ЗаказПокупателя КАК Заказы
ГДЕ
Заказы.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1)
Если реквизит может содержать NULL (например, при левом соединении), комбинируйте условия:
ГДЕ
ЕСТЬNULL(Оплаты.ДатаОплаты, ДАТАВРЕМЯ(1,1,1)) = ДАТАВРЕМЯ(1,1,1)
При передаче пустой даты параметром из кода используйте то же значение:
Запрос.УстановитьПараметр("ПустаяДата", Дата(1, 1, 1));
В схеме компоновки данных и отборах динамических списков пустая дата задаётся аналогично — через параметр со значением Дата(1,1,1). Если оставить параметр неустановленным, СКД может выдать ошибку или применить значение по умолчанию, что исказит выборку.
Очистка даты на форме и в пользовательском режиме
В режиме предприятия пользователь очищает поле даты клавишей Delete или Backspace в поле ввода либо кнопкой очистки (крестик) в управляемых формах. Визуально поле становится пустым, но фактически реквизит получает значение 01.01.0001 — это нормальное поведение платформы.
При программной работе с формой достаточно присвоить реквизиту Дата(1,1,1) — поле ввода автоматически отобразит пустое значение. Отдельно «очищать» элемент формы не требуется: элемент управления связан с данными и обновится сам.
Если поле даты обязательно для заполнения, но бизнес-логика допускает его отсутствие на промежуточных этапах, используйте свойство «Проверка заполнения» реквизита со значением «Выдавать ошибку» только там, где дата действительно критична. Иначе пользователи будут вынуждены вводить фиктивные даты, что хуже, чем честная пустая.
Как проверить результат
Отображается 01.01.0001 0:00:00
NULL, Неопределено или случайная дата
Поле визуально пустое
Отображается 01.01.0001 или старая дата
Запись попадает в результат
Запись не найдена — вероятно, значение NULL или дата не очищена
Пустая дата в типовых документах и регистрах
В типовых конфигурациях пустые даты часто встречаются в регистрах сведений с открытым периодом действия: например, «дата окончания» у действующего назначения или цены без срока. Там пустая дата означает «бессрочно». При разработке собственных регистров принято то же соглашение — не заполнять дату окончания, пока период не закрыт.
При обмене данными и выгрузке в XML пустая дата сериализуется как 0001-01-01T00:00:00. Некоторые внешние системы не принимают год 0001 — при интеграции проверяйте, как принимающая сторона обрабатывает такое значение, и при необходимости заменяйте его на NULL или пропускайте поле в выгрузке.
При выгрузке данных в Excel или CSV пустая дата 01.01.0001 часто превращается в странное значение или ошибку, так как Excel не поддерживает даты раньше 1900 года. Перед выгрузкой заменяйте пустые даты на пустую строку — это избавит от вопросов пользователей.
Когда пустую дату использовать нельзя
Есть ситуации, где пустая дата как маркер «не заполнено» не подходит. В измерениях периодических регистров сведений дата обязательна и не может быть пустой. В реквизитах, участвующих в уникальных индексах или критериях отбора, пустая дата может привести к неожиданным дублям в выборках.
Если требуется хранить признак «дата неизвестна» отдельно от самой даты, надёжнее добавить булев реквизит «ДатаУточняется» или использовать составной тип с возможностью NULL. Это делает логику явной и упрощает запросы.
Что важно запомнить
Пустая дата в 1С — это Дата(1,1,1), значение по умолчанию типа. В коде присваивайте Дата(1,1,1), в запросах используйте ДАТАВРЕМЯ(1,1,1), для проверки применяйте ЗначениеЗаполнено(). Не путайте пустую дату с NULL в запросах и учитывайте особенности при обмене с внешними системами.
Частые вопросы о пустой дате в 1С
Чем пустая дата отличается от Неопределено?
Неопределено — это отсутствие значения любого типа, а пустая дата — конкретное значение 01.01.0001 типа «Дата». Реквизиту строгого типа «Дата» нельзя присвоить Неопределено, а составному реквизиту — можно, и тогда в запросах он будет обрабатываться иначе.
Почему условие Дата = Дата(1,1,1) не находит записи в запросе?
Скорее всего, поле содержит NULL — например, из-за левого соединения или составного типа. Добавьте в условие проверку ЕСТЬ NULL или оберните поле функцией ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)).
Как пользователю очистить дату в документе?
Установите курсор в поле даты и нажмите Delete или кнопку очистки (крестик) справа от поля. Поле станет визуально пустым, а реквизит получит значение 01.01.0001.
Можно ли хранить в реквизите типа «Дата» только дату без времени?
Да, для этого в свойствах реквизита установите состав даты «Дата» вместо «Дата и время». Тогда время всегда будет 00:00:00, а пустое значение останется равным Дата(1,1,1).
Как проверить пустую дату в СКД?
В тексте запроса набора данных используйте литерал ДАТАВРЕМЯ(1,1,1). Если проверка нужна в отборе, передайте параметр со значением Дата(1,1,1) из кода или задайте его в настройках отчёта.
Что выгружается в XML вместо пустой даты?
При стандартной сериализации пустая дата выгружается как 0001-01-01T00:00:00. Если принимающая система не поддерживает такое значение, перед выгрузкой заменяйте пустые даты на пустую строку или пропускайте элемент.