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