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

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

Как написать пустую дату в 1С

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

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

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

Что такое пустая дата в 1С и чем она отличается от Неопределено

Тип Дата в 1С не может быть «ничем». У любой переменной этого типа всегда есть значение, и значение по умолчанию — Дата(1,1,1), которое в строковом виде выглядит как '00010101000000'. Именно это значение платформа считает «пустым» при проверках заполненности.

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

Как задать пустую дату в программном коде

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

РеквизитДата = Дата(1, 1, 1); // пустая дата

// Эквивалент через строковый литерал:

РеквизитДата = '00010101000000';

Литерал в одинарных кавычках '00010101' — тоже корректный способ: платформа распознаёт 14-значную (или 8-значную, без времени) последовательность цифр как дату. Обратите внимание: писать Дата(0, 0, 0) нельзя — будет ошибка, минимальные допустимые компоненты — единицы.

Если нужно «очистить» реквизит объекта, достаточно присвоить ему пустую дату. Для реквизитов составного типа допустимо и Неопределено, но поведение при этом зависит от конфигурации типов, поэтому предсказуемее использовать именно Дата(1,1,1).

1c
Объект.ДатаОкончания = Дата(1, 1, 1);
Если Не ЗначениеЗаполнено(Объект.ДатаОкончания) Тогда
    Сообщить("Дата окончания очищена");
КонецЕсли;

Как проверить, что дата пустая

Универсальный и рекомендуемый способ — функция ЗначениеЗаполнено(). Она возвращает Ложь для пустой даты, пустой строки, нуля, пустой ссылки и Неопределено, поэтому подходит для большинства проверок перед записью или проведением:

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

Предупреждение("Укажите срок оплаты");

КонецЕсли;

Альтернатива — прямое сравнение: Если ДатаРеквизита = '00010101' Тогда .... Такой вариант работает быстрее в массовых циклах и точнее, когда нужно отличить именно пустую дату от других «пустых» значений в составном типе. Но он хрупче к чтению и не сработает, если в переменной оказалось Неопределено — сравнение разнотипных значений даст Ложь, и проверка «молча» не выполнится.

Способы проверки пустой даты

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

Универсально, безопасно для Неопределено и составных типов. Минус — не отличает пустую дату от других пустых значений.

Сравнение с '00010101'

Точно выявляет именно пустую дату, удобно в циклах. Минус — не сработает, если в переменной Неопределено или другой тип.

Формат() с шаблоном

Подходит только для вывода на экран, не для логики: Формат(Дата, "ДФ=yyyy") у пустой даты вернёт '0001'.

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

В языке запросов конструктор Дата() недоступен — вместо него используется функция ДАТАВРЕМЯ(год, месяц, день). Пустая дата в условии записывается так:

ВЫБРАТЬ

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

ИЗ

Документ.ЗаказКлиента КАК Заказы

ГДЕ

Заказы.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1)

Частая задача — выбрать документы, где дата либо заполнена, либо попадает в период. Типичная ошибка — написать условие ДатаОтгрузки МЕЖДУ &Начало И &Конец и забыть, что пустая дата меньше любой реальной, поэтому такие строки просто выпадут из выборки. Если это нежелательно, добавьте условие через ИЛИ:

ГДЕ

(Заказы.ДатаОтгрузки МЕЖДУ &Начало И &Конец

ИЛИ Заказы.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1))

При передаче пустой даты параметром из кода достаточно Запрос.УстановитьПараметр("Дата", Дата(1,1,1)); — в запросе она корректно сравнится с ДАТАВРЕМЯ(1,1,1).

Пустая дата в форме и при вводе пользователем

В управляемой форме поле с типом «Дата» пользователь очищает клавишей Delete или Backspace, выделив содержимое, либо кнопкой очистки (крестик) у поля. После этого в реквизите оказывается Дата(1,1,1), а поле отображается пустым — платформа сама скрывает «01.01.0001» как нечитаемое значение.

Если в форме пустая дата всё же показывается как «01.01.0001 0:00:00», причина обычно в свойствах поля: проверьте формат отображения или то, что поле связано с реквизитом составного типа, где платформа не уверена в типе значения. Для реквизита объекта с типом «Дата» пустое значение отображается пустым без дополнительных настроек.

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

Как очистить дату в документе
  1. 1
    Откройте документ и найдите поле с датой
  2. 2
    Выделите содержимое поля и нажмите Delete или кнопку очистки
  3. 3
    Убедитесь, что поле отображается пустым, а не '01.01.0001'
  4. 4
    Запишите документ и проверьте поведение отчётов, использующих эту дату

Типичные ошибки и ловушки

Первая ловушка — арифметика с пустой датой. Выражение вида Дата(1,1,1) - 86400 вызовет ошибку переполнения, потому что «минус один день» от начала отсчёта не существует. Перед вычислениями всегда проверяйте заполненность.

Вторая — сортировка и группировка. Пустые даты в запросе идут раньше всех остальных, и в отчётах с итогами по периодам они образуют отдельную группу «без даты», которую пользователи воспринимают как сбой. Если такие записи возможны, обрабатывайте их явно через ВЫБОР КОГДА ... ТОГДА или исключайте условием.

Третья — обмен данными. При выгрузке в XML или JSON пустая дата может сериализоваться как «0001-01-01T00:00:00», и принимающая система (например, сайт или другая учётная программа) интерпретирует её как реальную дату. В обменах пустые даты лучше преобразовывать в пустую строку или отсутствующий элемент.

Типичные ошибки
01
Сравнение даты с Неопределено вместо проверки на '00010101' — условие никогда не сработает для типизированного реквизита
02
Арифметика с пустой датой без проверки — ошибка переполнения при вычитании
03
Фильтр периода 'МЕЖДУ' без учёта пустых дат — документы без даты теряются из отчёта
04
Выгрузка пустой даты в обмен как есть — внешняя система видит 01.01.0001 как реальную дату

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

После изменения кода или очистки данных убедитесь, что пустая дата ведёт себя ожидаемо во всех местах использования. Минимальный набор проверок: открытие формы объекта, запись, выполнение запроса с условием по этой дате и формирование связанного отчёта.

Для массовой очистки реквизитов в базе сначала выполните выборку запросом с условием = ДАТАВРЕМЯ(1,1,1), чтобы оценить количество затрагиваемых записей. Изменения делайте в транзакции и на копии базы, если записей много.

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

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

Отображение в форме
Норма

Поле визуально пустое

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

Показывается '01.01.0001' — проблема с типом реквизита или форматом

Запрос с условием = ДАТАВРЕМЯ(1,1,1)
Норма

Запись находится выборкой

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

Запись не находится — значит, там Неопределено или другой тип

ЗначениеЗаполнено() в отладчике
Норма

Возвращает Ложь для очищенного поля

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

Возвращает Истина — дата не очищена

Итог

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

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

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

Чем пустая дата отличается от NULL в запросе?

NULL возникает при левых соединениях и в необязательных реквизитах — это отсутствие значения на уровне СУБД. Пустая дата (ДАТАВРЕМЯ(1,1,1)) — конкретное значение. Сравнение NULL = ДАТАВРЕМЯ(1,1,1) даст не «Истина», а NULL, поэтому проверяйте через ЕСТЬ NULL отдельно.

Можно ли запретить пользователю оставлять дату пустой?

Да. Для реквизита объекта установите свойство «Проверка заполнения» в значение «Выдавать ошибку» — платформа не даст записать объект с пустой датой. Дополнительно можно добавить свою проверку в обработчике ОбработкаПроверкиЗаполнения.

Как вывести пустую дату в печатной форме как прочерк?

Используйте функцию Формат с параметром пустого представления: Формат(ДатаРеквизита, "ДЛФ=D; ДП='—'"). Параметр ДП задаёт текст, который подставится вместо пустой даты.

Почему запрос не находит документы с пустой датой, хотя условие верное?

Чаще всего реквизит имеет составной тип, и в нём хранится Неопределено или NULL вместо пустой даты. Проверьте значение в отладчике и добавьте в условие обработку NULL: ИЛИ Реквизит ЕСТЬ NULL.

Как сравнить пустую дату с текущей без ошибок?

Сначала проверьте заполненность: Если ЗначениеЗаполнено(ДатаРеквизита) И ДатаРеквизита < ТекущаяДатаСеанса() Тогда ... Прямое сравнение пустой даты допустимо (она просто меньше любой реальной), но явная проверка делает логику понятнее и защищает от Неопределено.