Разработка и Конфигурация · 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 в отборе ведут себя по-разному, и смешивать их в одном условии без явной обработки опасно для корректности отчёта.
Проверьте тип реквизита в конфигураторе или в схеме запроса
Проверьте, что реально хранится в поле: строка, число или ссылка
Проверьте соединение таблиц и добавьте ЕСТЬNULL при необходимости
Строка с датой: почему ВЫРАЗИТЬ не поможет и что делать
Частая задача — в регистре сведений или в дополнительном свойстве дата хранится как строка «15.03.2026». Интуитивно хочется написать ВЫРАЗИТЬ(ПолеСтрока КАК ДАТА), но это не сработает: язык запросов не выполняет разбор строки по шаблону. Результатом будет пустая дата для каждой записи.
Реалистичные пути решения таковы. Первый — перенести обработку на уровень встроенного языка: выбрать строки запросом, затем в цикле преобразовать их функцией Дата() или через форматирование, и уже потом работать с датами. Это подходит для разовых обработок и небольших выборок.
Второй путь — изменить хранение: добавить реквизит типа «Дата» и заполнить его обработкой, после чего строить запросы уже по нормальному полю. Это правильное долгосрочное решение, потому что строковое хранение дат ломает сортировку, отборы по периодам и сравнения. Третий вариант — если строка имеет фиксированный формат, собрать дату через ПОДСТРОКА и ВЫБОР, но такая конструкция громоздка, медленна и оправдана только как временная мера.
Приведение в условиях, соединениях и параметрах
В секции ГДЕ приведение к дате используется, когда сравниваемое поле составного типа. Пример: ГДЕ ВЫРАЗИТЬ(ЗначениеСвойства КАК ДАТА) МЕЖДУ &НачалоПериода И &КонецПериода. Здесь важно помнить о производительности: приведение в условии может помешать использованию индекса, и на больших таблицах запрос замедлится. Если такой отбор выполняется регулярно, это ещё один аргумент в пользу хранения значения в поле типа «Дата».
В соединениях приведение выравнивает типы по обеим сторонам условия. Если слева поле типа «Дата», а справа составной реквизит, приведение правой части делает сравнение однозначным. Без этого возможны ситуации, когда соединение формально работает, но часть записей теряется из-за несовпадения типов значений.
С параметрами ситуация проще: параметр обычно уже имеет нужный тип, если его правильно установили в коде через Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса()). Приведение параметра к дате в тексте запроса требуется редко — в основном когда параметр передаётся как произвольное значение из универсального механизма.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(Свойства.Значение КАК ДАТА) КАК ДатаЗначения
|ИЗ
| РегистрСведений.ДополнительныеСвойства КАК Свойства
|ГДЕ
| Свойства.Свойство = &Свойство
| И ВЫРАЗИТЬ(Свойства.Значение КАК ДАТА) >= &НачалоПериода";
Запрос.УстановитьПараметр("Свойство", СвойствоДатаОтгрузки);
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();Типичные ошибки и как их избежать
Первая ошибка — ожидание, что ВЫРАЗИТЬ распарсит строку. Как показано выше, оператор этого не делает, и запрос выполнится без ошибки, просто вернув пустые даты. Такая ситуация опасна тем, что не сигнализирует о себе: отчёт построится, но данные будут неверными.
Вторая ошибка — сравнение приведённого поля с пустой датой через равенство без учёта NULL. Записи, где соединение не дало результата, в выборку не попадут, хотя логически они могли быть нужны. Используйте ЕСТЬNULL или явную проверку ЕСТЬ NULL в зависимости от задачи.
Третья ошибка — приведение там, где оно не нужно. Если поле уже имеет тип «Дата», конструкция ВЫРАЗИТЬ(Поле КАК ДАТА) избыточна: она не навредит, но загромождает запрос и может затруднить его оптимизацию. Приводить стоит только составные типы и значения неопределённого типа.
Четвёртая ошибка — путаница между ВЫРАЗИТЬ и функциями работы с датами. Чтобы получить начало дня от значения, нужно НАЧАЛОПЕРИОДА(Поле, ДЕНЬ), а не приведение типа: ВЫРАЗИТЬ не обрезает время.
Как проверить результат приведения
Самый быстрый способ — консоль запросов. Выполните запрос с приведением и посмотрите на колонку результата: тип поля должен отображаться как «Дата», а значения — как реальные даты, а не 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, проверяйте результат в консоли запросов и помните, что регулярные отборы по приведённому полю — сигнал пересмотреть тип хранения.