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