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