К статье
Практический материал

Разработка и Конфигурация · 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. После присваивания объект нужно записать, иначе изменение останется только в памяти. Для реквизитов формы на управляемой форме достаточно присвоить значение реквизиту — платформа сама отобразит пустое поле.

Для реквизита составного типа (например, «Дата или строка») иногда требуется присвоить Неопределено, а не пустую дату — зависит от того, как устроена логика конфигурации. Проверяйте, какое значение ожидают проверки заполнения.

bsl
// Очистка даты в реквизите объекта
Объект.ДатаРождения = Дата(1, 1, 1);
Объект.Записать();

// Проверка на пустоту
Если Не ЗначениеЗаполнено(Объект.ДатаРождения) Тогда
    Сообщить("Дата не заполнена");
КонецЕсли;

Проверка даты на пустоту

Универсальный способ — функция ЗначениеЗаполнено(). Она возвращает Ложь для пустой даты, пустой строки, нуля, Неопределено и пустых ссылок. Это самый безопасный вариант, когда тип реквизита заранее неизвестен.

Если тип точно «Дата», можно сравнить напрямую: Если Объект.Дата = '00010101000000' Тогда. Такое сравнение работает быстрее и явно показывает намерение, но сломается, если тип реквизита позже изменят на составной.

Частая ошибка — проверять дату через сравнение с пустой строкой или с нулём. Дата никогда не равна пустой строке, такая проверка всегда даст Ложь, и ветка «дата не заполнена» никогда не выполнится.

Пустая дата в запросах

В языке запросов пустую дату задают двумя способами. Первый — конструкция ЗНАЧЕНИЕ(ДатаВремя.ПустаяДата). Второй — передача параметра: &ПустаяДата, где параметру присваивают Дата(1,1,1) или литерал '00010101000000'.

Запрос.Текст =

"ВЫБРАТЬ Сотрудники.Ссылка

|ИЗ Справочник.Сотрудники КАК Сотрудники

|ГДЕ Сотрудники.ДатаУвольнения = ЗНАЧЕНИЕ(ДатаВремя.ПустаяДата)";

Такой запрос выберет всех сотрудников, у которых дата увольнения не заполнена. Обратная задача — выбрать заполненные даты — решается через неравенство: ДатаУвольнения <> ЗНАЧЕНИЕ(ДатаВремя.ПустаяДата).

Если поле участвует в соединениях, добавьте проверку на NULL: ЕСТЬ NULL или ЕСТЬNULL(Поле, ЗНАЧЕНИЕ(ДатаВремя.ПустаяДата)). Функция ЕСТЬNULL заменит NULL на пустую дату, и дальнейшие сравнения будут работать предсказуемо.

Проверка результата и типичные ошибки

После очистки убедитесь, что значение действительно записалось. Откройте объект заново — поле должно быть пустым. Программно проверьте через ЗначениеЗаполнено() или выведите значение: пустая дата при выводе превращается в строку «01.01.0001 0:00:00» или пустое представление, в зависимости от формата поля.

Контрольные точки

Как проверить результат

Поле на форме
Норма

Поле визуально пустое, документ записывается без ошибок

Тревожный признак

После записи дата возвращается — сработал обработчик заполнения

Значение в коде
Норма

ЗначениеЗаполнено(Реквизит) возвращает Ложь

Тревожный признак

Функция возвращает Истина — присвоено не то значение

Запрос по пустой дате
Норма

Записи с незаполненной датой попадают в выборку

Тревожный признак

Выборка пустая — возможно, в поле NULL из соединения или другая дата

Разберём ошибки, которые встречаются чаще всего. Первая — присвоение пустой строки вместо пустой даты: Объект.Дата = "". Платформа попытается преобразовать строку к дате, получит пустую дату, и в простых случаях это «сработает», но такой код хрупок и нечитаем.

Вторая ошибка — попытка очистить дату документа целиком. Это системный реквизит, он обязателен, и попытка присвоить ему пустое значение даст ошибку при записи. Третья — сравнение даты с Неопределено в запросе: в языке запросов Неопределено недоступно, используйте ЗНАЧЕНИЕ(ДатаВремя.ПустаяДата).

Типичные ошибки
01
Присвоение пустой строки вместо Дата(1,1,1) — код работает случайно и ломается при смене типа
02
Проверка даты через сравнение с Неопределено — условие никогда не срабатывает
03
Попытка очистить системную дату документа — ошибка при записи, дата документа обязательна
04
Игнорирование NULL в запросах с соединениями — записи теряются из выборки
05
Очистка без записи объекта — изменение остаётся только в памяти

Как выбрать способ очистки

Маршрут решения

Как выбрать действие

Нужно убрать дату в одном документе вручнуюОткройте форму, установите курсор в поле и нажмите Delete
Нужно очищать дату массово или по условиюНапишите обработку: перебор объектов, присваивание Дата(1,1,1), запись
Нужно найти записи с незаполненной датойИспользуйте запрос с условием = ЗНАЧЕНИЕ(ДатаВремя.ПустаяДата)
Поле очищается, но дата возвращаетсяПроверьте обработчики ПриИзменении и ПередЗаписью в модуле формы и объекта

Для разовой ручной работы достаточно интерфейса. Для массовой очистки по условию — например, сбросить дату у всех неактуальных элементов справочника — пишется простая обработка с перебором выборки из запроса. Перед запуском такой обработки на рабочей базе сделайте копию и сначала протестируйте на ней.

Если дата участвует в обменах данными, учтите: пустая дата корректно передаётся через типовые механизмы обмена, но при выгрузке в текстовые форматы (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». Если принимающая система не понимает такое значение, заменяйте пустую дату на пустую строку в коде выгрузки.