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