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

Разработка и Конфигурация · 10 мин

Как в 1С выразить значение как дату

Как использовать ВЫРАЗИТЬ КАК ДАТА в запросах 1С: синтаксис, преобразование строк и чисел в дату, работа с составными типами, типичные ошибки и примеры кода.

Функция ВЫРАЗИТЬ в языке запросов 1С используется для приведения значения к нужному типу. Конструкция «ВЫРАЗИТЬ КАК ДАТА» чаще всего нужна в трёх ситуациях: когда реквизит имеет составной тип и его нужно сравнить с конкретной датой, когда дата хранится в виде строки или числа, и когда требуется отсечь время, оставив только календарную дату.

Важно понимать ограничение: ВЫРАЗИТЬ в запросе не выполняет произвольный парсинг строк. Она приводит значение к типу ДАТА только если это физически возможно на уровне СУБД. Строку «15.03.2026» запрос сам не разберёт — для таких задач используется функция ДатаВремя() во встроенном языке или преобразование через ДАТАВРЕМЯ в запросе. ВЫРАЗИТЬ КАК ДАТА корректно работает с составными типами, где среди допустимых типов уже есть Дата.

Синтаксис ВЫРАЗИТЬ КАК ДАТА в запросе

Базовый синтаксис выглядит так: ВЫРАЗИТЬ(Выражение КАК ДАТА). В отличие от приведения к строке или числу, для типа ДАТА параметры длины и точности не указываются — у даты их нет. Выражением может быть поле таблицы, параметр запроса или результат другой функции.

ВЫБРАТЬ

ВЫРАЗИТЬ(Документ.ЗначениеСвойства КАК ДАТА) КАК ДатаДокумента

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ГДЕ

ВЫРАЗИТЬ(Документ.ЗначениеСвойства КАК ДАТА) = &НужнаяДата

Если реквизит имеет составной тип (например, Дата, Строка, Число), то без ВЫРАЗИТЬ сравнение с параметром типа Дата может работать некорректно или замедлять запрос: платформа не сможет использовать индекс эффективно. Приведение типа сужает значение до одного типа и делает условие предсказуемым.

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

Частая практическая задача — сравнить документы по дню, игнорируя время. Тип Дата в 1С всегда содержит время, поэтому «чистая» дата — это дата с временем 00:00:00. Для отсечения времени в запросе используются две конструкции.

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

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК День,

СУММА(Реализация.СуммаДокумента) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

СГРУППИРОВАТЬ ПО

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ)

Способы отсечь время

НАЧАЛОПЕРИОДА(Дата, ДЕНЬ)

Рекомендуемый вариант: короткая запись, хорошо оптимизируется СУБД, подходит для группировок и сравнений

ДАТАВРЕМЯ(ГОД(), МЕСЯЦ(), ДЕНЬ())

Громоздкая запись, оправдана только когда нужно собрать дату из отдельных числовых частей

ВЫРАЗИТЬ КАК ДАТА

Не отсекает время — только приводит тип. Для обрезки времени не подходит

Преобразование строки в дату во встроенном языке

Когда дата приходит извне — из файла, веб-сервиса, обмена — она обычно представлена строкой. Запрос здесь не поможет: преобразование выполняется во встроенном языке. Для строки в формате ISO «20260315» или «2026-03-15» есть несколько рабочих подходов.

Для строгого формата ГГГГММДДччммсс удобно собрать дату через функцию Дата(): Дата(Лев(Строка,4), Сред(Строка,5,2), Сред(Строка,7,2)). Для произвольных форматов надёжнее разобрать строку вручную по разделителям и собрать дату из компонентов, предварительно проверив корректность чисел.

Функция СтрокаВДату(СтрокаДаты)

// Формат "ДД.ММ.ГГГГ"

Части = СтрРазделить(СтрокаДаты, ".");

Если Части.Количество() <> 3 Тогда

Возврат Дата(1,1,1);

КонецЕсли;

Попытка

Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

Исключение

Возврат Дата(1,1,1);

КонецПопытки;

КонецФункции

Пустая дата Дата(1,1,1) — общепринятый маркер неуспешного преобразования. Возвращать её безопаснее, чем текущую дату: ложное значение легко отфильтровать, а подмена текущей датой приведёт к тихим ошибкам в учёте.

Конструктор ДАТАВРЕМЯ в запросе

Если компоненты даты хранятся отдельными числами или нужно сформировать дату прямо в запросе, используется конструктор ДАТАВРЕМЯ(год, месяц, день, час, минута, секунда). Параметры времени можно опустить — тогда они примут нулевые значения.

ВЫБРАТЬ

ДАТАВРЕМЯ(Таблица.Год, Таблица.Месяц, 1) КАК ПервоеЧислоМесяца

ИЗ

РегистрСведений.ПериодыОтчетности КАК Таблица

Ограничение конструктора: все аргументы должны быть корректными числами. Если месяц равен 13 или день равен 0, запрос завершится ошибкой на уровне СУБД. Поэтому перед использованием ДАТАВРЕМЯ с данными из таблиц стоит добавить условие ВЫБОР с проверкой диапазонов.

Приведение типа в СКД и динамических списках

В схемах компоновки данных ВЫРАЗИТЬ КАК ДАТА применяется в вычисляемых полях и в запросе набора данных. Типичный сценарий — дополнительное свойство объекта хранится в регистре сведений с ресурсом составного типа, а в отчёте его нужно вывести как дату и отсортировать по ней.

При этом важно приводить тип уже в запросе набора данных, а не в вычисляемом поле СКД: отборы и сортировки по полю, вычисленному на уровне компоновки, выполняются в памяти и работают медленнее. Если по полю-дате планируется отбор пользователем, приведение типа в тексте запроса обязательно.

Порядок действий для составного реквизита
  1. 1
    Убедитесь, что в состав типа реквизита входит тип Дата (панель свойств реквизита в конфигураторе)
  2. 2
    В тексте запроса оберните поле: ВЫРАЗИТЬ(Реквизит КАК ДАТА)
  3. 3
    Добавьте условие на NULL, если в поле могут быть значения других типов
  4. 4
    Проверьте результат на тестовых данных: значения-даты должны выводиться, прочие — давать NULL
  5. 5
    Для сравнения по дню оберните результат в НАЧАЛОПЕРИОДА(..., ДЕНЬ)

Типичные ошибки и их последствия

Самая частая ошибка — ожидание, что ВЫРАЗИТЬ КАК ДАТА распарсит строку «01.02.2026». Этого не произойдёт: результатом будет NULL, и условие сравнения молча не сработает. Запрос выполнится без ошибки, но вернёт пустой результат, что затрудняет диагностику.

Вторая ошибка — сравнение дат с точностью до секунды там, где нужно сравнение по дню. Документ, проведённый в 14:30:00, не равен параметру «начало дня», и запись выпадает из выборки. Третья ошибка — игнорирование NULL после приведения типа: NULL не равен никакому значению, включая NULL, поэтому записи с NULL теряются в условиях ГДЕ без явной обработки через ЕСТЬ NULL или ЕСТЬNULL().

Типичные ошибки
01
Ожидание парсинга строки функцией ВЫРАЗИТЬ — результат NULL и пустая выборка без сообщения об ошибке
02
Сравнение дат со временем без НАЧАЛОПЕРИОДА — документы выпадают из выборки по дню
03
Игнорирование NULL после приведения составного типа — записи теряются в условии ГДЕ
04
Передача в ДАТАВРЕМЯ непроверенных чисел — ошибка выполнения запроса на уровне СУБД
05
Приведение типа в вычисляемом поле СКД вместо запроса — медленные отборы и сортировки

Проверка результата преобразования

После приведения типа результат стоит проверить тремя способами. Во-первых, вывести поле без условий и убедиться, что даты отображаются, а незаполненные значения дают NULL. Во-вторых, добавить условие ГДЕ ПриведенноеПоле ЕСТЬ NULL — так видно объём «потерянных» записей. В-третьих, сравнить количество записей до и после фильтрации: неожиданное уменьшение выборки указывает на проблему с типами.

Во встроенном языке тип результата проверяется функцией ТипЗнч(Значение) = Тип("Дата"), а сама дата — сравнением с пустым значением Дата(1,1,1). Для отладки запросов удобна консоль запросов: она показывает тип колонки результата и позволяет быстро проверить поведение ВЫРАЗИТЬ на реальных данных.

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

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

Тип колонки в результате запроса
Норма

Колонка имеет тип Дата

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

Колонка строкового или составного типа — приведение не применено

Значения после приведения составного поля
Норма

Даты выводятся, прочие типы дают NULL

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

Все значения NULL — в поле нет данных типа Дата

Количество записей после фильтра по дате
Норма

Число записей соответствует ожиданиям по данным

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

Выборка резко сократилась — вероятны NULL или сравнение со временем

FAQ

Можно ли через ВЫРАЗИТЬ преобразовать строку «01.01.2026» в дату?

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

Почему после ВЫРАЗИТЬ КАК ДАТА поле содержит NULL?

Это означает, что фактическое значение поля не является датой. Такое происходит с составными типами, когда в конкретной записи хранится строка, число или ссылка. NULL — нормальное поведение, а не ошибка; обработайте его через ЕСТЬNULL() или отфильтруйте условием ЕСТЬ NULL.

Как сравнить документ с конкретным днём, если в дате есть время?

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

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

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

Работает ли ВЫРАЗИТЬ КАК ДАТА с параметром запроса?

Да, конструкция ВЫРАЗИТЬ(&Параметр КАК ДАТА) допустима и полезна, когда параметр объявлен без явного типа. Это помогает платформе корректно построить план запроса и избежать неявных преобразований при сравнении с полями типа Дата.

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

Пустая дата в запросе задаётся конструктором ДАТАВРЕМЯ(1,1,1). Именно с ней сравнивают незаполненные даты: условие вида Документ.СрокОплаты = ДАТАВРЕМЯ(1,1,1) выберет документы, где срок не указан. Сравнение с NULL здесь не подойдёт — пустая дата и NULL в 1С разные вещи.

Итог

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

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