Почему в 1С вместо незаполненной даты выводится 01.01.0001 и как с ней работать

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Причина появления даты 01.01.0001 00:00:00

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

Следовательно, для типа Дата незаполненное значение эквивалентно значению по умолчанию, то есть самой первой возможной дате в системе. По аналогии с типом Число, где незаполненное значение равно 0, для даты таким значением является начало поддерживаемого диапазонов — 01.01.0001 00:00:00.

Ограничения платформы и особенности хранения дат

Разберем ключевые особенности работы с типом Дата в платформе 1С:

  1. Диапазон допустимых дат: Платформа поддерживает работу с датами строго в интервале от 01.01.0001 00:00:00 до 31.12.9999 23:59:59. Даты до нашей эры или отрицательные значения типом Дата не поддерживаются.
  2. Арифметика нижнего предела: При попытке вычесть любое количество дней или секунд из пустой даты (01.01.0001) значение не уйдет в «минус», а останется равным 01.01.0001 00:00:00.
  3. Смещение дат в СУБД MS SQL Server: Поля типа DATETIME в MS SQL Server поддерживают хранение дат начиная только с 1753-01-01. Чтобы платформа 1С могла корректно хранить даты начиная с 0001 года (включая незаполненные даты), при создании базы данных задается специальное смещение дат на 2000 лет. В базе данных SQL пустая дата физически хранится как 2001-01-01, а платформа 1С при чтении прозрачно вычитает 2000 лет.

Как проверять и обрабатывать пустую дату в коде 1С

Для проверки заполненности реквизита или переменной типа Дата в программном коде применяются следующие подходы:

Использование системной функции ЗначениеЗаполнено() — это наиболее универсальный и рекомендуемый способ:


Если Не ЗначениеЗаполнено(ДатаВыдачи) Тогда
    // Действия, если дата не заполнена
КонецЕсли;

Сравнение с литералом пустой даты '00010101' или вызовом Дата(1, 1, 1):


Если ДатаВыдачи = '00010101' Тогда
    // Дата является пустой
КонецЕсли;

Как обрабатывать пустую дату в запросах 1С

Поскольку незаполненная дата в регистре или реквизите объекта не является значением NULL, функция ЕСТЬNULL() на нее не реагирует. Проанализируем способы работы с пустой датой в запросах.

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


ВЫБРАТЬ
    ПаспортныеДанныеФизЛиц.ФизЛицо КАК ФизЛицо,
    ПаспортныеДанныеФизЛиц.ДатаРегистрацииПоМестуЖительства КАК ДатаРегистрации
ИЗ
    РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
ГДЕ
    ПаспортныеДанныеФизЛиц.ДатаРегистрацииПоМестуЖительства = ДАТАВРЕМЯ(1, 1, 1)

Замена пустой даты в результате запроса на NULL с помощью конструкции ВЫБОР:


ВЫБРАТЬ
    ВЫБОР
        КОГДА ПаспортныеДанныеФизЛиц.ДатаРегистрацииПоМестуЖительства = ДАТАВРЕМЯ(1, 1, 1)
            ТОГДА NULL
        ИНАЧЕ ПаспортныеДанныеФизЛиц.ДатаРегистрацииПоМестуЖительства
    КОНЕЦ КАК ДатаРегистрации
ИЗ
    РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц

Скрытие пустой даты при выводе пользователю

Чтобы дата 01.01.0001 00:00:00 не выводилась в печатных формах, текстах или отчетах, используется параметр ДП (представление пустой даты) в форматной строке:


// Выведет пустую строку вместо 01.01.0001
СтрокаДата = Формат(ДатаРегистрации, "ДФ=dd.MM.yyyy; ДП=''");

// Выведет пользовательский текст
СтрокаДата = Формат(ДатаРегистрации, "ДФ=dd.MM.yyyy; ДП='Не указана'");

В Системе компоновки данных (СКД) скрытие пустой даты настраивается аналогичным образом: в свойствах поля на вкладке «Наборы данных» / «Поля» в окне «Оформление» задается значение параметра ДП=''.

← На главную