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