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

Отчеты и Аналитика · 11 мин

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

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

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

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

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

Где в СКД применяется приведение к типу даты

Основное место — текст запроса набора данных. Здесь ВЫРАЗИТЬ работает на уровне СУБД: значение приводится ещё до того, как СКД начнёт компоновать отчёт. Это самый быстрый и предсказуемый вариант, и использовать его следует в первую очередь.

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

Третий сценарий — параметры и отборы. Когда параметр периода приходит как строка или когда поле отбора имеет составной тип, приведение к дате в запросе гарантирует корректное сравнение. Без этого условие Дата = &Период может не сработать из-за несовпадения типов на уровне СУБД.

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

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

Пример запроса набора данных, где строковый реквизит приводится к дате:

ВЫБРАТЬ

Регистр.Номенклатура КАК Номенклатура,

ВЫРАЗИТЬ(Регистр.ДатаСтрокой КАК ДАТА) КАК ДатаОперации

ИЗ

РегистрСведений.ДанныеОбмена КАК Регистр

ГДЕ

ВЫРАЗИТЬ(Регистр.ДатаСтрокой КАК ДАТА) МЕЖДУ &НачалоПериода И &КонецПериода

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

Важный нюанс производительности: ВЫРАЗИТЬ в условии отбора отключает использование индекса по этому полю. На больших таблицах лучше приводить параметр к типу поля, а не наоборот, либо хранить дату в правильном типе изначально.

Приведение строки к дате: допустимые форматы

СУБД, на которых работает 1С, понимают строковое представление даты только в строгом виде: восемь цифр для даты (20261225) или четырнадцать цифр для даты со временем (20261225143000). Пробелы, точки, дефисы и двоеточия не разбираются.

Если данные приходят из обмена в «человеческом» формате вида «25.12.2026», приведение через ВЫРАЗИТЬ не поможет. Нужно сначала собрать каноническую строку строковыми функциями запроса: ПОДСТРОКА, ВЫРАЗИТЬ вложенно или предварительная обработка при загрузке. Например, для строки «25.12.2026» канонический вид собирается как ПОДСТРОКА(Поле, 7, 4) + ПОДСТРОКА(Поле, 4, 2) + ПОДСТРОКА(Поле, 1, 2), и уже результат оборачивается в ВЫРАЗИТЬ(... КАК ДАТА).

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

Типичные ошибки
01
Ожидание, что ВЫРАЗИТЬ распарсит строку «25.12.2026» — результатом будет пустая дата, а отбор по периоду молча отфильтрует все записи
02
Приведение к дате в условии ГДЕ по большой таблице — индекс не используется, отчёт начинает выполняться минутами
03
Использование ВЫРАЗИТЬ в вычисляемом поле СКД — там действует другой язык выражений, и конструкция вызовет ошибку компоновки
04
Сравнение результата ВЫРАЗИТЬ с параметром-строкой — типы не совпадают, условие всегда ложно

Сужение составного типа поля до даты

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

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

Тот же приём применяют к полям типа «Период» виртуальных таблиц и к реквизитам документов, когда нужно гарантировать тип для последующей компоновки. Особенно это полезно, когда СКД строит итоги по периодам: для поля-периода в настройках отчёта доступны развёртки «Неделя», «Месяц» и т. д. только если тип поля однозначно определён как дата.

Работа с параметрами периода в СКД

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

Если параметр объявлен строкой, приведите его к дате прямо в условии: ГДЕ Таблица.Дата >= ВЫРАЗИТЬ(&ДатаСтрокой КАК ДАТА). Параметр при этом должен содержать каноническую строку из 8 или 14 цифр — это стоит контролировать в коде, который формирует параметры.

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

Где выполнять приведение

В запросе набора данных (ВЫРАЗИТЬ КАК ДАТА)

Самый быстрый вариант, работает на уровне СУБД. Подходит для строк в каноническом формате и составных типов. Не подходит для произвольных текстовых форматов дат.

Типизированный параметр СКД

Лучший вариант для отборов по периоду: тип контролируется платформой, запрос остаётся простым и использует индексы.

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

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

Вычисляемое поле СКД

Годится только для производных значений (добавить дни, получить начало месяца). Функции ВЫРАЗИТЬ там нет, приведение типов невозможно.

Пошаговый порядок настройки в конструкторе СКД

Ниже последовательность действий для типовой задачи: в регистре сведений дата хранится строкой, нужно вывести её в отчёт как дату и дать пользователю отбор по периоду.

Порядок действий
  1. 1
    Откройте схему компоновки данных, на закладке «Наборы данных» откройте запрос набора
  2. 2
    Убедитесь, что строковое поле содержит даты в формате ГГГГММДД — проверьте несколько записей консолью запросов
  3. 3
    В списке выборки напишите: ВЫРАЗИТЬ(Таблица.ДатаСтрокой КАК ДАТА) КАК ДатаОперации
  4. 4
    Добавьте условие ГДЕ с тем же приведением и параметрами периода
  5. 5
    На закладке «Параметры» задайте параметрам тип Дата и состав «Дата и время» либо «Дата»
  6. 6
    На закладке «Настройки» вынесите отбор по периоду в пользовательские настройки
  7. 7
    Запустите отчёт и сверьте: даты отображаются, отбор сокращает выборку, пустых дат 01.01.0001 нет

Если на этапе проверки в отчёте появляются даты 01.01.0001, возвращайтесь к данным: где-то строка не соответствует каноническому формату. Найти такие записи помогает запрос с условием ГДЕ ВЫРАЗИТЬ(Поле КАК ДАТА) = ДАТАВРЕМЯ(1,1,1) — он выведет все проблемные строки.

Проверка результата и ограничения приёма

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

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

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

Значения в колонке даты
Норма

Реальные даты документов, время 00:00:00 если его не было в источнике

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

Дата 01.01.0001 или пустые ячейки — строка не привелась

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

Сужение периода уменьшает число строк отчёта

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

Отчёт пустеет при любом периоде или игнорирует отбор — несовпадение типов

Скорость выполнения
Норма

Отчёт формируется за приемлемое время на рабочем объёме данных

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

Резкое замедление после добавления ВЫРАЗИТЬ в условие — потерян индекс

Группировка по месяцам
Норма

Доступны поля-периоды (Неделя, Месяц) в настройках

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

Периодические поля недоступны — тип поля не определён как дата

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

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

Почему ВЫРАЗИТЬ(Поле КАК ДАТА) возвращает 01.01.0001?

Потому что строка не соответствует каноническому формату ГГГГММДД или ГГГГММДДЧЧММСС. Разделители (точки, дефисы, пробелы) не разбираются. Соберите каноническую строку функцией ПОДСТРОКА или исправьте данные при загрузке.

Можно ли использовать ВЫРАЗИТЬ в вычисляемом поле СКД?

Нет. В вычисляемых полях действует язык выражений компоновки данных, где этой функции нет. Приведение типов выполняйте в запросе набора данных, а вычисляемые поля используйте для арифметики с уже готовыми датами.

Как отсечь время и оставить только дату?

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

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

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

Почему после добавления ВЫРАЗИТЬ в условие отчёт стал медленным?

Приведение типа в условии отбора отключает использование индекса по этому полю, и СУБД сканирует таблицу целиком. Решения: типизировать параметр вместо поля, хранить дату в правильном типе или вынести приведение во временную таблицу пакетного запроса.

Работает ли ВЫРАЗИТЬ КАК ДАТА с NULL?

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

Итог

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

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