Как в запросе 1С получить дату без времени?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Основная сложность в том, что в 1С поле типа Дата всегда содержит и дату, и время. Даже если время не указано явно, оно будет равно "00:00:00". Поэтому наша задача сводится не к "удалению" времени, а к его правильной обработке в зависимости от конечной цели: логические операции в запросе или форматирование для вывода пользователю.

Способ 1: Использование функции НАЧАЛОПЕРИОДА — универсальный метод

Это самый правильный и универсальный способ, если вам нужно использовать дату без времени для дальнейших операций внутри запроса: группировки, соединения таблиц по дате, установки условий в секции ГДЕ.

Функция НАЧАЛОПЕРИОДА() возвращает дату с временем, установленным на начало указанного периода (день, месяц, год и т.д.).

Как это работает?

Мы передаем в функцию наше поле с датой и указываем в качестве второго параметра периодичность "ДЕНЬ". Функция вернет нам ту же дату, но время будет всегда "00:00:00".

Посмотрим на пример:


ВЫБРАТЬ
    Продажи.Ссылка,
    Продажи.Дата,
    НАЧАЛОПЕРИОДА(Продажи.Дата, ДЕНЬ) КАК ДатаБезВремени
ИЗ
    Документ.РеализацияТоваровУслуг КАК Продажи

Результат:

Если в поле Продажи.Дата было значение "15.09.2023 14:35:12", то поле ДатаБезВремени вернет "15.09.2023 00:00:00".

Преимущества этого метода:

  1. Сохраняется тип данных "Дата". Это критически важно, так как позволяет платформе использовать индексы для полей с датами, что ускоряет выполнение запроса.
  2. Корректная группировка. Вы можете сгруппировать все документы за один день, не опасаясь, что они "разлетятся" по разным группам из-за времени.

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(Продажи.Дата, ДЕНЬ) КАК ДеньПродаж,
    СУММА(Продажи.СуммаДокумента) КАК СуммаЗаДень
ИЗ
    Документ.РеализацияТоваровУслуг КАК Продажи
СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(Продажи.Дата, ДЕНЬ)

Важный нюанс: как было отмечено в обсуждении, этот способ не "убирает" время, а обнуляет его. При выводе результата запроса вы все равно можете увидеть "00:00:00". Для того чтобы скрыть это время при отображении, нужно использовать настройки форматирования, например, в Системе Компоновки Данных (СКД).

Способ 2: Преобразование в строку — для визуального представления

Если ваша единственная цель — показать пользователю дату в красивом формате без времени, и вы не планируете дальше использовать это поле для сравнений или группировок, можно преобразовать дату в строку прямо в запросе. Рассмотрим несколько техник.

Подход 2.1: Функция ПОДСТРОКА

Это простой и довольно популярный "трюк". Он основан на том, что стандартное строковое представление даты в 1С обычно имеет вид "дд.мм.гггг чч:мм:сс". Мы можем просто "отрезать" первые 10 символов.


ВЫБРАТЬ
    ПОДСТРОКА(ВЫРАЗИТЬ(Документ.Дата КАК СТРОКА), 1, 10) КАК ДатаСтрокой
ИЗ
    Документ.ЧекККМ КАК Документ

Плюсы: Коротко и просто.

Минусы:

Подход 2.2: Функция СТРЗАМЕНИТЬ

Более надежный строковый метод. Сначала мы приводим дату к началу дня с помощью НАЧАЛОПЕРИОДА, чтобы гарантированно получить время "00:00:00", а затем просто удаляем эту часть строки.


ВЫБРАТЬ
    СТРЗАМЕНИТЬ(ВЫРАЗИТЬ(НАЧАЛОПЕРИОДА(ВТ_КП.Ссылка.Дата, ДЕНЬ) КАК СТРОКА), " 0:00:00", "") КАК ДатаСтрокой
ИЗ
    ИсточникДанных КАК ВТ_КП

Плюсы: Не зависит от длины формата даты, как ПОДСТРОКА. Явно удаляет нулевое время.

Минусы: Все те же, что и у предыдущего строкового метода — результат является строкой.

Способ 3: Настройки форматирования (СКД, условное оформление)

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

Разберем по шагам:

  1. В запросе используйте НАЧАЛОПЕРИОДА(ВашаДата, ДЕНЬ), чтобы подготовить данные для корректной группировки.
  2. В настройках отчета СКД на вкладке "Настройки" найдите ваше поле с датой.
  3. Откройте для него "Условное оформление" или просто настройки формата поля.
  4. В поле "Формат" укажите нужный вам формат представления даты. Например, ДФ=dd.MM.yyyy.

Также можно использовать вычисляемое поле в СКД. На вкладке "Вычисляемые поля" создайте новое поле, например, ДатаПредставление, и в колонке "Выражение" напишите:

ФОРМАТ(Дата, "ДФ = дд.ММ.гггг")

Важная ошибка новичков: Попытка использовать функцию ФОРМАТ() непосредственно в тексте запроса приведет к синтаксической ошибке. Как видно из обсуждения на форуме, многие сталкиваются с этой проблемой.


// ТАК ДЕЛАТЬ НЕЛЬЗЯ! БУДЕТ ОШИБКА!
ВЫБРАТЬ
    ФОРМАТ(Дата, "ДЛФ=Д")
ИЗ
    Документ.ЧекККМ

Функция ФОРМАТ() относится к встроенному языку 1С и механизмам СКД, но не к языку запросов.

Выводы

Выбор способа получения даты без времени напрямую зависит от вашей задачи:

← На главную