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

Разработка и Конфигурация · 10 мин

1С: проверка, что значение является датой

Как в 1С проверить, что значение — это дата: функция ТипЗнч, Тип(), ОписаниеТипов, проверка заполненности и преобразование строки в дату с примерами кода.

Во встроенном языке 1С нет отдельной функции вида «ЭтоДата()», поэтому проверка типа значения выполняется через сравнение результата функции ТипЗнч() с конструкцией Тип("Дата") или через объект ОписаниеТипов. Выбор способа зависит от задачи: проверить переменную, отбор компоновки данных, реквизит объекта или строку, которую пользователь ввёл вместо даты.

Отдельная ситуация — когда значение формально является датой, но пустое (01.01.0001). Такая «пустая дата» часто ломает отчёты и обмены, поэтому проверка типа обычно дополняется проверкой заполненности через ЗначениеЗаполнено().

Ниже разобраны рабочие приёмы: сравнение типов, проверка через ОписаниеТипов, безопасное преобразование строки в дату, типичные ошибки при сравнении дат и контроль результата. Все примеры применимы как к тонкому и веб-клиенту, так и к серверному коду.

Базовая проверка типа через ТипЗнч

Основной способ — функция ТипЗнч(), которая возвращает объект типа «Тип», и сравнение его с Тип("Дата"). Конструкция работает везде: в модуле объекта, в общем модуле, в условиях запросов через выражения языка и в отладчике.

Если ТипЗнч(Значение) = Тип("Дата") Тогда

// Значение — дата (включая пустую 01.01.0001)

КонецЕсли;

Важно понимать, что возвращает ТипЗнч: это не строка и не число, а специальный объект. Сравнивать его со строкой «Дата» напрямую нельзя — сравнение ТипЗнч(Значение) = "Дата" всегда даст Ложь. Имя типа в функции Тип() пишется без кавычек внутри значения и регистронезависимо: Тип("дата") тоже сработает.

Если нужно проверить тип реквизита документа или справочника, сначала обратитесь к реквизиту, а потом проверяйте его значение: ТипЗнч(Документ.ДатаОтгрузки) = Тип("Дата"). Сама проверка не изменяет данные и безопасна в любых модулях.

Проверка через ОписаниеТипов для составных типов

Реквизиты с составным типом (например, «Дата или Строка») или колонки таблицы значений удобнее проверять через объект ОписаниеТипов. Метод СодержитТип() отвечает на вопрос «может ли это описание хранить дату», а не «является ли конкретное значение датой» — это принципиально разные проверки.

Описание = Новый ОписаниеТипов("Дата,Строка");

Если Описание.СодержитТип(Тип("Дата")) Тогда

// Описание допускает хранение дат

КонецЕсли;

Для проверки типа колонки таблицы значений обращайтесь к свойству ТипЗначения колонки: Таблица.Колонки.Период.ТипЗначения.СодержитТип(Тип("Дата")). Это полезно в универсальных обработках, где структура таблицы заранее неизвестна.

Не путайте: СодержитТип проверяет метаданные, а ТипЗнч — фактическое значение. Если колонка составного типа, конкретная ячейка может содержать строку, даже когда описание допускает дату. В критичных местах делайте обе проверки.

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

Значение типа «Дата» в 1С не бывает «неопределённым»: если дата не задана, она равна 01.01.0001 00:00:00. Поэтому проверка типа пройдёт успешно даже для пустой даты, что часто становится источником ошибок в отчётах и печатных формах.

Для проверки заполненности используйте ЗначениеЗаполнено(Значение) — для даты она вернёт Ложь, если значение равно пустой дате. Альтернатива — прямое сравнение с пустой датой: Значение = Дата(1,1,1) или Значение = '00010101' (строковый литерал даты в формате ГГГГММДД).

Если ТипЗнч(Значение) = Тип("Дата") И ЗначениеЗаполнено(Значение) Тогда

// Это непустая дата, с ней можно работать

КонецЕсли;

В запросах пустая дата проверяется сравнением с ДАТАВРЕМЯ(1,1,1). Помните, что параметр запроса с незаданной датой тоже придёт как 01.01.0001 — фильтр Дата = &Дата с незаполненным параметром отберёт только записи с пустой датой, а не все записи.

Преобразование строки в дату с проверкой

Частая задача — пользователь или файл обмена передаёт дату строкой, и нужно понять, корректна ли она. Прямое присваивание Дата("31.02.2026") вызовет исключение, поэтому преобразование оборачивают в попытку или проверяют формат заранее.

Функция СтрокаВДату(Стр)

Попытка

// Ожидаем формат ГГГГММДД или ГГГГММДДЧЧММСС

Возврат Дата(Стр);

Исключение

Возврат Неопределено;

КонецПопытки;

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

Конструктор Дата() из строки принимает только внутренний формат ГГГГММДД (и с временем). Строки вида «31.12.2026» или «2026-12-31» напрямую не преобразуются — их нужно разобрать вручную через СтрРазделить и собрать дату из чисел: Дата(Год, Месяц, День). Перед сборкой проверьте, что разделитель дал ровно три части и каждая — число в допустимом диапазоне.

Для дат из XML и веб-сервисов используйте XMLЗначение(Тип("Дата"), Строка) — этот способ понимает формат ISO 8601 (например, «2026-12-31T10:30:00») и тоже требует обработки исключений.

bsl
Функция ЭтоДата(Значение) Экспорт
	Если ТипЗнч(Значение) = Тип("Дата") Тогда
		Возврат ЗначениеЗаполнено(Значение);
	КонецЕсли;
	Возврат Ложь;
КонецФункции

Проверка дат в запросах и СКД

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

Для составного поля (например, регистратора) применяйте ВЫРАЗИТЬ(Поле КАК ДАТА) — значения других типов станут пустыми датами, после чего их можно отфильтровать сравнением с ДАТАВРЕМЯ(1,1,1). Это стандартный приём безопасного приведения типа в запросе.

В СКД проверку типа параметра или вычисляемого поля выполняют в выражении на встроенном языке через те же ТипЗнч и Тип. Если параметр типа «Дата» оставлен пустым, а в отборе используется сравнение «Больше или равно», отчёт вернёт данные с начала времён — задавайте значения по умолчанию или проверяйте заполненность в ПриКомпоновкеРезультата.

Типичные ошибки
01
Сравнение ТипЗнч(Значение) со строкой "Дата" — результат всегда Ложь, сравнивать нужно с Тип("Дата")
02
Проверка только типа без проверки заполненности — пустая дата 01.01.0001 проходит проверку типа и попадает в отчёт
03
Прямое преобразование строки Дата("31.12.2026") — исключение, конструктор принимает только формат ГГГГММДД
04
Сравнение дат с точностью до секунды, когда одна дата со временем, а другая без — условие равенства не срабатывает

Сравнение дат и граничные случаи

Даже корректная дата может вести себя неожиданно при сравнениях. Тип «Дата» хранит время с точностью до секунды, поэтому Дата1 = Дата2 ложно, если у одной даты время 00:00:00, а у другой — 15:30:00. Для сравнения только календарных дней используйте НачалоДня(Значение) с обеих сторон.

При отборах по периоду помните про конец дня: условие Дата <= &ДатаОкончания с параметром без времени отсекает все записи позже 00:00:00 этого дня. Правильные варианты — КонецПериода(ДатаОкончания, День) в запросе или КонецДня() в коде.

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

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

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

ТипЗнч(Значение) = Тип("Дата") в отладчике
Норма

Условие истинно для любой даты, включая пустую

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

Условие ложно для заведомой даты — проверьте, не строка ли это

ЗначениеЗаполнено(Значение)
Норма

Истина для реальной даты, Ложь для 01.01.0001

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

Истина для пустой даты — значит, проверка вызывается не для того значения

Преобразование строки в дату
Норма

Функция вернула дату или Неопределено без исключения

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

Исключение прерывает выполнение — нет обработки Попытка/Исключение

Готовая универсальная функция и порядок действий

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

Если значение приходит строкой, сначала попытайтесь преобразовать его в дату, и только потом проверяйте результат. Не используйте ЗначениеЗаполнено как замену проверки типа: для строки «текст» она вернёт Истину, хотя датой значение не является.

Порядок действий
  1. 1
    Определите, что проверяете: значение переменной, реквизит, колонку таблицы или строку из внешнего источника
  2. 2
    Для значения используйте ТипЗнч(Значение) = Тип("Дата"), для метаданных — ОписаниеТипов.СодержитТип()
  3. 3
    Добавьте проверку ЗначениеЗаполнено(), если пустая дата 01.01.0001 недопустима в вашей логике
  4. 4
    Для строки выполните преобразование внутри Попытка/Исключение и проверьте, что результат не Неопределено
  5. 5
    Проверьте результат в отладчике на трёх наборах данных: реальная дата, пустая дата, значение другого типа
Итог

Что важно запомнить

Проверка типа даты строится на ТипЗнч(Значение) = Тип("Дата"). Пустая дата 01.01.0001 проходит эту проверку, поэтому добавляйте ЗначениеЗаполнено(). Строки преобразуйте через Дата() только в формате ГГГГММДД и всегда внутри Попытка/Исключение.

Частые вопросы

Как проверить дату в запросе 1С?

В языке запросов тип реквизита известен из конфигурации, поэтому отдельная проверка типа обычно не требуется. Для составного поля используйте ВЫРАЗИТЬ(Поле КАК ДАТА), а пустую дату отсекайте сравнением с ДАТАВРЕМЯ(1,1,1).

Чем отличается пустая дата от Неопределено?

Неопределено — отсутствие значения вообще, а пустая дата (01.01.0001) — вполне конкретное значение типа «Дата». ТипЗнч для них вернёт разные результаты, а ЗначениеЗаполнено в обоих случаях даст Ложь.

Почему Дата("31.12.2026") вызывает ошибку?

Конструктор Дата() из строки понимает только внутренний формат ГГГГММДД (например, Дата("20261231")). Строку в привычном виде нужно разбить на части и собрать через Дата(Год, Месяц, День), либо использовать XMLЗначение для формата ISO.

Как сравнить две даты без учёта времени?

Примените к обеим функцию НачалоДня(): НачалоДня(Дата1) = НачалоДня(Дата2). Прямое сравнение даст Ложь, если время в значениях различается хотя бы на секунду.

Как проверить тип параметра в отчёте СКД?

Тип параметра задаётся в настройках СКД и проверять его в коде обычно не нужно. Актуальна проверка заполненности: незаданный параметр типа «Дата» равен пустой дате, что искажает отбор — проверяйте в ПриКомпоновкеРезультата или задавайте значение по умолчанию.

Работает ли проверка типа на клиенте и на сервере одинаково?

Да, ТипЗнч, Тип и ЗначениеЗаполнено доступны и на тонком/веб-клиенте, и на сервере. Ограничение касается только ОписаниеТипов в некоторых контекстах — при сомнениях выносите проверку в серверный общий модуль.