Разработка и Конфигурация · 10 мин
Как выразить значение как дату в запросе 1С
Как использовать ВЫРАЗИТЬ КАК ДАТА в запросе 1С: приведение строк и чисел к дате, работа с составными типами, типичные ошибки и проверка результата.
Оператор ВЫРАЗИТЬ в языке запросов 1С приводит значение поля к указанному типу. Конструкция «ВЫРАЗИТЬ(... КАК ДАТА)» нужна, когда поле имеет составной тип, хранится как строка или число, а для выборки, сравнения или группировки требуется именно дата. Без явного приведения запрос либо вернёт ошибку сравнения несовместимых типов, либо выдаст некорректный результат при соединениях и отборах.
Типичные сценарии: реквизит объявлен составным типом «Строка, Дата», данные загружены из внешнего источника в строковом виде, период хранится числом в формате ГГГГММДД, либо нужно отбросить время у значения типа «Дата и время». Во всех этих случаях приведение типа выполняется прямо в тексте запроса, без изменения структуры данных.
Важно понимать ограничение: ВЫРАЗИТЬ не парсит произвольные строки «как человек». Если строка содержит текст «15 марта», приведение не сработает — результатом будет пустая дата (01.01.0001). Оператор надёжно работает, когда значение уже является датой внутри составного типа либо когда строка строго соответствует ожидаемому формату.
Синтаксис оператора ВЫРАЗИТЬ для типа Дата
Базовая форма выглядит так: ВЫРАЗИТЬ(Выражение КАК ДАТА). В качестве выражения допускается поле таблицы, параметр запроса, результат функции или вложенное выражение. Результат можно использовать в списке выборки, в условии ГДЕ, в соединениях и при группировке.
ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.ПериодСтрокой КАК ДАТА) КАК ДатаДокумента
ИЗ
РегистрСведений.ЗагруженныеДанные КАК Таблица
ГДЕ
ВЫРАЗИТЬ(Таблица.ПериодСтрокой КАК ДАТА) >= &НачалоПериода
Для типа «Дата» в запросе нельзя указать квалификаторы вроде «только дата без времени» — в языке запросов ДАТА всегда содержит и дату, и время. Если нужно отбросить время, используют функции НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) или КОНЕЦПЕРИОДА(Дата, ДЕНЬ) поверх приведённого значения.
Приведение составного типа к дате
Самая частая и корректная задача — реквизит объявлен составным типом, например «Строка(50), Дата». Пока тип составной, сравнивать поле с параметром-датой или передавать его в функции периодов нельзя: СУБД не сможет однозначно выполнить операцию. Приведение сужает тип до даты, и все значения, физически хранящие дату, сохраняются, а значения других типов превращаются в пустую дату.
ВЫБРАТЬ
ВЫРАЗИТЬ(Свойства.Значение КАК ДАТА) КАК ДатаЗначения
ИЗ
РегистрСведений.ДополнительныеСведения КАК Свойства
ГДЕ
Свойства.Свойство = &СвойствоДатаПоставки
И ВЫРАЗИТЬ(Свойства.Значение КАК ДАТА) <> ДАТАВРЕМЯ(1, 1, 1)
Обратите внимание на фильтр «не равно пустой дате»: он отсекает записи, где в составном поле лежала строка или число. Это стандартный приём при работе с дополнительными сведениями и свойствами, где тип значения определяется настройкой свойства, а не структурой регистра.
Преобразование строки в дату
Строгого аналога функции «разобрать строку как дату» в языке запросов нет. ВЫРАЗИТЬ(Строка КАК ДАТА) сработает только если строка уже содержит представление даты в каноническом виде (ГГГГММДДччммсс или близком к нему), и поведение зависит от платформы и СУБД. На произвольные форматы вроде «15.03.2026» полагаться нельзя.
Надёжный приём для строк формата «ГГГГММДД» — собрать дату функцией ДАТАВРЕМЯ из подстрок:
ВЫБРАТЬ
ДАТАВРЕМЯ(
ВЫРАЗИТЬ(ПОДСТРОКА(Т.СтрокаДаты, 1, 4) КАК ЧИСЛО(4)),
ВЫРАЗИТЬ(ПОДСТРОКА(Т.СтрокаДаты, 5, 2) КАК ЧИСЛО(2)),
ВЫРАЗИТЬ(ПОДСТРОКА(Т.СтрокаДаты, 7, 2) КАК ЧИСЛО(2))
) КАК ДатаИзСтроки
ИЗ
ВнешниеДанные КАК Т
Если формат строк нестабилен (разделители, порядок дня и месяца), правильнее преобразовать данные до запроса — в коде модуля через Дата() или при загрузке — и хранить уже типизированные значения. Запрос не предназначен для «умного» парсинга.
Отбрасывание времени и работа с периодами
Поле типа «Дата» в 1С всегда хранит время, даже если оно нулевое. Из-за этого сравнение Дата = &Дата часто не находит записи: в параметре время 00:00:00, а в данных — 14:32:17. Приведение типом тут не поможет, нужны функции периода.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) КАК День,
КОЛИЧЕСТВО(Документ.Ссылка) КАК КоличествоДокументов
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &НачалоДня И &КонецДня
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ)
Параметры границ периода передавайте как НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) и КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) — либо вычисляйте в коде до выполнения запроса. Это гарантирует, что в выборку попадут все документы дня независимо от времени.
Способы получить дату без времени
Штатный способ в запросе: возвращает 00:00:00 нужного дня, подходит для группировок и сравнений.
Только приводит тип, время не отсекает. Полезно для составных типов, но не решает задачу «дата без времени».
НачалоДня(Дата) до выполнения запроса — вариант для параметров, но не для полей внутри выборки.
Числовое представление даты и обратные задачи
В интеграциях дата часто приходит числом ГГГГММДД (например, 20260315). Прямого приведения числа к дате оператор ВЫРАЗИТЬ не выполняет — нужно разложить число на компоненты и собрать через ДАТАВРЕМЯ, либо сначала перевести число в строку и действовать через ПОДСТРОКА.
ВЫБРАТЬ
ДАТАВРЕМЯ(
ВЫРАЗИТЬ(Т.ЧислоДата / 10000 КАК ЧИСЛО(4)),
ВЫРАЗИТЬ((Т.ЧислоДата - ВЫРАЗИТЬ(Т.ЧислоДата / 10000 КАК ЧИСЛО(4)) * 10000) / 100 КАК ЧИСЛО(2)),
Т.ЧислоДата - ВЫРАЗИТЬ(Т.ЧислоДата / 100 КАК ЧИСЛО(6)) * 100
) КАК ДатаИзЧисла
ИЗ
ЗагрузкаИзФайла КАК Т
Обратная задача — представить дату числом или строкой — решается функциями ГОД(), МЕСЯЦ(), ДЕНЬ() с последующей сборкой. Для вывода пользователю в отчётах на СКД обычно достаточно форматной строки в настройках поля, и преобразование в запросе не требуется вовсе.
- 1Определите фактический тип исходного поля: дата, составной тип, строка или число.
- 2Для составного типа примените ВЫРАЗИТЬ(Поле КАК ДАТА) и добавьте отбор непустых значений.
- 3Для строки формата ГГГГММДД соберите дату через ДАТАВРЕМЯ и ПОДСТРОКА.
- 4Для отбора по дню используйте НАЧАЛОПЕРИОДА/КОНЕЦПЕРИОДА вместо приведения типа.
- 5Выполните запрос в консоли и проверьте, что нет неожиданных пустых дат 01.01.0001.
Проверка результата и типичные ошибки
После написания запроса проверьте его на реальных данных в консоли запросов: выведите исходное поле и приведённое значение рядом. Совпадение количества строк и отсутствие массовых пустых дат — признак корректного приведения. Если пустые даты появились там, где их не ожидали, тип исходных данных отличается от предполагаемого.
Как проверить результат
Даты соответствуют исходным данным, время сохранено или обнулено ожидаемо
Массовые значения 01.01.0001 — исходные значения неприводимого типа
В выборку попадают все документы дня независимо от времени
Теряются документы с ненулевым временем при сравнении на равенство
Соединение работает, план запроса использует индексы
Полное сканирование таблицы из-за приведения в условии соединения
Отдельная проблема — производительность. Приведение типа в условии ГДЕ или в соединении не позволяет СУБД использовать индекс по полю, и на больших таблицах запрос начинает сканировать все строки. Если отбор по приведённой дате нужен регулярно, лучше хранить типизированное поле даты или вычисляемый индексируемый реквизит, а приведение оставить для разовых выгрузок.
Альтернативы и границы применения
Не каждую задачу «выразить как дату» стоит решать в запросе. Если данные загружаются из файла, преобразование надёжнее выполнить в коде при загрузке: функция Дата() и явный разбор формата дают контроль над ошибками. Если дата нужна для отчёта на СКД, часто достаточно вычисляемого поля или форматной строки, без изменения текста запроса.
В запросе приведение оправдано, когда: поле составного типа и нужно сузить его для сравнения; требуется отфильтровать записи с реальными датами в дополнительных сведениях; выполняется разовый анализ данных в консоли. Для постоянных механизмов обмена и тяжёлых отчётов предпочтительнее хранить данные уже в типе «Дата».
Что важно запомнить
ВЫРАЗИТЬ(Поле КАК ДАТА) сужает составной тип и приводит совместимые значения к дате, а несовместимые — к пустой дате 01.01.0001. Строки и числа собирайте через ДАТАВРЕМЯ, время отсекайте функциями НАЧАЛОПЕРИОДА/КОНЕЦПЕРИОДА, результат проверяйте в консоли запросов и избегайте приведения в условиях соединения больших таблиц.
Частые вопросы
Почему ВЫРАЗИТЬ(Строка КАК ДАТА) возвращает 01.01.0001?
Строка не соответствует формату, который платформа способна привести к дате. Ошибка не генерируется — вместо неё подставляется пустая дата. Соберите дату через ДАТАВРЕМЯ из подстрок или преобразуйте данные в коде до запроса.
Как сравнить дату документа с датой без времени?
Используйте диапазон: Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ). Сравнение на равенство не сработает, если у документа ненулевое время.
Можно ли в запросе получить только дату без времени как тип?
Нет, тип ДАТА в языке запросов всегда включает время. Можно получить начало дня (00:00:00) функцией НАЧАЛОПЕРИОДА — для сравнений и группировок этого достаточно.
Влияет ли ВЫРАЗИТЬ на производительность запроса?
Да, если приведение стоит в условии отбора или соединения по большой таблице: индекс по полю не используется, и выполняется полное сканирование. В списке выборки приведение практически безвредно.
Как привести число 20260315 к дате в запросе?
Прямого приведения нет. Разложите число арифметически на год, месяц и день и соберите через ДАТАВРЕМЯ, либо переведите число в строку и используйте ПОДСТРОКА с последующим приведением к ЧИСЛО.
Чем ВЫРАЗИТЬ отличается от ДАТАВРЕМЯ?
ВЫРАЗИТЬ приводит существующее значение к типу, ДАТАВРЕМЯ конструирует новую дату из числовых компонентов (год, месяц, день, часы, минуты, секунды). Для разбора строк и чисел нужна именно ДАТАВРЕМЯ.