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

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

Оператор ВЫРАЗИТЬ КАК ДАТА в запросах 1С 8: практическое руководство

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

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

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

Ниже разобраны синтаксис, рабочие сценарии, поведение с составными типами и NULL, типичные ошибки и способы проверить результат до того, как запрос попадёт в рабочий код.

Синтаксис оператора ВЫРАЗИТЬ для типа Дата

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

Пример простого запроса, где поле составного типа приводится к дате:

ВЫБРАТЬ

ВЫРАЗИТЬ(Регистратор.Дата КАК ДАТА) КАК ДатаДокумента

ИЗ

РегистрСведений.СтатусыДокументов КАК Статусы

Результат приведения попадает в выборку как поле с типом «Дата». Если исходное значение не является датой — например, это строка, число или ссылка — результатом будет пустая дата (01.01.0001 00:00:00), а не ошибка выполнения. Это важно учитывать при фильтрации: условие сравнения с конкретной датой просто не сработает для таких записей.

Зачем приводить поле к дате: основные сценарии

Первый и самый частый сценарий — работа с реквизитами составного типа. Если реквизит объявлен как «Дата, Строка» или включает несколько типов, то при соединении таблиц по такому полю или при сравнении с параметром-датой запрос может работать медленно или возвращать неожиданные результаты. Приведение к конкретному типу позволяет СУБД использовать индексы и корректно сравнивать значения.

Второй сценарий — подготовка поля для функций работы с датами. Функции НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, ДОБАВИТЬКДАТЕ и РАЗНОСТЬДАТ требуют аргумент типа «Дата». Если поле имеет составной тип, перед передачей в функцию его надёжнее привести: НАЧАЛОПЕРИОДА(ВЫРАЗИТЬ(Поле КАК ДАТА), ДЕНЬ).

Третий сценарий — виртуальные таблицы и параметры. Когда значение приходит извне как параметр неоднозначного типа, приведение гарантирует, что в сравнении участвует именно дата. Это снимает класс ошибок, когда параметр-строка с текстом даты молча не совпадает ни с одной записью.

Составные типы и NULL: что происходит при приведении

Когда поле составного типа содержит значение не того типа, к которому выполняется приведение, результат — пустая дата. Когда поле содержит NULL (например, после левого соединения без совпадений), результатом остаётся NULL. Это разные состояния, и проверять их нужно по-разному: ЕСТЬ NULL для отсутствия значения и сравнение с ДАТАВРЕМЯ(1,1,1) для пустой даты.

Практический приём — совмещать приведение с ЕСТЬNULL, чтобы гарантированно получить дату даже при отсутствии связанной записи:

ВЫБРАТЬ

ЕСТЬNULL(ВЫРАЗИТЬ(Статусы.ДатаИзменения КАК ДАТА), ДАТАВРЕМЯ(1,1,1)) КАК ДатаИзменения

ИЗ

Документ.Заказ КАК Заказ

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументов КАК Статусы

ПО Заказ.Ссылка = Статусы.Документ

Обратите внимание на порядок: сначала приведение типа, затем обработка NULL. Если поменять местами и обернуть ЕСТЬNULL внутрь ВЫРАЗИТЬ, логика не сломается, но конструкция станет менее читаемой. Главное — не забывать, что пустая дата и NULL в отборе ведут себя по-разному, и смешивать их в одном условии без явной обработки опасно для корректности отчёта.

Поле составного типаНужно приведение

Проверьте тип реквизита в конфигураторе или в схеме запроса

Результат — 01.01.0001Значение не было датой

Проверьте, что реально хранится в поле: строка, число или ссылка

Результат — NULLНет связанной записи

Проверьте соединение таблиц и добавьте ЕСТЬNULL при необходимости

Строка с датой: почему ВЫРАЗИТЬ не поможет и что делать

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

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

Второй путь — изменить хранение: добавить реквизит типа «Дата» и заполнить его обработкой, после чего строить запросы уже по нормальному полю. Это правильное долгосрочное решение, потому что строковое хранение дат ломает сортировку, отборы по периодам и сравнения. Третий вариант — если строка имеет фиксированный формат, собрать дату через ПОДСТРОКА и ВЫБОР, но такая конструкция громоздка, медленна и оправдана только как временная мера.

Приведение в условиях, соединениях и параметрах

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

В соединениях приведение выравнивает типы по обеим сторонам условия. Если слева поле типа «Дата», а справа составной реквизит, приведение правой части делает сравнение однозначным. Без этого возможны ситуации, когда соединение формально работает, но часть записей теряется из-за несовпадения типов значений.

С параметрами ситуация проще: параметр обычно уже имеет нужный тип, если его правильно установили в коде через Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса()). Приведение параметра к дате в тексте запроса требуется редко — в основном когда параметр передаётся как произвольное значение из универсального механизма.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	ВЫРАЗИТЬ(Свойства.Значение КАК ДАТА) КАК ДатаЗначения
|ИЗ
|	РегистрСведений.ДополнительныеСвойства КАК Свойства
|ГДЕ
|	Свойства.Свойство = &Свойство
|	И ВЫРАЗИТЬ(Свойства.Значение КАК ДАТА) >= &НачалоПериода";
Запрос.УстановитьПараметр("Свойство", СвойствоДатаОтгрузки);
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();

Типичные ошибки и как их избежать

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

Вторая ошибка — сравнение приведённого поля с пустой датой через равенство без учёта NULL. Записи, где соединение не дало результата, в выборку не попадут, хотя логически они могли быть нужны. Используйте ЕСТЬNULL или явную проверку ЕСТЬ NULL в зависимости от задачи.

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

Четвёртая ошибка — путаница между ВЫРАЗИТЬ и функциями работы с датами. Чтобы получить начало дня от значения, нужно НАЧАЛОПЕРИОДА(Поле, ДЕНЬ), а не приведение типа: ВЫРАЗИТЬ не обрезает время.

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

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

Самый быстрый способ — консоль запросов. Выполните запрос с приведением и посмотрите на колонку результата: тип поля должен отображаться как «Дата», а значения — как реальные даты, а не 01.01.0001. Если вся колонка заполнена пустыми датами, значит исходные значения не являются датами, и нужно разбираться с типом хранения.

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

После отладки проверьте пограничные случаи: записи с NULL, записи с пустой датой, записи, где значение другого типа. Убедитесь, что итоговое количество строк соответствует ожиданиям и что отбор по периоду возвращает осмысленный диапазон.

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

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

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

Отображается «Дата»

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

Остался составной тип или строка

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

Реальные даты записей

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

Сплошные 01.01.0001 00:00:00

Отбор по периоду
Норма

Возвращает ожидаемые записи

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

Пустой результат или лишние записи за пределами периода

Записи без связанных данных
Норма

Обработаны через ЕСТЬNULL

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

Молча выпали из выборки

FAQ

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

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

Чем отличается пустая дата от NULL в результате приведения?

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

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

Обычно нет: если параметр установлен в коде значением типа «Дата», он уже имеет нужный тип. Приведение оправдано, когда параметр приходит из универсального механизма как значение неопределённого типа и его тип нельзя гарантировать на стороне кода.

Уберёт ли ВЫРАЗИТЬ(Поле КАК ДАТА) время из значения?

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

Влияет ли приведение типа на скорость запроса?

Да, особенно в условиях отбора и соединениях на больших таблицах: приведение может помешать использованию индекса. Если отбор по приведённому полю выполняется регулярно, производительнее хранить значение в реквизите с типом «Дата» и индексировать его.

Что делать, если после приведения все значения стали пустыми датами?

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

Итог

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

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