Разработка и Конфигурация · 10 мин
Как выразить значение как дату в запросе 1С 8.3
Разбираем, как использовать ВЫРАЗИТЬ(Поле КАК ДАТА) в запросах 1С 8.3: синтаксис, состав даты, работа с NULL и строками, типичные ошибки и проверка результата.
При работе с запросами в 1С:Предприятие 8.3 регулярно возникает ситуация, когда поле имеет составной тип данных, содержит строковое представление даты или вовсе значение NULL, а для сравнения, отбора или группировки нужен именно тип «Дата». Оператор ВЫРАЗИТЬ с указанием типа ДАТА решает эту задачу на уровне текста запроса, без дополнительной обработки результата в коде.
Конструкция выглядит так: ВЫРАЗИТЬ(Поле КАК ДАТА). Она применяется в секции ВЫБРАТЬ, в условиях ГДЕ, в соединениях и в параметрах виртуальных таблиц. При этом у типа ДАТА есть особенность: в отличие от ЧИСЛО или СТРОКА, указывать точность в скобках нельзя — платформа сама определяет состав даты по контексту.
Ниже разобраны практические сценарии: приведение составного типа, обрезка времени, работа с NULL, ограничения оператора и способы проверить, что результат получился именно таким, как ожидалось.
Синтаксис ВЫРАЗИТЬ для типа ДАТА
Базовая форма оператора: ВЫРАЗИТЬ(<Выражение> КАК ДАТА). Выражением может быть поле таблицы, параметр запроса, результат функции или вложенный запрос. Оператор допустим в списке выборки, в условии ГДЕ, в условиях соединения и в предложении ИМЕЮЩИЕ.
Пример выборки с приведением поля составного типа:
ВЫБРАТЬ
ВЫРАЗИТЬ(Документ.ДатаОплаты КАК ДАТА) КАК ДатаОплаты
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
Важное отличие от других типов: для ЧИСЛО пишут ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)), для СТРОКА — ВЫРАЗИТЬ(Поле КАК СТРОКА(100)), но для ДАТА параметры в скобках не поддерживаются. Попытка написать ВЫРАЗИТЬ(Поле КАК ДАТА(ДАТА)) приведёт к синтаксической ошибке в конструкторе запроса.
Приведение составного типа к дате
Наиболее частая задача — поле имеет составной тип, например «Дата или Строка» либо «Дата или Число». Пока тип составной, сравнение с датой-константой может работать неочевидно, а сортировка и группировка — давать неожиданный порядок. Приведение через ВЫРАЗИТЬ сужает тип до одного значения.
Значения, которые не являются датой, после приведения превращаются в NULL. Это одновременно и удобно (мусор отфильтровывается), и рискованно (можно потерять данные, если ожидалось другое поведение).
ВЫБРАТЬ
ВЫРАЗИТЬ(Регистр.Период КАК ДАТА) КАК Период
ИЗ
РегистрСведений.КурсыВалют КАК Регистр
ГДЕ
ВЫРАЗИТЬ(Регистр.Период КАК ДАТА) >= &НачалоПериода
Такой приём также используется для устранения «лишних» типов в итоговой таблице запроса: если поле составного типа попадает в результат без обработки, колонка результата тоже будет составной, что усложняет дальнейшую работу с ней в коде и в СКД.
Отсечение времени: дата без времени
Тип ДАТА в 1С всегда содержит и дату, и время с точностью до секунды. Если в поле хранится момент «12.05.2026 14:37:22», а нужно сравнить его с границей дня, прямое сравнение с ДАТАВРЕМЯ(2026, 5, 12) даст ложь, потому что литерал означает полночь.
Сам ВЫРАЗИТЬ время не отсекает — он только приводит тип. Для обрезки времени применяется функция НАЧАЛОПЕРИОДА, часто в сочетании с ВЫРАЗИТЬ:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ВЫРАЗИТЬ(Заказ.ДатаОтгрузки КАК ДАТА), ДЕНЬ) КАК ДеньОтгрузки,
СУММА(Заказ.Сумма) КАК Сумма
ИЗ
Документ.ЗаказПокупателя КАК Заказ
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ВЫРАЗИТЬ(Заказ.ДатаОтгрузки КАК ДАТА), ДЕНЬ)
Аналогично работают периоды НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ и ГОД — это стандартный способ построить группировку по периодам в отчётах. Обратная функция КОНЕЦПЕРИОДА возвращает последнюю секунду периода, что удобно для условий «по дату включительно».
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ВЫРАЗИТЬ(Док.Дата КАК ДАТА), МЕСЯЦ) КАК Месяц
ИЗ
Документ.ПриходныйОрдер КАК ДокРабота с NULL и пустыми датами
Если исходное поле содержит NULL (например, после левого соединения), то ВЫРАЗИТЬ(NULL КАК ДАТА) вернёт NULL, а не пустую дату. Это важно при сравнениях: условие Поле = ДАТАВРЕМЯ(1, 1, 1) не сработает для NULL, потому что сравнение с NULL всегда даёт «неизвестно».
Для подстановки значения по умолчанию используйте ЕСТЬNULL внутри или снаружи ВЫРАЗИТЬ:
ВЫБРАТЬ
ЕСТЬNULL(ВЫРАЗИТЬ(Связь.ДатаДокумента КАК ДАТА), ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаДокумента
ИЗ
Документ.СчетНаОплату КАК Счет
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязанныеДокументы КАК Связь
ПО Счет.Ссылка = Связь.Документ
Проверка на пустую дату после приведения выполняется либо через ЕСТЬ NULL, либо через сравнение с ДАТАВРЕМЯ(1, 1, 1) — в зависимости от того, что именно нужно отловить: отсутствие значения или незаполненную дату.
Как проверить результат
Колонка имеет тип Дата, значения отображаются как даты
Тип остался составным или появились NULL там, где ожидались даты
Записи за граничный день попадают в выборку
Записи последнего дня теряются из-за времени в дате
Совпадает, NULL появились только там, где тип не дата
Часть строк неожиданно дала NULL — в данных строки вместо дат
Использование в параметрах виртуальных таблиц и СКД
В параметрах виртуальных таблиц регистров (Остатки, Обороты, ОстаткиИОбороты) период передаётся параметром. Если параметр в вашем запросе имеет составной тип или приходит как произвольное значение, его тоже можно привести: Период = ВЫРАЗИТЬ(&Период КАК ДАТА). Это защищает от ошибки несоответствия типов при выполнении.
В СКД приведение к дате встречается ещё чаще: поля набора данных, вычисляемые поля и параметры отчёта должны иметь однозначный тип, иначе настройки отбора и группировки в пользовательском режиме начинают вести себя непредсказуемо. Поэтому поля периодов в запросе набора данных принято сразу оборачивать в ВЫРАЗИТЬ или НАЧАЛОПЕРИОДА.
Отдельный случай — отборы в динамических списках. Если поле списка составного типа, отбор по дате может не сработать; приведение типа в произвольном запросе списка решает проблему без изменения конфигурации.
- 1Откройте консоль запросов и выполните запрос без ВЫРАЗИТЬ — посмотрите фактический тип поля
- 2Добавьте ВЫРАЗИТЬ(Поле КАК ДАТА) и проверьте, не появились ли неожиданные NULL
- 3Если нужна дата без времени — оберните результат в НАЧАЛОПЕРИОДА(..., ДЕНЬ)
- 4Проверьте условия ГДЕ: замените сравнение с NULL на ЕСТЬ NULL или ЕСТЬNULL
- 5Сравните количество строк и контрольные суммы до и после изменения запроса
Ограничения и типичные ошибки
Главное ограничение: ВЫРАЗИТЬ не выполняет разбор строк. Текст «2026-05-12» или «12.05.2026» в дату через запрос не превратить — язык запросов не содержит функции аналогичной Дата() из строки. Такие данные преобразуют заранее в коде, либо выгружают во временную таблицу с уже готовым типом.
Вторая ловушка — попытка указать состав даты. В отличие от описания типа в конфигураторе, где можно выбрать «Дата», «Время» или «Дата и время», в запросе такой настройки нет: приведение всегда даёт дату со временем. Управлять составом можно только через НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА.
Третья распространённая ошибка — использование ВЫРАЗИТЬ там, где он не нужен. Если поле уже имеет тип Дата, лишнее приведение не навредит, но загромождает текст и может мешать оптимизатору. Применяйте оператор осознанно: для сужения составного типа, для параметров и для устранения неоднозначности в соединениях.
Альтернативы ВЫРАЗИТЬ для работы с датами
Не для каждой задачи нужен именно ВЫРАЗИТЬ. Для указания конкретной даты-константы в запросе используется литерал ДАТАВРЕМЯ(2026, 5, 12) или ДАТАВРЕМЯ(2026, 5, 12, 23, 59, 59). Для получения частей даты — функции ГОД, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА, а также ДЕНЬНЕДЕЛИ и ДЕНЬГОДА.
Для сдвига даты применяется ДОБАВИТЬКДАТЕ с положительным или отрицательным количеством единиц, а для вычисления интервала — РАЗНОСТЬДАТ. Эти функции часто идут в связке с ВЫРАЗИТЬ, когда сначала нужно гарантировать тип, а затем выполнить арифметику.
Если же задача — преобразовать строку в дату, единственный корректный путь — встроенный язык: функция Дата(СтрокаВФорматеISO) для формата «ГГГГММДД» или собственный разбор строки, после чего готовое значение передаётся в запрос параметром или через временную таблицу.
Сравнение подходов
Сужает составной тип до даты, убирает лишние типы. Не обрезает время и не разбирает строки.
Отсекает время для сравнений и группировок по периодам. Требует, чтобы поле уже было датой.
Самый надёжный способ передать дату из кода. Тип контролируется на стороне встроенного языка.
Литерал конкретной даты в тексте запроса. Подходит только для фиксированных значений.
FAQ
Можно ли указать точность даты, как у ЧИСЛО(15, 2)?
Нет. У типа ДАТА в операторе ВЫРАЗИТЬ нет параметров в скобках — платформа выдаст синтаксическую ошибку. Составом даты управляют функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, а не само приведение типа.
Почему после ВЫРАЗИТЬ(Поле КАК ДАТА) в результате появились NULL?
Потому что часть значений поля не является датой — например, строки или числа в поле составного типа. ВЫРАЗИТЬ не преобразует их, а заменяет на NULL. Проверьте исходные данные и при необходимости обработайте их в коде до запроса.
Как преобразовать строку «20260512» в дату прямо в запросе?
Никак — язык запросов не умеет разбирать строки в даты. Преобразуйте значение во встроенном языке функцией Дата() и передайте результат в запрос параметром или через временную таблицу.
Как сравнить дату документа с конкретным днём без учёта времени?
Оберните поле в НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) и сравните с ДАТАВРЕМЯ(год, месяц, день). Либо используйте диапазон: больше либо равно началу дня и меньше начала следующего дня.
Чем отличается пустая дата от NULL в результате запроса?
Пустая дата — это значение 01.01.0001 00:00:00, оно сравнивается обычными операторами. NULL означает отсутствие значения и требует проверки через ЕСТЬ NULL. После ВЫРАЗИТЬ при неподходящем типе исходных данных получается именно NULL.
Нужно ли применять ВЫРАЗИТЬ, если поле уже имеет тип Дата?
Нет, в этом нет смысла: тип не изменится, а текст запроса станет длиннее. Оператор оправдан для составных типов, параметров неопределённого типа и полей из соединений, где тип может быть неоднозначным.
Что важно запомнить
ВЫРАЗИТЬ(Поле КАК ДАТА) приводит составной тип к дате без параметров в скобках. Строки в даты оператор не преобразует — они станут NULL. Для отсечения времени используйте НАЧАЛОПЕРИОДА, для подстановки значения вместо NULL — ЕСТЬNULL. Перед применением проверьте фактический тип поля и контрольные итоги результата.