Разработка и Конфигурация · 9 мин
Как в 1С выразить значение как дату
Как в запросе 1С выразить значение как дату: синтаксис ВЫРАЗИТЬ, приведение строк и чисел, работа с периодами, ошибки и проверка результата.
Оператор ВЫРАЗИТЬ в языке запросов 1С приводит значение к нужному типу, и одна из самых частых задач — получить дату из строки, числа, составного поля или пустого значения. Без явного приведения типов запрос либо возвращает NULL, либо падает с ошибкой несовместимости типов, либо сортирует даты как строки.
Типичные ситуации: реквизит хранится как строка «2026.01.15», поле имеет составной тип (дата, строка, число), нужно сравнить период документа с границами отчёта или привести параметр к типу Дата перед сравнением. Во всех этих случаях применяется конструкция ВЫРАЗИТЬ(Выражение КАК ДАТА).
Важно понимать ограничение: ВЫРАЗИТЬ в запросе не выполняет произвольный разбор строки — оно приводит значение только если приведение согласовано правилами платформы. Для сложного парсинга строк используют функции встроенного языка Дата() и XMLЗначение вне запроса.
Синтаксис ВЫРАЗИТЬ для типа Дата
Базовая форма оператора выглядит так: ВЫРАЗИТЬ(Выражение КАК ДАТА). В отличие от приведения к строке или числу, для даты не указываются длина и точность — тип Дата не параметризуется в запросе, квалификаторы «ДатаВремя» задаются только при описании реквизитов конфигурации.
Пример простого запроса, где составное поле приводится к дате:
ВЫБРАТЬ
ВЫРАЗИТЬ(Регистратор.Комментарий КАК СТРОКА(100)) КАК Комментарий,
ВЫРАЗИТЬ(ЗначенияСвойств.Значение КАК ДАТА) КАК ДатаСобытия
ИЗ
РегистрСведений.ЗначенияСвойств КАК ЗначенияСвойств
Если значение физически не может быть приведено к дате (например, это ссылка на справочник), результатом будет пустая дата 0001.01.01 либо NULL — в зависимости от контекста соединения. Поэтому после приведения почти всегда добавляют проверку на пустое значение.
Приведение полей составного типа к дате
Наиболее корректный сценарий ВЫРАЗИТЬ — работа с реквизитами составного типа, где среди допустимых типов есть Дата. Например, ресурс регистра сведений «ЗначенияСвойств» может хранить число, строку, дату и ссылку. Чтобы отобрать только даты и сравнить их с периодом, поле приводят к типу ДАТА.
Такой запрос корректно работает с индексами и не ломается на значениях других типов: строки и ссылки просто превратятся в пустую дату, которую легко отфильтровать условием ГДЕ ВЫРАЗИТЬ(Значение КАК ДАТА) > ДАТАВРЕМЯ(1,1,1).
ВЫБРАТЬ
ЗначенияСвойств.Объект,
ВЫРАЗИТЬ(ЗначенияСвойств.Значение КАК ДАТА) КАК ДатаЗначения
ИЗ
РегистрСведений.ЗначенияСвойств КАК ЗначенияСвойств
ГДЕ
ВЫРАЗИТЬ(ЗначенияСвойств.Значение КАК ДАТА) МЕЖДУ &НачалоПериода И &КонецПериода
Как преобразовать строку в дату
Строковое представление даты нельзя передать напрямую в ВЫРАЗИТЬ. Стандартный путь — преобразовать строку во встроенном языке и передать в запрос уже готовый параметр типа Дата.
Конструктор Дата() во встроенном языке
Если строка имеет формат «ГГГГММДД» или «ГГГГММДДЧЧММСС», используется конструктор: НоваяДата = Дата("20260115"); или Дата("20260115143000"). При неверном формате платформа выдаст ошибку преобразования, поэтому строку предварительно проверяют на длину и цифровой состав.
Функция XMLЗначение
Для строк в формате ISO 8601 («2026-01-15T14:30:00») удобна функция XMLЗначение(Тип("Дата"), СтрокаИзXML). Она строго следует формату и возвращает значение типа Дата, которое затем передаётся в запрос параметром.
ДатаПараметр = XMLЗначение(Тип("Дата"), "2026-01-15T00:00:00");
Запрос.УстановитьПараметр("НачалоПериода", ДатаПараметр);
- 1Определите формат исходной строки: ГГГГММДД, ISO 8601 или произвольный
- 2Для ГГГГММДД используйте Дата("20260115"), для ISO — XMLЗначение(Тип("Дата"), Строка)
- 3Проверьте результат: сравните с пустой датой и обработайте исключение через Попытка/Исключение
- 4Передайте готовое значение в запрос параметром, а не конкатенацией строки в текст запроса
Работа с периодами и границами дат в запросе
Когда дату нужно «выразить» для сравнения с периодом, часто вместо ВЫРАЗИТЬ используют литерал ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда). Это прямой способ задать константную дату в тексте запроса: ДАТАВРЕМЯ(2026, 1, 1, 0, 0, 0).
Частая ошибка — сравнение «по конец дня»: документ с датой 15.01.2026 14:30 не попадёт в условие <= ДАТАВРЕМЯ(2026,1,15), потому что литерал — это полночь. Правильные варианты: задать конец как 23:59:59, использовать КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) или объект Граница с видом «Включая».
Функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА принимают выражение даты и периодичность (ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД) и возвращают границу периода — это удобный способ «выразить» дату как начало месяца или конец года без ручных вычислений.
ВЫБРАТЬ
Продажи.Регистратор,
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК НачалоМесяца
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Период МЕЖДУ &Начало И КОНЕЦПЕРИОДА(&Конец, ДЕНЬ)Проверка результата и обработка пустых дат
После приведения типов результат обязательно проверяют. Пустая дата в 1С — это 0001.01.01 00:00:00, и она не равна NULL. Если поле пришло из соединения таблиц, возможны оба варианта, поэтому условие строят с учётом обоих: ГДЕ ДатаЕсть ИЛИ ВЫРАЗИТЬ(Поле КАК ДАТА) <> ДАТАВРЕМЯ(1,1,1).
Для подмены пустой даты значением по умолчанию применяют ЕСТЬNULL(ВЫРАЗИТЬ(Поле КАК ДАТА), ДАТАВРЕМЯ(1,1,1)) либо конструкцию ВЫБОР, когда логика сложнее — например, вывести дату документа, а при её отсутствии дату регистрации.
Как проверить результат приведения
Корректная дата в ожидаемом диапазоне
01.01.0001 или NULL при заполненном источнике
Документы за последний день периода включены
Документы после полуночи последнего дня отсутствуют
Хронологический порядок
Порядок как у строк (01.02 раньше 02.01)
Типичные ошибки и ограничения
Главная ошибка — ожидание, что ВЫРАЗИТЬ распарсит строку. Платформа этого не делает: приведение строки к дате в запросе даёт пустую дату. Вторая частая проблема — сравнение даты со строкой без приведения типов, из-за чего условие молча не срабатывает или запрос падает на СУБД с ошибкой преобразования.
Ещё одно ограничение: в параметрах виртуальных таблиц (например, «Остатки» с параметром Период) ВЫРАЗИТЬ не применяется — туда передают уже готовое значение типа Дата или МоментВремени. Также помните, что приведение типов в условиях соединений может отключать использование индексов и замедлять запрос на больших таблицах.
Как выбрать способ получения даты
Частые вопросы
Можно ли в запросе 1С преобразовать строку «15.01.2026» в дату?
Нет. ВЫРАЗИТЬ не разбирает произвольные строки. Преобразуйте строку во встроенном языке (Дата(), XMLЗначение, либо ручной разбор через СтрРазделить и сборку в формат ГГГГММДД) и передайте результат в запрос параметром.
Чем ВЫРАЗИТЬ отличается от ДАТАВРЕМЯ?
ВЫРАЗИТЬ приводит существующее значение поля к типу Дата. ДАТАВРЕМЯ — это литерал, задающий конкретную константную дату прямо в тексте запроса. Они решают разные задачи и часто используются вместе.
Почему после ВЫРАЗИТЬ получается дата 01.01.0001?
Это пустая дата — признак того, что исходное значение несовместимо с типом Дата (строка, ссылка, NULL). Проверьте тип исходного поля и добавьте фильтр на пустые значения.
Как сравнить дату без учёта времени?
Приведите обе стороны к началу дня: НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) = НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ), либо сравнивайте с диапазоном от начала до конца дня через КОНЕЦПЕРИОДА.
Работает ли ВЫРАЗИТЬ в параметрах виртуальных таблиц?
Нет, параметры виртуальных таблиц принимают только готовые значения соответствующего типа. ВЫРАЗИТЬ применяется в списке выборки, условиях ГДЕ и соединениях основного запроса.
Как передать дату в запрос из кода?
Через Запрос.УстановитьПараметр("Имя", ЗначениеДаты). Никогда не вставляйте дату конкатенацией в текст запроса — это источник ошибок формата и уязвимостей.
Что важно запомнить
ВЫРАЗИТЬ(Поле КАК ДАТА) приводит к дате только совместимые значения и поля составного типа. Строки преобразуются встроенным языком до запроса, границы периодов задаются через ДАТАВРЕМЯ, НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, а результат всегда проверяют на пустую дату и NULL.