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