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

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

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

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

Пустая дата в 1С — это не отсутствие значения и не NULL, а вполне конкретная дата: 1 января года 1, то есть Дата(1,1,1), которая хранится как начало отсчёта календаря. Платформа использует её как значение по умолчанию для реквизитов типа «Дата», пока пользователь или код не заполнил поле. Понимание этого механизма важно, потому что проверка «дата не заполнена» строится именно на сравнении с этим значением.

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

Ниже разобраны все основные способы: литерал даты во встроенном языке, функция Дата(), пустая дата в запросах и СКД, работа с формами и проверка результата. Отдельно рассмотрены типичные ошибки, из-за которых «пустая» дата оказывается непустой.

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

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

Важно не путать пустую дату со значением Неопределено и с NULL в запросах. Неопределено означает отсутствие значения вообще и встречается, например, у необязательных параметров. NULL появляется в результатах запросов при левом соединении, когда соответствующей записи не нашлось. Пустая дата — третий, самостоятельный случай: значение есть, но оно равно началу календаря.

Практический вывод: если в отчёте или на форме вы видите дату «01.01.0001» — это почти всегда признак того, что поле не заполнили, а не того, что кто-то ввёл древнюю дату вручную. Такие записи стоит искать и либо заполнять, либо явно обрабатывать в коде.

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

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

Объект.ДатаОкончания = Дата(1, 1, 1); // пустая дата

Второй вариант — литерал даты в одинарных кавычках в формате ГГГГММДД. Для пустой даты это восемь цифр с ведущими нулями:

Объект.ДатаОкончания = '00010101'; // тот же результат

Оба способа эквивалентны и дают значение 01.01.0001 0:00:00. Литерал удобен, когда дата должна быть видна прямо в тексте модуля, а функция Дата() — когда значение собирается из переменных. Если реквизит составного типа и может хранить не только дату, присваивание пустой даты не сбрасывает тип значения: для полной очистки такого поля иногда правильнее присвоить Неопределено.

bsl
// Очистка реквизита документа
Объект.ДатаОплаты = Дата(1, 1, 1);

// Проверка на пустую дату
Если Объект.ДатаОплаты = Дата(1, 1, 1) Тогда
    Сообщить("Дата оплаты не указана");
КонецЕсли;

Очистка даты в форме и в реквизите объекта

Если дата редактируется на управляемой форме, достаточно присвоить реквизиту формы пустое значение — поле ввода само отобразит пустую строку. Пользователь вручную может очистить поле клавишей Delete или кнопкой очистки, и в реквизит запишется та же Дата(1,1,1).

Нюанс возникает с элементами формы, у которых включено свойство «АвтоотметкаНезаполненного» или настроена проверка заполнения у реквизита объекта: платформа не даст записать объект с пустой датой и выдаст сообщение об ошибке. В этом случае очистка возможна только после изменения свойства «Проверка заполнения» реквизита в конфигураторе — либо очистку нужно делать программно в обход проверки, что требует понимания последствий для учёта.

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

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

ГДЕ

Документ.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1)

Через параметр пустую дату передают так же, как любую другую: в коде формируют Дата(1,1,1) и устанавливают через Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1)). Это удобно, когда одно и то же условие встречается в запросе несколько раз.

Отдельная ситуация — соединения таблиц. Если при левом соединении для записи не нашлось пары, поле даты из правой таблицы вернёт NULL, а не пустую дату. Сравнение = ДАТАВРЕМЯ(1,1,1) для такого поля не сработает: NULL ни с чем не сравнивается. Нужно либо проверять ЕСТЬ NULL, либо оборачивать поле в ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)).

Проверка: заполнена дата или пустая

Классическая проверка — прямое сравнение с Дата(1,1,1). Она работает быстро и однозначно, если тип значения точно «Дата»:

Если Значение = Дата(1, 1, 1) Тогда

// дата пустая

КонецЕсли;

Более универсальный вариант — функция ЗначениеЗаполнено(). Она возвращает Ложь не только для пустой даты, но и для Неопределено, пустой строки и пустых ссылок, поэтому подходит для реквизитов составного типа. Обратная проверка — НЕ ЗначениеЗаполнено(Дата) — читается как «дата не заполнена».

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

Сравнение с Дата(1,1,1)

Быстро и точно, но только если тип значения гарантированно «Дата». Для Неопределено даст неверный результат.

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

Универсально: ловит пустую дату, Неопределено и пустые ссылки. Подходит для составных типов, но чуть медленнее.

ДАТАВРЕМЯ(1,1,1) в запросе

Единственный способ внутри запроса. Для полей из соединений дополнительно нужна обработка NULL.

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

В отборе динамического списка или в настройках отчёта на СКД пустая дата задаётся через значение сравнения: в поле значения выбирается тип «Дата» и оставляется незаполненным — платформа подставит 01.01.0001. Вид сравнения обычно «Равно».

Программно отбор устанавливается через элементы отбора компоновки данных. В правое значение элемента отбора передаётся та же Дата(1,1,1):

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

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

Если нужно показать наоборот все записи, где дата заполнена, используйте вид сравнения «Не равно» с тем же значением. Это надёжнее, чем «Больше», потому что не зависит от предположений о минимально возможной реальной дате в учёте.

Как отобрать документы с пустой датой в динамическом списке
  1. 1
    Откройте настройку списка и добавьте элемент отбора по нужному полю даты
  2. 2
    Установите вид сравнения «Равно»
  3. 3
    В поле значения укажите пустую дату (01.01.0001)
  4. 4
    Включите использование отбора и проверьте, что в списке остались только документы без даты
  5. 5
    Для обратной задачи смените вид сравнения на «Не равно»

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

Самая частая ошибка — сравнение даты с пустой строкой или с нулём. Выражение Дата = "" не вызовет ошибки компиляции, но всегда вернёт Ложь, и проверка молча перестанет работать. Вторая распространённая проблема — попытка «очистить» дату присваиванием ТекущаяДата() с последующим условием, которое никогда не сработает, потому что логика проверки строилась на пустом значении.

Третья группа ошибок связана с запросами: сравнение с NULL вместо пустой даты, забытый ЕСТЬNULL при соединениях и передача в параметр строки вместо даты. Все они приводят к тому, что запрос возвращает не те записи, и дефект обнаруживается только на реальных данных.

Типичные ошибки
01
Сравнение даты с пустой строкой "" — условие всегда ложно, проверка молча не работает
02
Сравнение поля из левого соединения с ДАТАВРЕМЯ(1,1,1) без ЕСТЬNULL — записи с NULL теряются
03
Присваивание Неопределено реквизиту строго типа «Дата» — ошибка несоответствия типов
04
Попытка очистить обязательный реквизит — платформа блокирует запись из-за проверки заполнения
05
Использование «Больше Дата(1,1,1)» вместо «Не равно» — лишние предположения о данных

Как проверить результат и не сломать данные

После программной очистки дат убедитесь, что изменились именно те записи, которые планировалось. Простой способ — запрос с подсчётом количества записей до и после обработки, сгруппированный по признаку «дата пустая / заполнена». Если обработка массовая, сначала выполните её в транзакции с откатом или на копии базы.

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

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

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

Значение реквизита после очистки
Норма

Отображается пустое поле или 01.01.0001

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

Стоит текущая дата или произвольное значение

Запрос с условием на пустую дату
Норма

Возвращает только записи без даты

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

Пустой результат при заведомо существующих записях — проверьте NULL

Запись документа после очистки
Норма

Документ записывается без ошибок

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

Сообщение о незаполненном реквизите — включена проверка заполнения

FAQ: частые вопросы о пустой дате в 1С

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

Пустая дата — это конкретное значение 01.01.0001 типа «Дата», а Неопределено означает отсутствие значения как такового. Реквизиту строгого типа «Дата» нельзя присвоить Неопределено, а реквизиту составного типа — можно. Проверки для них разные: сравнение с Дата(1,1,1) для первого случая и сравнение с Неопределено для второго.

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

Создайте значение в коде — Дата(1, 1, 1) — и передайте его через Запрос.УстановитьПараметр("ИмяПараметра", Дата(1, 1, 1)). В тексте запроса параметр используется как обычно: ГДЕ Поле = &ИмяПараметра. Альтернатива без параметра — литерал ДАТАВРЕМЯ(1, 1, 1) прямо в тексте запроса.

Почему условие «Поле = ДАТАВРЕМЯ(1,1,1)» не находит записи?

Скорее всего, поле приходит из левого соединения и содержит NULL, а NULL не равен никакому значению, включая пустую дату. Оберните поле в ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)) или добавьте условие «Поле ЕСТЬ NULL» через ИЛИ.

Можно ли очистить обязательную для заполнения дату?

Интерактивно — нет: платформа не даст записать объект и покажет сообщение о незаполненном реквизите. Чтобы очистка стала возможной, нужно изменить свойство «Проверка заполнения» реквизита в конфигураторе. Делать это стоит осознанно: обязательность поля обычно введена ради корректности учёта или отчётности.

Как в отчёте на СКД показать только записи с заполненной датой?

Добавьте в отбор условие по полю даты с видом сравнения «Не равно» и значением 01.01.0001. Это надёжнее, чем «Больше» с той же датой, потому что не опирается на предположения о минимальной реальной дате и корректно работает с любыми данными.

Итог

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

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