Разработка и Конфигурация · 11 мин
Как проверить дату на пустую в 1С
Как проверить дату на пустую в 1С: сравнение с '00010101000000', функция ЗначениеЗаполнено(), проверка в запросе, в СКД и на форме. Примеры кода и типичные ошибки.
Проверка даты на пустое значение — одна из самых частых задач при разработке и доработке конфигураций 1С. Ошибка в этой проверке приводит к неверным отборам в отчётах, ложным срабатываниям условий в проведении документов и некорректным данным в обменах. При этом у разработчиков есть несколько рабочих способов, и выбор зависит от контекста: модуль объекта, запрос, схема компоновки данных или управляемая форма.
Ключевой момент, который нужно понимать: пустая дата в 1С — это не NULL и не пустая строка, а конкретное значение «01.01.0001 00:00:00», то есть начало календаря. Поэтому проверка сводится либо к сравнению с литералом этой даты, либо к использованию встроенной функции ЗначениеЗаполнено(), которая корректно обрабатывает все типы, включая дату.
Ниже разобраны все основные способы проверки с примерами кода, таблицей выбора подходящего метода, типичными ошибками и ответами на частые вопросы.
Что считается пустой датой в 1С
В платформе 1С тип «Дата» не может быть неопределённым: у переменной этого типа всегда есть значение. Если реквизиту или переменной не присвоили дату, она равна началу календаря — 1 января 0001 года, 0 часов 0 минут 0 секунд. Именно это значение и называется «пустой датой».
Важно отличать пустую дату от значения NULL. NULL появляется только в результатах запросов — например, при левом соединении, когда подходящей записи не нашлось, или при обращении к реквизиту через точку от NULL-ссылки. NULL и пустая дата проверяются по-разному, и путать их — распространённая ошибка.
Также пустая дата отличается от Неопределено — значения, которое возникает, например, у переменных без присвоенного типа или у реквизитов составного типа, не заполненных вовсе. Перед сравнением с датой значение Неопределено стоит обрабатывать отдельно, иначе сравнение может дать неожиданный результат.
Проверка в коде модуля: сравнение с пустой датой
Прямой способ — сравнить значение с литералом пустой даты. Литерал записывается в одинарных кавычках в формате ГГГГММДДччммсс: '00010101000000'. Время можно опускать — '00010101' эквивалентно полной записи.
Если Документ.ДатаОтгрузки = '00010101' Тогда
Сообщить("Дата отгрузки не указана");
КонецЕсли;
Более читаемый вариант — использовать функцию Дата() с явными параметрами. Такой код проще воспринимается при ревью и не требует считать нули в строковом литерале:
Если Заказ.ДатаОплаты = Дата(1, 1, 1) Тогда
// дата оплаты не заполнена
КонецЕсли;
Обратное условие — проверка, что дата заполнена, — записывается через оператор неравенства:
Если Счет.ДатаПлатежа <> '00010101' Тогда
// дата указана, можно использовать в расчётах
КонецЕсли;
Учтите тонкость: если дата введена пользователем как 01.01.0001 осознанно (что практически не встречается в реальном учёте), система сочтёт её пустой. В типовых конфигурациях это поведение считается нормой.
Проверка через функцию ЗначениеЗаполнено()
Функция ЗначениеЗаполнено() — универсальный способ, рекомендуемый стандартами разработки 1С. Она корректно работает со всеми типами: для даты возвращает Ложь, если значение равно началу календаря; для строки — если строка пустая; для ссылки — если ссылка пустая.
Если Не ЗначениеЗаполнено(Документ.ДатаОтгрузки) Тогда
ТекстСообщения = НСтр("ru = 'Не заполнена дата отгрузки'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
Главное преимущество функции — устойчивость к составным типам. Если реквизит имеет составной тип и в нём оказалось Неопределено или значение другого типа, ЗначениеЗаполнено() всё равно вернёт корректный результат, тогда как прямое сравнение с '00010101' может сработать непредсказуемо.
Недостаток — чуть меньшая наглядность для новичка: по коду не видно, что проверяется именно дата. Поэтому в местах, где тип строго известен, сравнение с Дата(1,1,1) иногда предпочтительнее по читаемости.
Сравнение способов проверки
Подходит, когда тип значения точно «Дата». Наглядно, но не работает корректно с составными типами и NULL.
Универсальный вариант для любых типов, включая составные. Рекомендуется стандартами разработки. Не применима в тексте запроса.
Единственный вариант внутри запроса и СКД. Различает пустую дату и NULL.
Проверка пустой даты в запросе
В языке запросов функция ЗначениеЗаполнено() недоступна — используется сравнение с конструктором даты:
ВЫБРАТЬ
Заказы.Ссылка КАК Заказ
ИЗ
Документ.ЗаказПокупателя КАК Заказы
ГДЕ
Заказы.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1)
Если нужно отобрать только документы с заполненной датой, условие инвертируется:
ГДЕ
Заказы.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1)
Проверка NULL в запросе
Когда поле может принимать NULL (левое соединение, обращение через точку к реквизиту необязательной ссылки), сравнение с ДАТАВРЕМЯ(1,1,1) не сработает: NULL не равен ничему, даже самому себе. Для таких случаев используется оператор ЕСТЬ NULL:
ВЫБРАТЬ
Заказы.Ссылка,
ЕСТЬNULL(Отгрузки.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаОтгрузки
ИЗ
Документ.ЗаказПокупателя КАК Заказы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Отгрузки КАК Отгрузки
ПО Заказы.Ссылка = Отгрузки.Заказ
ГДЕ
Отгрузки.Дата ЕСТЬ NULL
Надёжная практика — оборачивать поле в ЕСТЬNULL() с подстановкой пустой даты, чтобы дальше в выборке работать только с одним «пустым» представлением.
Проверка в СКД и в форме
Отбор в схеме компоновки данных
В отборах СКД пустая дата задаётся как значение типа «Дата» со значением 01.01.0001. В пользовательских настройках отчёта достаточно выбрать вид сравнения «Равно» и оставить поле даты незаполненным — платформа сама подставит начало календаря. В запросе СКД действуют те же правила, что и в обычных запросах: ДАТАВРЕМЯ(1,1,1) и ЕСТЬ NULL.
Проверка на управляемой форме
На форме проверка выполняется теми же средствами встроенного языка — в обработчиках ПередЗаписью, ПриЗаписи или в команде. Типовой пример валидации перед записью:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если Не ЗначениеЗаполнено(Объект.ДатаОтгрузки) Тогда
ПоказатьПредупреждение(, "Укажите дату отгрузки");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Если поле обязательное, правильнее не писать проверки вручную, а включить у реквизита свойство «Проверка заполнения» — «Выдавать ошибку». Платформа сама откажет в записи при пустой дате, и код валидации не потребуется.
- 1Определите контекст: модуль, запрос, СКД или форма
- 2Уточните тип значения: строгая дата, составной тип или возможный NULL
- 3В коде модуля используйте ЗначениеЗаполнено() или сравнение с Дата(1,1,1)
- 4В запросе используйте ДАТАВРЕМЯ(1,1,1), для NULL — оператор ЕСТЬ NULL
- 5Проверьте условие на тестовых данных: с пустой датой, заполненной датой и NULL
- 6Убедитесь, что отбор возвращает ожидаемое количество записей
Типичные ошибки и как их избежать
Первая и самая массовая ошибка — сравнение с пустой строкой: Дата = "". С точки зрения языка это сравнение разных типов, результат непредсказуем и зависит от контекста. Проверять дату нужно только на дату.
Вторая ошибка — путать пустую дату с NULL в запросах. Условие Поле = ДАТАВРЕМЯ(1,1,1) не отберёт записи, где поле равно NULL, а разработчик часто ожидает обратного. Результат — «потерянные» документы в отчёте.
Третья ошибка — проверка даты через Строка(Дата) = "" или поиск подстроки «01.01.0001» в строковом представлении. Такие конструкции хрупки: формат вывода даты зависит от региональных настроек сеанса, и на другом сервере проверка перестанет работать.
Четвёртая ошибка — игнорирование составного типа. Если реквизит объявлен как «Дата, Строка», прямое сравнение с '00010101' для строкового значения может привести к ложным срабатываниям. Для составных типов используйте ЗначениеЗаполнено().
Как убедиться, что проверка работает правильно
После внедрения условия проверьте три сценария: реквизит не заполнен, реквизит заполнен корректной датой, реквизит содержит NULL (если это возможно в вашей структуре). Для запросов удобно временно вывести само поле рядом с результатом условия и визуально сверить отбор.
В отладчике проверить значение просто: вычислите выражение Дата = '00010101' или ЗначениеЗаполнено(Дата) в окне «Вычислить выражение». Если результат не совпадает с ожиданием — смотрите фактический тип значения функцией ТипЗнч(): часто оказывается, что в переменной вовсе не дата.
Частые вопросы
Чем отличается пустая дата от NULL в 1С?
Пустая дата — это конкретное значение 01.01.0001 00:00:00 у реквизита типа «Дата». NULL — признак отсутствия значения, возникающий только в результатах запросов при соединениях или обращении к реквизитам NULL-ссылок. Проверяются они по-разному: пустая дата — сравнением с ДАТАВРЕМЯ(1,1,1), NULL — оператором ЕСТЬ NULL.
Можно ли проверить пустую дату через ЕСТЬNULL?
Да, приём ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)) = ДАТАВРЕМЯ(1,1,1) объединяет обе ситуации: и NULL, и пустую дату. Это удобно, когда нужно отобрать все записи «без даты» независимо от причины. Но такое условие не использует индекс по полю, что на больших таблицах может замедлить запрос.
Работает ли ЗначениеЗаполнено() в запросе?
Нет, функция ЗначениеЗаполнено() доступна только во встроенном языке. В тексте запроса её вызов приведёт к ошибке. В запросах используйте сравнение с ДАТАВРЕМЯ(1,1,1) и оператор ЕСТЬ NULL.
Как проверить дату в параметре отбора динамического списка?
Установите элемент отбора с видом сравнения «Равно» и значением Дата(1,1,1) — либо через настройки списка в конфигураторе, либо программно через ЭлементыОтбора. Если параметр передаётся в запрос списка, в условии используйте сравнение с ДАТАВРЕМЯ(1,1,1).
Почему сравнение Дата = '00010101' и Дата = Дата(1,1,1) дают одинаковый результат?
Потому что литерал '00010101' — это строковая запись той же самой даты: 1 января 0001 года без времени. Платформа интерпретирует литерал в одинарных кавычках как значение типа «Дата». Разница только в читаемости кода, функционально способы эквивалентны.
Как сделать поле даты обязательным без программирования?
В конфигураторе откройте свойства реквизита и установите «Проверка заполнения» в значение «Выдавать ошибку». Платформа автоматически запретит запись объекта с пустой датой и покажет пользователю стандартное сообщение. Ручные проверки в модуле при этом не нужны.
Что важно запомнить
Пустая дата в 1С — это 01.01.0001 00:00:00. В коде проверяйте через ЗначениеЗаполнено() или сравнение с Дата(1,1,1), в запросах — через ДАТАВРЕМЯ(1,1,1), а NULL — только оператором ЕСТЬ NULL. Не сравнивайте дату со строкой и проверяйте тип значения перед условием.