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