К статье
Практический материал

Разработка и Конфигурация · 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. 1
    Определите формат исходной строки: ГГГГММДД, ISO 8601 или произвольный
  2. 2
    Для ГГГГММДД используйте Дата("20260115"), для ISO — XMLЗначение(Тип("Дата"), Строка)
  3. 3
    Проверьте результат: сравните с пустой датой и обработайте исключение через Попытка/Исключение
  4. 4
    Передайте готовое значение в запрос параметром, а не конкатенацией строки в текст запроса

Работа с периодами и границами дат в запросе

Когда дату нужно «выразить» для сравнения с периодом, часто вместо ВЫРАЗИТЬ используют литерал ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда). Это прямой способ задать константную дату в тексте запроса: ДАТАВРЕМЯ(2026, 1, 1, 0, 0, 0).

Частая ошибка — сравнение «по конец дня»: документ с датой 15.01.2026 14:30 не попадёт в условие <= ДАТАВРЕМЯ(2026,1,15), потому что литерал — это полночь. Правильные варианты: задать конец как 23:59:59, использовать КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) или объект Граница с видом «Включая».

Функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА принимают выражение даты и периодичность (ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД) и возвращают границу периода — это удобный способ «выразить» дату как начало месяца или конец года без ручных вычислений.

bsl
ВЫБРАТЬ
	Продажи.Регистратор,
	НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК НачалоМесяца
ИЗ
	РегистрНакопления.Продажи КАК Продажи
ГДЕ
	Продажи.Период МЕЖДУ &Начало И КОНЕЦПЕРИОДА(&Конец, ДЕНЬ)

Проверка результата и обработка пустых дат

После приведения типов результат обязательно проверяют. Пустая дата в 1С — это 0001.01.01 00:00:00, и она не равна NULL. Если поле пришло из соединения таблиц, возможны оба варианта, поэтому условие строят с учётом обоих: ГДЕ ДатаЕсть ИЛИ ВЫРАЗИТЬ(Поле КАК ДАТА) <> ДАТАВРЕМЯ(1,1,1).

Для подмены пустой даты значением по умолчанию применяют ЕСТЬNULL(ВЫРАЗИТЬ(Поле КАК ДАТА), ДАТАВРЕМЯ(1,1,1)) либо конструкцию ВЫБОР, когда логика сложнее — например, вывести дату документа, а при её отсутствии дату регистрации.

Контрольные точки

Как проверить результат приведения

Значение поля после ВЫРАЗИТЬ
Норма

Корректная дата в ожидаемом диапазоне

Тревожный признак

01.01.0001 или NULL при заполненном источнике

Попадание граничных документов в период
Норма

Документы за последний день периода включены

Тревожный признак

Документы после полуночи последнего дня отсутствуют

Сортировка по полю даты
Норма

Хронологический порядок

Тревожный признак

Порядок как у строк (01.02 раньше 02.01)

Типичные ошибки и ограничения

Главная ошибка — ожидание, что ВЫРАЗИТЬ распарсит строку. Платформа этого не делает: приведение строки к дате в запросе даёт пустую дату. Вторая частая проблема — сравнение даты со строкой без приведения типов, из-за чего условие молча не срабатывает или запрос падает на СУБД с ошибкой преобразования.

Ещё одно ограничение: в параметрах виртуальных таблиц (например, «Остатки» с параметром Период) ВЫРАЗИТЬ не применяется — туда передают уже готовое значение типа Дата или МоментВремени. Также помните, что приведение типов в условиях соединений может отключать использование индексов и замедлять запрос на больших таблицах.

Типичные ошибки
01
ВЫРАЗИТЬ(СтроковоеПоле КАК ДАТА) — результат всегда пустая дата, строки не разбираются
02
Сравнение Период <= ДАТАВРЕМЯ(2026,1,15) — теряются документы последнего дня после 00:00:00
03
Подстановка даты в текст запроса конкатенацией строки — ошибки формата и риск некорректного запроса
04
Игнорирование NULL после левого соединения — пустые даты попадают в отчёт как 01.01.0001
05
Приведение типа в условии соединения больших таблиц — резкое падение производительности
Маршрут решения

Как выбрать способ получения даты

Поле составного типа, среди типов есть ДатаИспользуйте ВЫРАЗИТЬ(Поле КАК ДАТА) прямо в запросе
Есть строка формата ГГГГММДДПреобразуйте через Дата(Строка) во встроенном языке и передайте параметром
Строка в формате ISO 8601Примените XMLЗначение(Тип("Дата"), Строка)
Нужна граница периода (начало месяца, конец дня)Используйте НАЧАЛОПЕРИОДА / КОНЕЦПЕРИОДА в запросе
Нужна константная дата в тексте запросаИспользуйте литерал ДАТАВРЕМЯ(Год, Месяц, День)

Частые вопросы

Можно ли в запросе 1С преобразовать строку «15.01.2026» в дату?

Нет. ВЫРАЗИТЬ не разбирает произвольные строки. Преобразуйте строку во встроенном языке (Дата(), XMLЗначение, либо ручной разбор через СтрРазделить и сборку в формат ГГГГММДД) и передайте результат в запрос параметром.

Чем ВЫРАЗИТЬ отличается от ДАТАВРЕМЯ?

ВЫРАЗИТЬ приводит существующее значение поля к типу Дата. ДАТАВРЕМЯ — это литерал, задающий конкретную константную дату прямо в тексте запроса. Они решают разные задачи и часто используются вместе.

Почему после ВЫРАЗИТЬ получается дата 01.01.0001?

Это пустая дата — признак того, что исходное значение несовместимо с типом Дата (строка, ссылка, NULL). Проверьте тип исходного поля и добавьте фильтр на пустые значения.

Как сравнить дату без учёта времени?

Приведите обе стороны к началу дня: НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) = НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ), либо сравнивайте с диапазоном от начала до конца дня через КОНЕЦПЕРИОДА.

Работает ли ВЫРАЗИТЬ в параметрах виртуальных таблиц?

Нет, параметры виртуальных таблиц принимают только готовые значения соответствующего типа. ВЫРАЗИТЬ применяется в списке выборки, условиях ГДЕ и соединениях основного запроса.

Как передать дату в запрос из кода?

Через Запрос.УстановитьПараметр("Имя", ЗначениеДаты). Никогда не вставляйте дату конкатенацией в текст запроса — это источник ошибок формата и уязвимостей.

Итог

Что важно запомнить

ВЫРАЗИТЬ(Поле КАК ДАТА) приводит к дате только совместимые значения и поля составного типа. Строки преобразуются встроенным языком до запроса, границы периодов задаются через ДАТАВРЕМЯ, НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, а результат всегда проверяют на пустую дату и NULL.