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

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

Как проверить на пустую дату в 1С 8

Как проверить реквизит на пустую дату в 1С 8: функция ЗначениеЗаполнено, сравнение с '00010101', проверка в запросе и на форме. Примеры кода и типичные ошибки.

Пустая дата в 1С 8 — это не отсутствие значения, а вполне конкретное значение: 1 января года 1, то есть '00010101000000'. Именно поэтому проверка «дата заполнена или нет» сводится к сравнению с этой константой либо к использованию встроенной функции ЗначениеЗаполнено(). Понимание этого механизма избавляет от большинства ошибок, когда условие вроде «Если Дата = Неопределено» молча не срабатывает.

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

Что такое пустая дата в 1С 8

В платформе 1С:Предприятие 8 у типа «Дата» нет значения NULL и нет Неопределено в качестве «незаполненного» состояния. Когда реквизит типа «Дата» не заполнен, он хранит начало отсчёта — 1 января 0001 года, 0 часов 0 минут 0 секунд. В коде это значение записывается литералом '00010101' или '00010101000000' — обе формы эквивалентны.

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

Проверка через ЗначениеЗаполнено()

Самый универсальный и читаемый способ — встроенная функция ЗначениеЗаполнено(). Для даты она возвращает Ложь, если значение равно '00010101000000', и Истина для любой реальной даты. Функция одинаково работает для всех типов, поэтому код получается единообразным.

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

Сообщить("Дата оплаты не указана");

КонецЕсли;

Обратите внимание на логическое НЕ: сама функция отвечает на вопрос «заполнено ли», поэтому для проверки пустоты её инвертируют. Частая ошибка — забыть НЕ и получить противоположное поведение условия.

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

Сравнение с литералом '00010101'

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

Если ДатаОтгрузки = '00010101' Тогда

// дата не заполнена

КонецЕсли;

Если ДатаОтгрузки <> '00010101' Тогда

// дата заполнена

КонецЕсли;

Литерал даты в 1С записывается в одинарных кавычках в формате ГГГГММДДччммсс. Допустимы сокращённые формы: '00010101' и '00010101000000' — одно и то же значение. Этот способ чуть быстрее функции и наглядно показывает, с чем именно идёт сравнение, но менее универсален: если тип реквизита изменится, сравнение с датой-литералом может дать неожиданный результат, а ЗначениеЗаполнено() продолжит работать.

Сравнение способов проверки

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

Универсально для любых типов, устойчиво к изменению типа реквизита. Рекомендуется по умолчанию.

Дата = '00010101'

Наглядно и быстро, но привязано к типу Дата. Подходит, когда тип гарантирован.

Дата = Дата(1,1,1)

Редкий вариант через конструктор, аналогичен литералу, но многословнее.

Проверка пустой даты в запросе

В языке запросов 1С литерал пустой даты записывается через функцию ДАТАВРЕМЯ(1,1,1) или полную форму ДАТАВРЕМЯ(1,1,1,0,0,0). Условие в секции ГДЕ выглядит так:

ВЫБРАТЬ

Реализация.Ссылка,

Реализация.ДатаОплаты

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1)

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

В запросе также доступна функция ЗначениеЗаполнено? — нет, в языке запросов её нет, там используется только сравнение с ДАТАВРЕМЯ(1,1,1) или, для ссылочных типов, ЗНАЧЕНИЕ() с пустой ссылкой. Не путайте контексты: ЗначениеЗаполнено() — функция встроенного языка, а не запросов.

bsl
Если НЕ ЗначениеЗаполнено(Объект.ДатаОплаты) Тогда
    Сообщить("Дата оплаты не заполнена");
КонецЕсли;

// В запросе:
// ГДЕ Док.ДатаОплаты = ДАТАВРЕМЯ(1,1,1)

Проверка на форме и в типовых механизмах

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

Если нужна нестандартная логика (например, дата обязательна только при определённом статусе), используйте ОбработкаПроверкиЗаполнения:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если Статус = Перечисления.Статусы.Оплачен

И НЕ ЗначениеЗаполнено(ДатаОплаты) Тогда

Отказ = Истина;

Сообщить("Укажите дату оплаты");

КонецЕсли;

КонецПроцедуры

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

Типичные ошибки и подводные камни

Самая распространённая ошибка — сравнение даты с Неопределено или с пустой строкой. Такое условие никогда не выполнится, и код молча пройдёт мимо. Вторая частая проблема — проверка через Строка(Дата) = "": преобразование пустой даты в строку даёт "01.01.0001 0:00:00", а не пустую строку, поэтому условие снова не сработает.

Третий нюанс — реквизиты составного типа. Если поле может хранить «Дата или Строка», значение по умолчанию может быть Неопределено, а не пустая дата. В этом случае надёжнее ЗначениеЗаполнено(), которая обрабатывает оба варианта.

Типичные ошибки
01
Сравнение Дата = Неопределено — всегда Ложь, проверка не работает
02
Проверка через Строка(Дата) = "" — пустая дата преобразуется в '01.01.0001 0:00:00', а не в пустую строку
03
Забытое НЕ перед ЗначениеЗаполнено — логика условия переворачивается
04
Использование ЗначениеЗаполнено в тексте запроса — в языке запросов этой функции нет, нужна ДАТАВРЕМЯ(1,1,1)

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

Проверьте поведение на трёх наборах данных: документ с пустой датой, документ с заполненной датой и, если тип составной, с Неопределено. Условие должно срабатывать только в первом случае. Быстрый способ отладки — вывести значение и результат функции:

Сообщить("Значение: '" + ДатаОплаты + "', заполнено: " + ЗначениеЗаполнено(ДатаОплаты));

Для запроса удобно временно убрать условие ГДЕ и вывести поле даты в результат, чтобы глазами увидеть, какие записи содержат 01.01.0001. Это исключает ситуацию, когда отбор вроде бы написан верно, но данных с пустой датой в выборке просто нет.

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

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

Реакция на пустую дату
Норма

Условие срабатывает, выводится сообщение или запись попадает в выборку

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

Условие игнорируется — вероятно, сравнение с Неопределено или пустой строкой

Реакция на заполненную дату
Норма

Условие не срабатывает, документ проходит проверку

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

Условие срабатывает на любой дате — забыто НЕ или перепутан знак сравнения

Запрос с отбором
Норма

В результат попадают только записи с Дата = 01.01.0001

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

Пустой результат при заведомо существующих данных — проверьте синтаксис ДАТАВРЕМЯ(1,1,1)

FAQ

Чему равна пустая дата в 1С 8?

Значению 01.01.0001 0:00:00. В коде она записывается литералом '00010101' или '00010101000000', в запросе — ДАТАВРЕМЯ(1,1,1).

Почему условие «Дата = Неопределено» не работает?

Тип Дата не принимает значение Неопределено: незаполненный реквизит хранит 01.01.0001. Сравнение с Неопределено всегда даёт Ложь. Используйте НЕ ЗначениеЗаполнено(Дата) или Дата = '00010101'.

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

Условием в секции ГДЕ: Реквизит = ДАТАВРЕМЯ(1,1,1) для пустых значений и Реквизит <> ДАТАВРЕМЯ(1,1,1) для заполненных. Функции ЗначениеЗаполнено в языке запросов нет.

Что лучше: ЗначениеЗаполнено() или сравнение с '00010101'?

ЗначениеЗаполнено() универсальнее: она корректно работает с любым типом, включая составные реквизиты и Неопределено. Прямое сравнение с литералом чуть нагляднее, но привязано к типу Дата.

Как запретить запись документа с пустой датой без кода?

Установите у реквизита в конфигураторе свойство «Проверка заполнения» в значение «Выдавать ошибку». Платформа сама заблокирует запись и подсветит незаполненное поле.

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

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

Итог

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

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