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

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

Как в запросе 1С 8 выразить значение как дату

Как применить ВЫРАЗИТЬ КАК ДАТА в запросе 1С 8: синтаксис, приведение строки к дате, сравнение с ДАТАВРЕМЯ, типичные ошибки и проверка результата.

Функция ВЫРАЗИТЬ в языке запросов 1С 8 приводит значение поля к указанному типу. Конструкция ВЫРАЗИТЬ(Поле КАК ДАТА) нужна, когда тип реквизита составной, когда поле хранит строку с датой, либо когда требуется отсечь время у значения типа «Дата и время». Без явного приведения сравнение и соединение по таким полям часто дают пустой результат или ошибку запроса.

Важно понимать ограничение: в запросе 1С нельзя произвольно преобразовать строку «31.12.2026» в дату — функция ВЫРАЗИТЬ работает с типами, уже совместимыми с датой. Для строкового представления даты применяют другие подходы, которые разобраны ниже вместе с типичными ошибками и способами проверки результата.

Синтаксис ВЫРАЗИТЬ КАК ДАТА и когда она нужна

Общий вид конструкции: ВЫРАЗИТЬ(Выражение КАК ДАТА). В отличие от числа и строки, у типа ДАТА в запросе не указываются квалификаторы — длина и точность для даты не задаются. Если попытаться написать ВЫРАЗИТЬ(Поле КАК ДАТА(10)), конструктор запроса выдаст ошибку синтаксиса.

Основные сценарии применения: поле имеет составной тип (например, «Дата» и «Строка») и нужно выбрать только даты; значение типа «Дата и время» требуется сравнить с датой без времени; поле ссылочного типа приводится для соединения таблиц, где с одной стороны хранится дата. Во всех случаях приведение выполняется на уровне СУБД, поэтому лишних обходов результата в коде не требуется.

Приведение составного типа к дате

Типичная ситуация — реквизит с составным типом, например поле «Значение» в регистре сведений или табличной части, где могут храниться строки, числа и даты. Запрос с фильтром ГДЕ Значение = &Дата без приведения может не найти записи из-за различия типов параметра и поля.

ВЫБРАТЬ

ВЫРАЗИТЬ(ЗначенияСвойств.Значение КАК ДАТА) КАК ДатаЗначения

ИЗ

РегистрСведений.ЗначенияСвойств КАК ЗначенияСвойств

ГДЕ

ВЫРАЗИТЬ(ЗначенияСвойств.Значение КАК ДАТА) = &Дата

Значения, которые не являются датами, после приведения станут NULL. Это удобно для фильтрации: условие ВЫРАЗИТЬ(Поле КАК ДАТА) ЕСТЬ НЕ NULL оставит только записи, где реально хранится дата.

Как отсечь время у даты в запросе

Реквизиты документов (например, «Дата» документа) хранят дату с точностью до секунды. Сравнение Документ.Дата = &Дата, где параметр задан как начало дня, не найдёт документы, проведённые в середине дня. Для сравнения по календарной дате применяют функцию НАЧАЛОПЕРИОДА.

ВЫБРАТЬ

Реализация.Ссылка,

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК ДатаБезВремени

ИЗ

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

ГДЕ

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) = &Дата

Альтернатива — сравнение через МЕЖДУ: Документ.Дата МЕЖДУ &НачалоДня И &КонецДня, где границы вычисляются на встроенном языке функциями НачалоДня() и КонецДня(). Такой вариант часто быстрее, потому что позволяет использовать индекс по полю даты, тогда как функция в условии может отключить индексный поиск.

Сравнение вариантов

НАЧАЛОПЕРИОДА(Поле, ДЕНЬ)

Удобно и читаемо, но функция над полем может отключить использование индекса на больших таблицах.

МЕЖДУ НачалоДня И КонецДня

Поле остаётся «чистым», индекс работает; минус — границы нужно вычислять в коде и передавать параметрами.

ВЫРАЗИТЬ КАК ДАТА

Подходит для составных типов и приведения, но не является инструментом отсечения времени в чистом виде.

Строка в дату: ограничение ВЫРАЗИТЬ и обходные пути

Частая ошибка — попытка написать ВЫРАЗИТЬ("31.12.2026" КАК ДАТА) или привести строковое поле регистра к дате. Язык запросов 1С не выполняет разбор строки как даты: результатом будет NULL либо ошибка на уровне СУБД, в зависимости от платформы. Функции преобразования строки в дату в запросе не существует.

Рабочие варианты: конструктор ДАТАВРЕМЯ(2026, 12, 31) или ДАТАВРЕМЯ(2026, 12, 31, 23, 59, 59) для литеральных дат прямо в тексте запроса; передача готовой даты параметром из кода (Запрос.УстановитьПараметр("Дата", Дата(2026,12,31))); предварительная обработка строки на встроенном языке с помещением результата во временную таблицу.

Типичные ошибки
01
ВЫРАЗИТЬ(СтроковоеПоле КАК ДАТА) в надежде распарсить строку — результат NULL, записи теряются без предупреждения.
02
Сравнение даты документа с параметром без отсечения времени — документы за день не попадают в выборку.
03
Указание квалификаторов ДАТА(10) — синтаксическая ошибка, у типа ДАТА квалификаторов нет.
04
Приведение к дате поля, которое уже имеет тип Дата, — лишняя нагрузка на СУБД и шум в тексте запроса.

Параметры запроса и тип даты

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

Защититься можно двумя способами: всегда вызывать УстановитьПараметр до выполнения, даже для пустой даты (Дата(1,1,1)), либо явно типизировать параметр в тексте: ГДЕ Поле = ВЫРАЗИТЬ(&Дата КАК ДАТА). Второй вариант делает запрос устойчивым к «пустым» параметрам, но добавляет приведение в план выполнения.

Порядок действий при приведении к дате
  1. 1
    Определите фактический тип поля в конфигураторе: составной, дата со временем или строка.
  2. 2
    Для составного типа примените ВЫРАЗИТЬ(Поле КАК ДАТА) и добавьте проверку ЕСТЬ НЕ NULL.
  3. 3
    Для отсечения времени используйте НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) или диапазон МЕЖДУ.
  4. 4
    Для строковых значений преобразуйте данные в коде и передайте дату параметром или временной таблицей.
  5. 5
    Выполните запрос в консоли запросов и проверьте тип и значения колонки результата.

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

Проверять приведение удобно в консоли запросов: выведите поле до и после ВЫРАЗИТЬ рядом и сравните значения. Если в приведённой колонке сплошные NULL при заведомо заполненных данных — тип исходного поля несовместим с датой, чаще всего это строка.

По производительности: любая функция над полем в условии ГДЕ (включая ВЫРАЗИТЬ и НАЧАЛОПЕРИОДА) может помешать оптимизатору использовать индекс. На больших таблицах предпочтительнее выносить вычисления в параметры или во временные таблицы, оставляя поле в условии без обёрток.

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

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

Колонка после ВЫРАЗИТЬ
Норма

Даты отображаются корректно, NULL только у записей без даты

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

Сплошные NULL при заполненных данных — исходный тип строковый

Сравнение по дню
Норма

Выбираются все документы за день независимо от времени

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

Находятся только документы с временем 00:00:00

Выполнение запроса
Норма

Запрос выполняется без ошибок типов

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

Ошибка несовместимости типов в операции сравнения

Итог

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

ВЫРАЗИТЬ(Поле КАК ДАТА) приводит совместимые и составные типы к дате, несовместимые превращает в NULL. Время отсекают через НАЧАЛОПЕРИОДА или диапазон МЕЖДУ, строку в дату в запросе не преобразуют — используют ДАТАВРЕМЯ или параметры из кода.

Часто задаваемые вопросы

Можно ли в запросе 1С преобразовать строку «01.01.2026» в дату?

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

Чем ВЫРАЗИТЬ КАК ДАТА отличается от НАЧАЛОПЕРИОДА?

ВЫРАЗИТЬ меняет тип значения, а НАЧАЛОПЕРИОДА возвращает начало указанного периода (дня, месяца, года) для значения, уже являющегося датой. Для отсечения времени правильный инструмент — НАЧАЛОПЕРИОДА(Поле, ДЕНЬ).

Почему после ВЫРАЗИТЬ КАК ДАТА все значения стали NULL?

Исходное поле имеет тип, несовместимый с датой — чаще всего строку. Проверьте тип реквизита в конфигураторе и измените подход: строковые данные нужно конвертировать в коде до выполнения запроса.

Как сравнить дату документа с датой без времени?

Либо оберните поле: НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = &Дата, либо используйте условие Документ.Дата МЕЖДУ &НачалоДня И &КонецДня, вычислив границы функциями НачалоДня() и КонецДня() в коде. Второй вариант лучше для больших таблиц.

Нужно ли указывать длину у типа ДАТА в ВЫРАЗИТЬ?

Нет. У типа ДАТА в языке запросов нет квалификаторов длины и точности, в отличие от ЧИСЛО и СТРОКА. Запись ДАТА(10) вызовет синтаксическую ошибку.

Запрос ругается на параметр-дату, хотя параметр задан. Что делать?

Убедитесь, что УстановитьПараметр вызывается до Выполнить() и что передаётся именно значение типа Дата, а не строка. Для устойчивости можно типизировать параметр в тексте: ВЫРАЗИТЬ(&Дата КАК ДАТА).