Разработка и Конфигурация · 12 мин
ВЫРАЗИТЬ КАК ДАТА в запросе 1С: синтаксис, примеры и ограничения
Как использовать ВЫРАЗИТЬ КАК ДАТА в запросах 1С: синтаксис, преобразование строки и числа в дату, обрезание времени, типичные ошибки и проверка результата.
Функция ВЫРАЗИТЬ в языке запросов 1С приводит значение поля или параметра к указанному типу. Вариант ВЫРАЗИТЬ(... КАК ДАТА) применяется, когда данные хранятся в составном типе, строке или числе, а для отбора, группировки или сортировки нужны именно даты. Без приведения типов запрос либо не выполнится, либо вернёт неожиданный результат — например, отбор по периоду не сработает для строкового представления даты.
На практике ВЫРАЗИТЬ КАК ДАТА чаще всего используют в трёх ситуациях: обрезание времени у значения «дата и время», приведение составного поля к дате для корректного соединения таблиц и преобразование строки или числа, загруженных из внешних источников. Каждый сценарий имеет свои ограничения, и не все преобразования выполняются на уровне СУБД — часть из них платформа просто не умеет делать в запросе.
Важно понимать: ВЫРАЗИТЬ не «чинит» данные, а лишь интерпретирует их по-другому. Если в строке записан текст, который не является датой в ожидаемом формате, результатом будет пустая дата (01.01.0001 00:00:00), а не сообщение об ошибке. Поэтому после преобразования результат всегда стоит проверять.
Синтаксис ВЫРАЗИТЬ КАК ДАТА и базовый пример
Общий вид конструкции: ВЫРАЗИТЬ(Выражение КАК ДАТА). В качестве выражения может выступать поле таблицы, параметр запроса, результат другой функции или вложенный запрос. Для типа ДАТА дополнительно можно указать состав — ДАТА или ВРЕМЯ, но в круглых скобках после типа для даты указывается именно состав даты: ВЫРАЗИТЬ(Поле КАК ДАТА) достаточно в большинстве случаев.
Простейший пример — приведение параметра к дате, когда тип параметра заранее не задан:
ВЫБРАТЬ
Продажи.Регистратор,
Продажи.Количество
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Период >= ВЫРАЗИТЬ(&НачалоПериода КАК ДАТА)
Такая запись гарантирует, что параметр будет интерпретирован как дата, даже если в запрос передано значение составного типа или значение пришло из механизма, где тип не зафиксирован. Это также помогает построителю запроса и СКД корректно определить тип поля.
Отсечение времени у даты
Самая частая практическая задача — получить из поля с составом «дата и время» только календарный день, чтобы сгруппировать данные по дням или сравнить с границей периода. Значения типа «дата и время» в 1С хранят время с точностью до секунды, и прямое сравнение с датой без времени даёт неожиданные результаты: документ от 15.03. 14:25 не равен дате 15.03 00:00.
Для отсечения времени применяют функцию НАЧАЛОПЕРИОДА, а не ВЫРАЗИТЬ, — это важное различие. ВЫРАЗИТЬ КАК ДАТА не обрезает время: если в поле уже хранится дата с временем, результат сохранит временную часть. Правильный приём:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,
СУММА(Продажи.Количество) КАК Количество
ИЗ
РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)
Если же требуется наоборот — зафиксировать, что поле должно трактоваться как дата без времени (например, в составном типе), тогда уместно ВЫРАЗИТЬ(Поле КАК ДАТА). Но помните: временная составляющая при этом физически не удаляется, она лишь не участвует в представлении результата на уровне типа.
Приведение составного типа к дате
Когда реквизит имеет составной тип (например, «дата, строка, число»), операции сравнения и соединения по нему работают с учётом всех типов, что замедляет запрос и может давать ложные совпадения. Приведение к конкретному типу решает обе проблемы:
ВЫБРАТЬ
ВЫРАЗИТЬ(Операции.ДатаОперации КАК ДАТА) КАК ДатаОперации
ИЗ
РегистрСведений.Операции КАК Операции
ГДЕ
ВЫРАЗИТЬ(Операции.ДатаОперации КАК ДАТА) МЕЖДУ &Дата1 И &Дата2
Значения, не являющиеся датами, после приведения превратятся в пустую дату 01.01.0001. Это удобно для фильтрации «мусора»: достаточно добавить условие, что приведённое значение больше пустой даты. Но если такие значения нужно сохранить в выборке, используйте конструкцию ВЫБОР с проверкой через ЕСТЬ NULL или сравнением с пустой датой.
При соединении таблиц по составному полю приведение типа на обеих сторонах соединения ускоряет выполнение: СУБД получает однотипные поля и может эффективно использовать индексы. Без приведения соединение по составному типу — один из классических источников медленных запросов.
Строка или число в дату: что работает, а что нет
Здесь кроется главное ограничение. ВЫРАЗИТЬ(СтроковоеПоле КАК ДАТА) в большинстве случаев не выполнит осмысленное преобразование: язык запросов 1С не умеет разбирать произвольные строковые форматы дат вроде «15.03.2026» или «2026-03-15». Результатом будет пустая дата. Это принципиальное отличие от функции Дата() во встроенном языке, которая умеет разбирать строки.
Если даты хранятся в строковом виде (типично для данных, загруженных из Excel, CSV или внешних API), варианты решения такие:
- преобразовать строку в дату при загрузке данных средствами встроенного языка и хранить в базе уже тип Дата — самый надёжный вариант;
- собрать дату в запросе из частей через ДАТАВРЕМЯ(Год, Месяц, День), если части хранятся отдельными полями или их можно извлечь функцией ПОДСТРОКА;
- выполнить сравнение лексикографически, если строки в формате ГГГГММДД — такой формат корректно сортируется и сравнивается как строка.
Пример сборки даты из строковых фрагментов:
ВЫБРАТЬ
ДАТАВРЕМЯ(
ВЫРАЗИТЬ(ПОДСТРОКА(Данные.СтрокаДаты, 7, 4) КАК ЧИСЛО(4, 0)),
ВЫРАЗИТЬ(ПОДСТРОКА(Данные.СтрокаДаты, 4, 2) КАК ЧИСЛО(2, 0)),
ВЫРАЗИТЬ(ПОДСТРОКА(Данные.СтрокаДаты, 1, 2) КАК ЧИСЛО(2, 0))
) КАК ДатаИзСтроки
ИЗ
ВнешниеДанные КАК Данные
Такой приём работает только при строго фиксированном формате исходной строки. Если в данных встречаются пропуски, другой разделитель или смещённые позиции, преобразование даст неверные значения или ошибку выполнения запроса.
Проверка результата преобразования
Главный признак того, что преобразование не сработало, — пустые даты в результате. Проверить это просто: добавьте в запрос поле с исходным значением рядом с приведённым и сравните. Если исходное значение заполнено, а приведённое равно 01.01.0001, значит, формат данных не совместим с преобразованием.
Для массовой проверки удобно посчитать количество «обнулённых» значений:
ВЫБРАТЬ
КОЛИЧЕСТВО(*) КАК ВсегоСтрок,
СУММА(ВЫБОР
КОГДА ВЫРАЗИТЬ(Данные.Поле КАК ДАТА) = ДАТАВРЕМЯ(1, 1, 1)
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) КАК НеПреобразовано
ИЗ
Данные КАК Данные
Если доля непреобразованных значений больше нуля, разбирайтесь с исходными данными, а не с запросом. Также проверяйте граничные значения: даты до 01.01.0001 и после 31.12.3999 выходят за допустимый диапазон типа Дата в 1С.
Как проверить результат
Реальная дата, совпадающая по смыслу с исходным значением
01.01.0001 00:00:00 при заполненном исходном поле
Отбор возвращает записи строго внутри заданного диапазона
Записи за границей периода или пропущенные записи внутри него
Одна строка на каждый календарный день
Несколько строк на один день — значит, время не отсечено
Производительность и ограничения
ВЫРАЗИТЬ — недорогая операция для приведения составных типов, но её применение в условии ГДЕ к индексированному полю может помешать СУБД использовать индекс. Если поле уже имеет тип Дата, лишнее приведение в отборе лучше убрать: сравнивайте поле напрямую с параметром, а тип параметра задавайте явно при установке значения.
Другие практические ограничения:
- приведение строки к дате напрямую не поддерживается осмысленно — только к числу или строке другой длины;
- в условиях соединения ВЫРАЗИТЬ допустимо, но усложняет оптимизацию — по возможности приводите типы заранее во временных таблицах;
- при работе с временными таблицами приведённый тип фиксируется, и последующие обращения к полю уже работают с типом Дата.
Приём с промежуточной временной таблицей часто оптимальнее: сначала выбираете и приводите данные во временную таблицу, затем соединяете и фильтруете уже однотипные поля. Это упрощает и чтение запроса, и работу оптимизатора СУБД.
Альтернативы и выбор подхода
ВЫРАЗИТЬ КАК ДАТА — не единственный инструмент для работы с датами в запросе. Выбор зависит от задачи: обрезать время, собрать дату из частей или привести тип. Сопоставление основных функций помогает быстро подобрать нужную.
| Задача | Инструмент | Примечание |
|---|---|---|
| Привести составной тип к дате | ВЫРАЗИТЬ(... КАК ДАТА) | Недатные значения станут пустой датой |
| Отсечь время | НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) | Возвращает начало дня |
| Собрать дату из чисел | ДАТАВРЕМЯ(год, месяц, день) | Аргументы — целые числа |
| Сдвинуть дату | ДОБАВИТЬКДАТЕ(Поле, ДЕНЬ, N) | N может быть отрицательным |
| Разность дат | РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) | Результат — число |
Как выбрать действие
Частые вопросы
Почему ВЫРАЗИТЬ(Строка КАК ДАТА) возвращает пустую дату?
Язык запросов 1С не разбирает строковые представления дат. Приведение строки к дате не выполняет парсинг формата, поэтому результатом становится пустая дата 01.01.0001. Разбор строки нужно делать во встроенном языке функцией Дата() или собирать дату в запросе через ДАТАВРЕМЯ из извлечённых частей.
Чем ВЫРАЗИТЬ КАК ДАТА отличается от НАЧАЛОПЕРИОДА?
ВЫРАЗИТЬ меняет тип значения, не трогая само значение: время у даты сохраняется. НАЧАЛОПЕРИОДА возвращает новое значение — начало указанного периода (дня, месяца и т.д.). Для отсечения времени и группировки по дням нужна именно НАЧАЛОПЕРИОДА.
Можно ли использовать ВЫРАЗИТЬ КАК ДАТА в условии соединения?
Да, синтаксически это допустимо и часто полезно при соединении по составным полям. Однако приведение типа в условии соединения усложняет работу оптимизатора СУБД. При больших объёмах данных надёжнее сначала поместить приведённые значения во временную таблицу и соединяться уже по ней.
Что происходит со значениями не-датами при приведении составного типа?
Они превращаются в пустую дату 01.01.0001 00:00:00 без каких-либо сообщений об ошибке. Поэтому после приведения стоит либо отфильтровать такие значения условием, либо обработать их через конструкцию ВЫБОР, если они нужны в выборке.
Влияет ли ВЫРАЗИТЬ на производительность запроса?
Само по себе приведение — лёгкая операция, но в условии ГДЕ по индексированному полю она может отключить использование индекса и вызвать полное сканирование таблицы. Если поле уже имеет тип Дата, лишнее приведение в отборе лучше убрать.
Как сравнить дату с параметром, если тип параметра неизвестен?
Либо приведите параметр в тексте запроса — ВЫРАЗИТЬ(&Параметр КАК ДАТА), либо явно задайте тип при установке: Запрос.УстановитьПараметр("Параметр", Значение) с гарантированно датным значением. Второй способ предпочтительнее, так как не мешает использованию индексов.
Что важно запомнить
ВЫРАЗИТЬ(... КАК ДАТА) приводит значение к типу Дата, но не обрезает время и не разбирает строки. Для отсечения времени используйте НАЧАЛОПЕРИОДА, для сборки даты из частей — ДАТАВРЕМЯ. Всегда проверяйте результат на пустые даты и избегайте приведения типа в условиях по индексированным полям.