Разработка и Конфигурация · 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») и тоже требует обработки исключений.
Функция ЭтоДата(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Дата") Тогда
Возврат ЗначениеЗаполнено(Значение);
КонецЕсли;
Возврат Ложь;
КонецФункцииПроверка дат в запросах и СКД
В языке запросов нет функции определения типа значения, но тип реквизита известен из метаданных, поэтому проверка «это дата» там обычно не нужна. Актуальны другие задачи: сравнение с пустой датой, отбор по периоду и приведение типа составного поля.
Для составного поля (например, регистратора) применяйте ВЫРАЗИТЬ(Поле КАК ДАТА) — значения других типов станут пустыми датами, после чего их можно отфильтровать сравнением с ДАТАВРЕМЯ(1,1,1). Это стандартный приём безопасного приведения типа в запросе.
В СКД проверку типа параметра или вычисляемого поля выполняют в выражении на встроенном языке через те же ТипЗнч и Тип. Если параметр типа «Дата» оставлен пустым, а в отборе используется сравнение «Больше или равно», отчёт вернёт данные с начала времён — задавайте значения по умолчанию или проверяйте заполненность в ПриКомпоновкеРезультата.
Сравнение дат и граничные случаи
Даже корректная дата может вести себя неожиданно при сравнениях. Тип «Дата» хранит время с точностью до секунды, поэтому Дата1 = Дата2 ложно, если у одной даты время 00:00:00, а у другой — 15:30:00. Для сравнения только календарных дней используйте НачалоДня(Значение) с обеих сторон.
При отборах по периоду помните про конец дня: условие Дата <= &ДатаОкончания с параметром без времени отсекает все записи позже 00:00:00 этого дня. Правильные варианты — КонецПериода(ДатаОкончания, День) в запросе или КонецДня() в коде.
Часовые пояса — ещё один источник расхождений в распределённых базах и обменах. Дата, полученная из внешней системы в UTC, при сравнении с локальной датой сеанса может «уехать» на сутки. Если обмен работает в нескольких поясах, приводите значения к единой базе времени перед сравнением.
Как проверить результат
Условие истинно для любой даты, включая пустую
Условие ложно для заведомой даты — проверьте, не строка ли это
Истина для реальной даты, Ложь для 01.01.0001
Истина для пустой даты — значит, проверка вызывается не для того значения
Функция вернула дату или Неопределено без исключения
Исключение прерывает выполнение — нет обработки Попытка/Исключение
Готовая универсальная функция и порядок действий
Для прикладного кода удобно оформить проверку одной функцией в общем модуле: она принимает значение любого типа и отвечает, является ли оно непустой датой. Такой подход избавляет от дублирования конструкций и снижает риск забыть проверку заполненности.
Если значение приходит строкой, сначала попытайтесь преобразовать его в дату, и только потом проверяйте результат. Не используйте ЗначениеЗаполнено как замену проверки типа: для строки «текст» она вернёт Истину, хотя датой значение не является.
- 1Определите, что проверяете: значение переменной, реквизит, колонку таблицы или строку из внешнего источника
- 2Для значения используйте ТипЗнч(Значение) = Тип("Дата"), для метаданных — ОписаниеТипов.СодержитТип()
- 3Добавьте проверку ЗначениеЗаполнено(), если пустая дата 01.01.0001 недопустима в вашей логике
- 4Для строки выполните преобразование внутри Попытка/Исключение и проверьте, что результат не Неопределено
- 5Проверьте результат в отладчике на трёх наборах данных: реальная дата, пустая дата, значение другого типа
Что важно запомнить
Проверка типа даты строится на ТипЗнч(Значение) = Тип("Дата"). Пустая дата 01.01.0001 проходит эту проверку, поэтому добавляйте ЗначениеЗаполнено(). Строки преобразуйте через Дата() только в формате ГГГГММДД и всегда внутри Попытка/Исключение.
Частые вопросы
Как проверить дату в запросе 1С?
В языке запросов тип реквизита известен из конфигурации, поэтому отдельная проверка типа обычно не требуется. Для составного поля используйте ВЫРАЗИТЬ(Поле КАК ДАТА), а пустую дату отсекайте сравнением с ДАТАВРЕМЯ(1,1,1).
Чем отличается пустая дата от Неопределено?
Неопределено — отсутствие значения вообще, а пустая дата (01.01.0001) — вполне конкретное значение типа «Дата». ТипЗнч для них вернёт разные результаты, а ЗначениеЗаполнено в обоих случаях даст Ложь.
Почему Дата("31.12.2026") вызывает ошибку?
Конструктор Дата() из строки понимает только внутренний формат ГГГГММДД (например, Дата("20261231")). Строку в привычном виде нужно разбить на части и собрать через Дата(Год, Месяц, День), либо использовать XMLЗначение для формата ISO.
Как сравнить две даты без учёта времени?
Примените к обеим функцию НачалоДня(): НачалоДня(Дата1) = НачалоДня(Дата2). Прямое сравнение даст Ложь, если время в значениях различается хотя бы на секунду.
Как проверить тип параметра в отчёте СКД?
Тип параметра задаётся в настройках СКД и проверять его в коде обычно не нужно. Актуальна проверка заполненности: незаданный параметр типа «Дата» равен пустой дате, что искажает отбор — проверяйте в ПриКомпоновкеРезультата или задавайте значение по умолчанию.
Работает ли проверка типа на клиенте и на сервере одинаково?
Да, ТипЗнч, Тип и ЗначениеЗаполнено доступны и на тонком/веб-клиенте, и на сервере. Ограничение касается только ОписаниеТипов в некоторых контекстах — при сомнениях выносите проверку в серверный общий модуль.