Разработка и Конфигурация · 11 мин
ВЫРАЗИТЬ КАК ДАТА в языке запросов 1С
Как использовать ВЫРАЗИТЬ КАК ДАТА в запросах 1С: синтаксис, приведение строк и чисел к дате, ограничения типов, типичные ошибки и проверка результата.
Функция ВЫРАЗИТЬ в языке запросов 1С приводит значение поля или параметра к указанному типу, и приведение к дате — одна из самых частых задач: составные типы реквизитов, строки с датами в текстовом формате, уточнение типа параметра для СКД. Без явного приведения запрос может вернуть NULL, не сработать в отборе или выдать ошибку ещё на этапе проверки текста запроса.
Приведение к дате решает три практические задачи: уточнение типа составного поля (чтобы сравнение и соединение работали корректно), преобразование строкового представления даты в настоящий тип Дата и ограничение типа параметра, передаваемого в запрос. Важно понимать: ВЫРАЗИТЬ не конвертирует значение по сложным правилам — она либо приводит совместимый тип, либо возвращает NULL.
Материал ниже разбирает синтаксис, допустимые источники для приведения, работу с составными типами, преобразование строк, типичные ошибки и способы проверить результат до того, как запрос попадёт в рабочую базу.
Синтаксис ВЫРАЗИТЬ КАК ДАТА и базовые примеры
Общий вид конструкции: ВЫРАЗИТЬ(Выражение КАК ДАТА). Выражением может быть поле таблицы, параметр запроса или вложенное выражение. Тип ДАТА в языке запросов не принимает дополнительных параметров — в отличие от СТРОКА(длина) или ЧИСЛО(длина, точность), скобки после ДАТА не пишутся.
Типичный пример — уточнение типа реквизита составного типа. Если поле «ПериодОплаты» может хранить дату или строку, сравнение с параметром-датой без приведения даст некорректный результат или ошибку:
ВЫБРАТЬ
ВЫРАЗИТЬ(Платежи.ПериодОплаты КАК ДАТА) КАК ДатаОплаты
ИЗ
РегистрСведений.Платежи КАК Платежи
ГДЕ
ВЫРАЗИТЬ(Платежи.ПериодОплаты КАК ДАТА) >= &НачалоПериода
Второй частый сценарий — приведение параметра. Если параметр передаётся в запрос как значение неопределённого или составного типа, явное указание типа помогает построителю запроса и СКД правильно сформировать SQL-обращение: ГДЕ Документ.Дата = ВЫРАЗИТЬ(&ДатаОтбора КАК ДАТА).
Результат приведения попадает в выборку как полноценная дата: его можно сравнивать, передавать в функции НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, РАЗНОСТЬДАТ и использовать в группировках.
Какие значения можно привести к дате, а какие нельзя
ВЫРАЗИТЬ — это не универсальный конвертер. Конструкция корректно работает, когда исходное значение уже является датой (например, внутри составного типа) или когда платформа способна выполнить неявное совместимое приведение. Во всех остальных случаях результатом будет NULL либо ошибка на этапе исполнения запроса.
На практике поведение выглядит так: дата внутри составного типа приводится к дате без потерь; строка, содержащая дату, через ВЫРАЗИТЬ в дату не преобразуется — результат будет NULL или запрос не пройдёт проверку, в зависимости от контекста и СУБД; число также не превращается в дату напрямую. Это принципиальное ограничение, о котором часто забывают.
| Исходное значение | Результат ВЫРАЗИТЬ КАК ДАТА |
|---|---|
| Дата в составном типе | Дата, значение сохраняется |
| Строка с датой в тексте | NULL или ошибка — преобразования нет |
| Число | NULL, приведение не выполняется |
| Значение другого ссылочного типа | NULL |
| Пустая дата (0001-01-01) | Пустая дата, сохраняется |
Вывод простой: ВЫРАЗИТЬ КАК ДАТА — инструмент уточнения типа, а не парсинга. Если задача именно в преобразовании строки, читайте раздел про обходные приёмы.
Работа с составными типами и NULL
Составной тип — главная причина, по которой вообще нужно ВЫРАЗИТЬ. Когда реквизит объявлен как «Дата или Строка» либо «Дата или ДокументСсылка», платформа хранит значения разных типов в одном поле. Без приведения соединение по такому полю с таблицей, где тип строго «Дата», может работать медленно или давать неожиданные результаты, а сравнение в условии — возвращать ложь там, где вы ожидали истину.
Приведение отсекает «чужие» типы: все значения, не являющиеся датой, превращаются в NULL. Это удобно использовать как фильтр: ГДЕ НЕ ВЫРАЗИТЬ(Поле КАК ДАТА) ЕСТЬ NULL фактически означает «оставить только строки, где поле содержит дату».
Для обработки возможных NULL комбинируйте ВЫРАЗИТЬ с ЕСТЬNULL. Например, заменить NULL на пустую дату, чтобы не ломать последующие вычисления: ЕСТЬNULL(ВЫРАЗИТЬ(Поле КАК ДАТА), ДАТАВРЕМЯ(1,1,1)). Функция ДАТАВРЕМЯ(1,1,1) возвращает пустую дату — это стандартный способ задать её литералом в запросе.
Если составное поле участвует в соединении, приведите его к дате в подзапросе или временной таблице, а соединяйтесь уже по приведённому полю. Так план запроса на СУБД обычно получается предсказуемее, чем при приведении прямо в условии соединения.
Преобразование строки в дату: рабочие приёмы
Так как ВЫРАЗИТЬ строку в дату не преобразует, для текстовых данных применяют обходные пути. Самый надёжный — выполнить преобразование в коде на встроенном языке до формирования запроса и передать результат параметром типа Дата. Функции Дата() в коде или собственный парсер строки решают задачу без ограничений языка запросов.
Если преобразование требуется именно внутри запроса и формат строки строго фиксирован (например, «ГГГГММДД»), можно собрать дату через ПОДСТРОКУ и ДАТАВРЕМЯ. ДАТАВРЕМЯ принимает числовые аргументы: год, месяц, день, а ПОДСТРОКА вырезает фрагменты строки, которые затем приводятся к числу через ВЫРАЗИТЬ(... КАК ЧИСЛО):
ВЫБРАТЬ
ДАТАВРЕМЯ(
ВЫРАЗИТЬ(ПОДСТРОКА(Данные.СтрокаДаты, 1, 4) КАК ЧИСЛО(4, 0)),
ВЫРАЗИТЬ(ПОДСТРОКА(Данные.СтрокаДаты, 5, 2) КАК ЧИСЛО(2, 0)),
ВЫРАЗИТЬ(ПОДСТРОКА(Данные.СтрокаДаты, 7, 2) КАК ЧИСЛО(2, 0))
) КАК ДатаИзСтроки
ИЗ
ВнешниеДанные КАК Данные
У этого приёма жёсткие ограничения: формат строк должен быть одинаковым во всех записях, иначе приведение к числу даст NULL и ДАТАВРЕМЯ вернёт пустую дату. Перед применением в боевом запросе проверьте выборку на аномальные значения — отберите строки, где результат равен пустой дате, а исходная строка не пустая.
- 1Убедитесь, что формат строки во всех записях одинаковый (например, ГГГГММДД)
- 2Проверьте длину строк и отсутствие лишних символов выборкой по фрагментам
- 3Соберите дату через ДАТАВРЕМЯ и ПОДСТРОКУ с приведением фрагментов к ЧИСЛО
- 4Проверьте результат: найдите строки, где исходное значение заполнено, а дата пустая
- 5При смешанных форматах перенесите преобразование в код и передайте дату параметром
Приведение параметров и работа в СКД
В динамических списках, отчётах на СКД и произвольных запросах параметр часто приходит без явного типа. Если параметр используется в сравнении с датой, явное приведение ВЫРАЗИТЬ(&Параметр КАК ДАТА) страхует от ситуации, когда в параметр попало значение другого типа — сравнение тогда молча не сработает, и отчёт покажет пустой результат без какой-либо ошибки.
В схеме компоновки данных у параметра можно задать тип в настройках, но приведение в тексте запроса добавляет защиту на случай, если отчёт вызывается программно и тип параметра контролируется слабее. Особенно это актуально для параметров-периодов, куда пользовательский код может передать, например, границу или строку.
Отдельный случай — поля-периоды виртуальных таблиц регистров. Их приводить не нужно: они уже имеют тип Дата. Лишнее ВЫРАЗИТЬ вокруг поля «Период» не навредит, но и пользы не даст, а текст запроса усложнит.
Типичные ошибки и как их избежать
Первая и самая распространённая ошибка — ожидание, что ВЫРАЗИТЬ распарсит строку. Разработчик пишет ВЫРАЗИТЬ(СтроковоеПоле КАК ДАТА), получает NULL по всем строкам и долго ищет проблему в данных, хотя причина в самом подходе.
Вторая ошибка — приведение в условии соединения без необходимости. Если оба поля уже имеют тип Дата, оборачивание в ВЫРАЗИТЬ может помешать СУБД использовать индекс по полю, и запрос на больших таблицах замедлится. Применяйте приведение только там, где тип действительно составной или неопределённый.
Третья ошибка — игнорирование NULL после приведения. Если дальше по тексту идёт сравнение приведённого поля с датой, строки с NULL просто выпадут из результата. Если это не задумано, оборачивайте выражение в ЕСТЬNULL с осмысленным значением по умолчанию.
Проверка результата и границы применения
Проверять приведение удобнее всего в консоли запросов на копии базы или на ограниченной выборке. Добавьте в запрос и исходное поле, и приведённое, и поле-признак: ВЫБОР КОГДА ВЫРАЗИТЬ(Поле КАК ДАТА) ЕСТЬ NULL ТОГДА ""Не дата"" ИНАЧЕ ""Дата"" КОНЕЦ. Так вы сразу увидите, сколько значений потерялось при приведении и какие именно.
Контрольный признак корректной работы: количество строк с непустым исходным значением типа дата совпадает с количеством строк, где приведённое поле не NULL. Если цифры расходятся — в данных есть значения других типов, и нужно решать, фильтровать их или обрабатывать отдельно.
Как проверить результат
Значение совпадает с исходной датой
NULL там, где исходное значение — дата
Ожидаемый NULL, строки осознанно исключены
NULL трактуется как ошибка данных, хотя причина в типе
Отбор возвращает ожидаемые строки
Пустой результат при заведомо подходящих данных — проверьте тип параметра
Безопасная граница самостоятельной работы: любые эксперименты с текстом запроса выполняйте в консоли запросов на копии базы. Запросы на выборку не меняют данные, но тяжёлый запрос с приведением в соединении на большой рабочей базе может надолго занять соединение с СУБД — сначала оцените выборку с ограничением (первые записи), потом запускайте полный вариант.
Что важно запомнить
ВЫРАЗИТЬ(Поле КАК ДАТА) уточняет тип, но не парсит строки: несовместимые значения становятся NULL. Для строк фиксированного формата собирайте дату через ДАТАВРЕМЯ и ПОДСТРОКУ или преобразуйте значение в коде и передайте параметром. Всегда проверяйте результат на NULL и не применяйте приведение там, где тип уже дата.
Частые вопросы
Как в запросе 1С записать конкретную дату литералом?
Используйте функцию ДАТАВРЕМЯ с числовыми аргументами: ДАТАВРЕМЯ(2026, 1, 15) или с временем — ДАТАВРЕМЯ(2026, 1, 15, 10, 30, 0). Пустая дата записывается как ДАТАВРЕМЯ(1,1,1). Строковый литерал «20260115» датой не является и в сравнении с датой работать не будет.
Почему ВЫРАЗИТЬ(Строка КАК ДАТА) возвращает NULL?
Потому что ВЫРАЗИТЬ не выполняет разбор текста — она только уточняет тип для совместимых значений. Строка и дата несовместимы для такого приведения, поэтому результат NULL. Преобразуйте строку в дату в коде до запроса либо соберите дату через ДАТАВРЕМЯ и ПОДСТРОКА при строго фиксированном формате.
Можно ли указать дробную часть или формат у типа ДАТА, как у ЧИСЛО?
Нет. Тип ДАТА в языке запросов не имеет параметров в скобках — запись ДАТА(8) вызовет ошибку. Если нужно отсечь время и оставить только календарную дату, используйте НАЧАЛОПЕРИОДА(Поле, ДЕНЬ), а не приведение типа.
Чем отличается ВЫРАЗИТЬ КАК ДАТА от НАЧАЛОПЕРИОДА?
ВЫРАЗИТЬ меняет тип значения, сохраняя его содержимое: дата с временем останется датой с временем. НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) оставляет тип датой, но сдвигает значение на начало суток. Для сравнения «в пределах дня» обычно нужна именно НАЧАЛОПЕРИОДА или КОНЕЦПЕРИОДА, а не приведение типа.
Нужно ли приводить параметр к дате, если в коде я передал значение типа Дата?
Строго необязательно, но безвредно и часто полезно: если запрос позже будут вызывать из другого места или параметр попадёт в СКД, явное приведение защитит от передачи значения другого типа, при котором сравнение молча перестанет срабатывать.
Как привести к дате поле в запросе к виртуальной таблице регистра?
Поля «Период» виртуальных таблиц уже имеют тип Дата, приведение не требуется. Если вы соединяете виртуальную таблицу с другой таблицей по периоду, приводить нужно только вторую сторону — когда там составной или неопределённый тип.