Работа с датами в 1С:Предприятие 8 — одна из самых частых задач, с которыми сталкиваются как программисты, так и обычные пользователи. Особенно актуальна проблема проверки пустых дат, которые могут возникать при загрузке данных, формировании отчетов или обработке документов. Неправильная обработка таких значений часто приводит к ошибкам в расчетах, искажению отчетности или сбоям в работе конфигурации.

В этой статье мы разберем все возможные способы проверки пустых дат в 1С 8.3 и 1С 8.2 — от стандартных функций до нюансов работы с запросами и динамическими списками. Вы узнаете, как отличить NULL от реальной даты, почему функция ПустаяДата() не всегда работает ожидаемым образом, и как правильно обрабатывать такие значения в различных сценариях. Материал будет полезен как начинающим разработчикам, так и опытным специалистам, которые хотят систематизировать свои знания.

Особое внимание уделим типичным ошибкам, которые допускают при работе с пустыми датами, и покажем, как их избежать. Все примеры кода протестированы на актуальных версиях платформы и применимы к большинству типовых конфигураций (Бухгалтерия 3.0, УТ 11, ЗУП 3.1 и др.).

1. Что такое пустая дата в 1С и почему она возникает

В 1С:Предприятие 8 пустая дата — это специальное значение типа Дата, которое не содержит конкретной календарной даты. Оно аналогично NULL в SQL или None в Python, но имеет свои особенности обработки. Пустые даты могут появляться в следующих ситуациях:

  • 📥 Импорт данных из внешних источников (Excel, XML, JSON), где дата не указана или имеет некорректный формат
  • 📝 Ручной ввод пользователем, когда поле даты оставлено пустым в форме документа или справочника
  • 🔄 Обмен данными между базами, где в одной из систем дата не заполнена
  • 📊 Расчетные поля в отчетах или запросах, где дата не определена для некоторых записей
  • 🖥️ Программное создание объектов, когда дата не инициализирована

Важно понимать, что пустая дата — это не то же самое, что дата с нулевыми значениями (например, '00010101'). Последняя является полноценной датой, просто равной 1 января 1 года, и обрабатывается иначе. Пустая дата не имеет временной привязки и требует специальных методов проверки.

⚠️ Внимание: В некоторых конфигурациях (например, в 1С:Бухгалтерия 8 ред. 3.0) пустые даты могут автоматически заменяться на текущую дату при записи документа. Это поведение задается в модулях объектов и может варьироваться в зависимости от версии конфигурации.

Чтобы избежать ошибок, всегда проверяйте логику работы с датами в конкретной конфигурации. Например, в 1С:Зарплата и Управление Персоналом 3.1 пустые даты в кадровых документах могут блокировать проведение, тогда как в 1С:Управление Торговлей 11 они просто игнорируются при формировании отчетов.

2. Стандартная функция ПустаяДата() — базовый метод проверки

Самый простой и очевидный способ проверки — использование встроенной функции ПустаяДата(). Она возвращает специальное значение пустой даты, с которым можно сравнивать другие даты. Синтаксис проверки выглядит так:

Если ДатаДокумента = ПустаяДата() Тогда

// Действия для пустой даты

Иначе

// Действия для заполненной даты

КонецЕсли;

Этот метод работает во всех версиях платформы, начиная с 1С:Предприятие 8.0, и является наиболее универсальным. Однако у него есть несколько нюансов:

  • Быстродействие: Сравнение с ПустаяДата() выполняется мгновенно, так как это константное значение
  • 🔄 Типизация: Функция возвращает именно тип Дата, а не NULL, что важно для некоторых операций
  • 📌 Совместимость: Работает одинаково в тонком клиенте, толстом клиенте и на сервере

Пример использования в реальном коде (проверка даты документа при проведении):

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Если Дата = ПустаяДата() Тогда

Сообщить("Дата документа не заполнена!", СтатусСообщения.Важное);

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

⚠️ Внимание: В некоторых случаях, особенно при работе с управляемыми формами, пустая дата может отображаться как 01.01.0001 в интерфейсе, но при этом оставаться пустой в коде. Всегда проверяйте значение программно, а не ориентируйтесь на визуальное отображение.

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

Для Каждого Строка Из ТабличнаяЧасть Цикл

Если Строка.ДатаПоступления = ПустаяДата() Тогда

Строка.ДатаПоступления = ТекущаяДата();

КонецЕсли;

КонецЦикла;

📊 Какой способ проверки пустых дат вы используете чаще?
Функция ПустаяДата()
Сравнение с NULL
Тип ЗначениеЗаполнено()
Запросы с ЕСТЬNULL

3. Альтернативные способы проверки: ЗначениеЗаполнено() и NULL

Помимо ПустаяДата(), в 1С 8.3 существуют и другие методы проверки пустых значений. Их уместно использовать в специфических сценариях, где стандартный подход может быть менее эффективен или неудобен.

3.1. Функция ЗначениеЗаполнено()

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

Если НЕ ЗначениеЗаполнено(ДатаСобытия) Тогда

ДатаСобытия = НачалоДня(ТекущаяДата());

КонецЕсли;

Преимущества этого метода:

  • 🔹 Работает с любыми типами данных (не только с датами)
  • 🔹 Более читаемый код в некоторых случаях
  • 🔹 Автоматически обрабатывает NULL в запросах

Однако для дат ЗначениеЗаполнено() эквивалентна проверке на ПустаяДата(), поэтому выбор между ними чаще всего зависит от стиля кодирования.

3.2. Сравнение с NULL

В контексте запросов или при работе с внешними источниками данных (например, SQL-базами) пустые даты могут представляться как NULL. Для их проверки используется оператор ЕСТЬ NULL:

Запрос = Новый Запрос;

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

"ВЫБРАТЬ

| Номенклатура.Наименование,

| ЕСТЬ NULL(Документ.Дата) КАК ДатаПустая

|ИЗ

| Документ.ПоступлениеТоваров КАК Документ

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

| ПО Документ.Номенклатура = Номенклатура.Ссылка";

Результат = Запрос.Выполнить();

Особенности работы с NULL:

  • 🔸 В запросах NULL и ПустаяДата() — разные вещи
  • 🔸 Оператор = NULL не работает (нужно использовать ЕСТЬ NULL)
  • 🔸 В результатах запроса NULL преобразуется в ПустаяДата()
Метод проверки Применимость Пример кода Особенности
ПустаяДата() Любой код на встроенном языке Если Дата = ПустаяДата() Самый быстрый и надежный способ
ЗначениеЗаполнено() Любой код, универсальная проверка Если НЕ ЗначениеЗаполнено(Дата) Удобно для проверки разных типов
ЕСТЬ NULL Только в текстах запросов ЕСТЬ NULL(Документ.Дата) Обязателен для работы с внешними БД
ТипЗнч() Проверка типа значения ТипЗнч(Дата) = Тип("Дата") Не проверяет заполненность, а только тип

Для сложных условий можно комбинировать несколько методов. Например, если нужно проверить дату и одновременно убедиться, что она не равна какой-то конкретной дате:

Если Дата = ПустаяДата() ИЛИ Дата = ДатаНачалаГода(ТекущаяДата()) Тогда

// Действия для пустой или "нулевой" даты

КонецЕсли;

4. Проверка пустых дат в запросах и отчетах

Работа с пустыми датами в запросах 1С имеет свои особенности, так как язык запросов отличается от встроенного языка. Здесь нельзя напрямую использовать ПустаяДата() — нужно применять специальные конструкции.

4.1. Оператор ЕСТЬNULL

Основной инструмент для работы с NULL в запросах — оператор ЕСТЬNULL. Он позволяет заменить NULL на другое значение прямо в тексте запроса:

ВЫБРАТЬ

ЕСТЬNULL(Документ.Дата, ДАТАВРЕМЯ(2023, 1, 1)) КАК ДатаДокумента

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

Это удобно для:

  • 📊 Формирования отчетов с единообразными данными
  • 🔗 Объединения таблиц, где в одной из них дата может быть пустой
  • 📈 Построения графиков, где пропущенные даты нужно заменить на дефолтные

4.2. Фильтрация по пустым датам

Чтобы отфильтровать записи с пустыми датами, используйте конструкцию:

ВЫБРАТЬ

Документ.Номер,

Документ.Дата

ИЗ

Документ.ПоступлениеТоваров КАК Документ

ГДЕ

Документ.Дата ЕСТЬ NULL

А для выборки только записей с заполненными датами:

ВЫБРАТЬ

Документ.Номер,

Документ.Дата

ИЗ

Документ.ПоступлениеТоваров КАК Документ

ГДЕ

НЕ Документ.Дата ЕСТЬ NULL

В отчетах (например, в СКД) пустые даты могут искажать результаты. Чтобы этого избежать, настройте параметры отчета:

Установить фильтр на даты в параметрах отчета|Использовать ЕСТЬNULL для замены пустых значений|Проверить настройки группировки по датам|Настроить условное оформление для пустых дат-->

Пример настройки условного оформления в СКД для выделения пустых дат:

ЭлементыФормы.Отчет.УсловноеОформление.Добавить();

НовыйЭлемент = ЭлементыФормы.Отчет.УсловноеОформление[ЭлементыФормы.Отчет.УсловноеОформление.Количество() - 1];

НовыйЭлемент.Условие = Новый Условие("Дата ЕСТЬ NULL");

НовыйЭлемент.Оформление.ЦветФона = ВебЦвета.Красный;

⚠️ Внимание: В динамических списках пустые даты могут не отображаться в фильтрах по умолчанию. Чтобы они появились в списке доступных значений, нужно явным образом добавить параметр с пустой датой в настройки динамического списка.

5. Типичные ошибки при работе с пустыми датами

Даже опытные разработчики иногда допускают ошибки при обработке пустых дат. Рассмотрим наиболее распространенные случаи и способы их избежать.

5.1. Сравнение с пустой строкой

Частая ошибка — попытка сравнить дату с пустой строкой:

// НЕПРАВИЛЬНО!

Если Дата = "" Тогда

// Этот код никогда не выполнится

КонецЕсли;

Дата и строка — разные типы данных, и такое сравнение всегда вернет Ложь. Правильный вариант:

Если Дата = ПустаяДата() Тогда

// Правильная проверка

КонецЕсли;

5.2. Использование функции Текст()

Еще одна ошибка — преобразование даты в строку для проверки:

// НЕПРАВИЛЬНО!

Если Текст(Дата) = "" Тогда

// Не сработает, так как Текст(ПустаяДата()) вернет "01.01.0001"

КонецЕсли;

Функция Текст() преобразует пустую дату в строку "01.01.0001", а не в пустую строку. Для проверки всегда используйте специализированные функции.

5.3. Ошибки в запросах с датами

В запросах нельзя использовать ПустаяДата() напрямую. Следующий код вызовет ошибку:

// НЕПРАВИЛЬНО!

ВЫБРАТЬ

Документ.Дата

ИЗ

Документ.ЗаказПокупателя КАК Документ

ГДЕ

Документ.Дата = ПустаяДата()

Правильный вариант:

ВЫБРАТЬ

Документ.Дата

ИЗ

Документ.ЗаказПокупателя КАК Документ

ГДЕ

Документ.Дата ЕСТЬ NULL

5.4. Проблемы с сортировкой

При сортировке данных с пустыми датами они всегда оказываются в начале или конце списка в зависимости от направления сортировки. Это может искажать результаты отчетов. Чтобы избежать этого, используйте замену пустых дат на минимальное/максимальное значение:

ВЫБРАТЬ

Документ.Номер,

ЕСТЬNULL(Документ.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаДляСортировки

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

УПОРЯДОЧИТЬ ПО

ДатаДляСортировки

💡

При отладке кода с датами используйте функцию ТипЗнч(), чтобы убедиться, что переменная действительно содержит тип Дата, а не строку или число. Например: Сообщить(ТипЗнч(МояДата));

6. Практические примеры: обработка пустых дат в типовых конфигурациях

Рассмотрим, как проверка пустых дат реализуется в популярных типовых конфигурациях .

6.1. 1С:Бухгалтерия 3.0

В бухгалтерских документах пустые даты часто блокируют проведение. Типовой код проверки в модуле документа:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Если Дата = ПустаяДата() Тогда

Сообщить("Укажите дату документа!", СтатусСообщения.Важное);

Отказ = Истина;

Возврат;

КонецЕсли;

// Дополнительные проверки

Если Дата > ТекущаяДата() Тогда

Сообщить("Дата документа не может быть в будущем!", СтатусСообщения.Важное);

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

6.2. 1С:Зарплата и Управление Персоналом 3.1

В кадровых документах (например, приеме на работу) пустая дата может означать отсутствие записи. Пример обработки в отчете по сотрудникам:

Запрос = Новый Запрос;

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

"ВЫБРАТЬ

| Сотрудник.Наименование,

| ЕСТЬNULL(Прием.ДатаПриема, ДАТАВРЕМЯ(2000, 1, 1)) КАК ДатаПриема

|ИЗ

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

| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу КАК Прием

| ПО Сотрудник.Ссылка = Прием.Сотрудник";

6.3. 1С:Управление Торговлей 11

В торговой конфигурации пустые даты часто встречаются в заказах покупателей. Пример обработки при формировании отчета по продажам:

Процедура СформироватьОтчет()

Запрос = Новый Запрос;

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

"ВЫБРАТЬ

| Заказ.Номер КАК НомерЗаказа,

| ЕСТЬNULL(Заказ.ДатаОтгрузки, ДАТАВРЕМЯ(2023, 1, 1)) КАК ДатаОтгрузки

|ИЗ

| Документ.ЗаказПокупателя КАК Заказ

|ГДЕ

| Заказ.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));

Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));

Результат = Запрос.Выполнить();

КонецПроцедуры

Во всех типовых конфигурациях рекомендуется использовать централизованную обработку пустых дат — например, создавать общую функцию в общем модуле:

Функция ПроверитьДату(ЗначениеДаты, ДатаПоУмолчанию = Неопределено) Экспорт

Если ЗначениеДаты = ПустаяДата() Тогда

Если ДатаПоУмолчанию = Неопределено Тогда

Возврат ТекущаяДата();

Иначе

Возврат ДатаПоУмолчанию;

КонецЕсли;

Иначе

Возврат ЗначениеДаты;

КонецЕсли;

КонецФункции

7. Оптимизация кода: быстрые способы проверки

Для крупных баз данных, где проверка дат выполняется в циклах по тысячам записей, важно использовать наиболее эффективные методы. Рассмотрим способы оптимизации.

7.1. Использование тернарного оператора

Для краткости кода можно использовать тернарный оператор ?:

ДатаДляОтчета = ?(ДатаДокумента = ПустаяДата(), ТекущаяДата(), ДатаДокумента);

Это эквивалентно:

Если ДатаДокумента = ПустаяДата() Тогда

ДатаДляОтчета = ТекущаяДата();

Иначе

ДатаДляОтчета = ДатаДокумента;

КонецЕсли;

7.2. Массовая обработка в запросах

Если нужно обработать большое количество записей, лучше сделать это в одном запросе, а не в цикле:

Запрос = Новый Запрос;

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

"ВЫБРАТЬ

| Ссылка КАК Ссылка,

| ЕСТЬNULL(Дата, ТекущаяДата()) КАК НоваяДата

|ПОМЕСТИТЬ ВТДата

|ИЗ

| Документ.ЗаказПокупателя КАК Документ

|ГДЕ

| Дата ЕСТЬ NULL";

Запрос.Выполнить();

Объект.Записать();

7.3. Кэширование часто используемых дат

Если в коде многократно используется одна и та же дата (например, текущая дата или дата начала года), стоит закешировать ее в переменную:

ТекущаяДата = ТекущаяДата();

ДатаНачалаГода = НачалоГода(ТекущаяДата);

Для Каждого Строка Из ТабличнаяЧасть Цикл

Если Строка.Дата = ПустаяДата() Тогда

Строка.Дата = ТекущаяДата;

КонецЕсли;

КонецЦикла;

Это сокращает количество вызовов функций и ускоряет выполнение кода, особенно в больших циклах.

💡

Для максимальной производительности всегда стремитесь переносить логику обработки пустых дат на уровень запросов, а не обрабатывать их в коде построчно.

8. Расширенные сценарии: работа с пустыми датами в интеграциях

При обмене данными между системами (например, и SQL-базой или веб-сервисом) пустые даты требуют особого внимания, так как их представление может отличаться.

8.1. Обмен с SQL-базами

В SQL пустые даты представляются как NULL. При загрузке данных в их нужно преобразовывать:

Запрос = Новый Запрос;

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

"ВЫБРАТЬ

| ЕСТЬNULL(ExternalData.DateField, ДАТАВРЕМЯ(1, 1, 1)) КАК Дата1С

|ИЗ

| &Таблица КАК ExternalData";

Запрос.УстановитьПараметр("Таблица", Новый ОписаниеТипов("КаталогSQL.ТаблицаДанных"));

Результат = Запрос.Выполнить();

При выгрузке данных из в SQL пустые даты нужно конвертировать в NULL:

Если Дата1С = ПустаяДата() Тогда

ДатаДляSQL = NULL;

Иначе

ДатаДляSQL = Дата1С;

КонецЕсли;

8.2. Работа с JSON/XML

При парсинге JSON или XML пустые даты могут представляться по-разному:

  • 📄 В JSON: null или отсутствие поля
  • 📄 В XML: пустой тег <Дата/> или атрибут xsi:nil="true"

Пример обработки JSON:

Данные = Новый ЧтениеJSON;

Данные.УстановитьСтроку(JSONСтрока);

Пока Данные.Прочитать() Цикл

Если Данные.ТипТекущего = ТипЗначенияJSON.Null Тогда

ДатаИзJSON = ПустаяДата();

ИначеЕсли Данные.ТипТекущего = ТипЗначенияJSON.Строка Тогда

ДатаИзJSON = Дата(Данные.Значение);

КонецЕсли;

КонецЦикла;

8.3. Обмен через веб-сервисы

В SOAP или REST веб-сервисах пустые даты передаются как xsi:nil. Пример обработки:

Если НЕ ЗначениеЗаполнено(ДатаИзВС) Тогда

// Обработка пустой даты

КонецЕсли;

При отправке данных в веб-сервис:

Если ДатаДляВС = ПустаяДата() Тогда

ПараметрыЗапроса.Вставить("Дата", Неопределено);

Иначе

ПараметрыЗапроса.Вставить("Дата", ДатаДляВС);

КонецЕсли;

⚠️ Внимание: При интеграции с внешними системами всегда уточняйте формат передачи пустых дат в документации API. Некоторые системы могут использовать специальные метки (например, "1900-01-01") вместо стандартного NULL.

FAQ: Частые вопросы по работе с пустыми датами в 1С

Как отличить пустую дату от даты 01.01.0001?

Дата 01.01.0001 — это полноценная дата, тогда как пустая дата не имеет временной привязки. Чтобы их различить, используйте проверку:

Если Дата = ПустаяДата() Тогда

// Это пустая дата

ИначеЕсли Дата = Дата(1, 1, 1) Тогда

// Это 01.01.0001

КонецЕсли;

В интерфейсе обе даты могут отображаться одинаково, поэтому всегда проверяйте программно.

Почему после обновления конфигурации перестали работать проверки пустых дат?

Это может быть связано с изменением логики обработки дат в новой версии конфигурации. Проверьте:

  1. Не изменились ли модули объектов (особенно документов и справочников)
  2. Не добавлены ли новые обработчики событий (например, ПередЗапись