В разработке на платформе 1С часто возникает задача — получить из поля с типом "Дата" только саму дату, отбросив временную составляющую. Например, для группировки документов по дням или для вывода в отчет в формате "дд.мм.гггг". В этой статье мы подробно разберем, как это сделать, и проанализируем несколько подходов, каждый из которых подходит для своей цели.
Основная сложность в том, что в 1С поле типа Дата всегда содержит и дату, и время. Даже если время не указано явно, оно будет равно "00:00:00". Поэтому наша задача сводится не к "удалению" времени, а к его правильной обработке в зависимости от конечной цели: логические операции в запросе или форматирование для вывода пользователю.
Это самый правильный и универсальный способ, если вам нужно использовать дату без времени для дальнейших операций внутри запроса: группировки, соединения таблиц по дате, установки условий в секции ГДЕ.
Функция НАЧАЛОПЕРИОДА() возвращает дату с временем, установленным на начало указанного периода (день, месяц, год и т.д.).
Как это работает?
Мы передаем в функцию наше поле с датой и указываем в качестве второго параметра периодичность "ДЕНЬ". Функция вернет нам ту же дату, но время будет всегда "00:00:00".
Посмотрим на пример:
ВЫБРАТЬ
Продажи.Ссылка,
Продажи.Дата,
НАЧАЛОПЕРИОДА(Продажи.Дата, ДЕНЬ) КАК ДатаБезВремени
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
Результат:
Если в поле Продажи.Дата было значение "15.09.2023 14:35:12", то поле ДатаБезВремени вернет "15.09.2023 00:00:00".
Преимущества этого метода:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Дата, ДЕНЬ) КАК ДеньПродаж,
СУММА(Продажи.СуммаДокумента) КАК СуммаЗаДень
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Дата, ДЕНЬ)
Важный нюанс: как было отмечено в обсуждении, этот способ не "убирает" время, а обнуляет его. При выводе результата запроса вы все равно можете увидеть "00:00:00". Для того чтобы скрыть это время при отображении, нужно использовать настройки форматирования, например, в Системе Компоновки Данных (СКД).
Если ваша единственная цель — показать пользователю дату в красивом формате без времени, и вы не планируете дальше использовать это поле для сравнений или группировок, можно преобразовать дату в строку прямо в запросе. Рассмотрим несколько техник.
Это простой и довольно популярный "трюк". Он основан на том, что стандартное строковое представление даты в 1С обычно имеет вид "дд.мм.гггг чч:мм:сс". Мы можем просто "отрезать" первые 10 символов.
ВЫБРАТЬ
ПОДСТРОКА(ВЫРАЗИТЬ(Документ.Дата КАК СТРОКА), 1, 10) КАК ДатаСтрокой
ИЗ
Документ.ЧекККМ КАК Документ
Плюсы: Коротко и просто.
Минусы:
Более надежный строковый метод. Сначала мы приводим дату к началу дня с помощью НАЧАЛОПЕРИОДА, чтобы гарантированно получить время "00:00:00", а затем просто удаляем эту часть строки.
ВЫБРАТЬ
СТРЗАМЕНИТЬ(ВЫРАЗИТЬ(НАЧАЛОПЕРИОДА(ВТ_КП.Ссылка.Дата, ДЕНЬ) КАК СТРОКА), " 0:00:00", "") КАК ДатаСтрокой
ИЗ
ИсточникДанных КАК ВТ_КП
Плюсы: Не зависит от длины формата даты, как ПОДСТРОКА. Явно удаляет нулевое время.
Минусы: Все те же, что и у предыдущего строкового метода — результат является строкой.
Это лучший способ для подготовки отчетов. Идея в том, чтобы разделить логику: в запросе мы получаем данные, а за их красивое отображение отвечает другой механизм — СКД. Для наглядного представления дат и периодов в отчетах можно использовать пример формирования шапки отчета по неделям и месяцам в СКД.
Разберем по шагам:
НАЧАЛОПЕРИОДА(ВашаДата, ДЕНЬ), чтобы подготовить данные для корректной группировки.ДФ=dd.MM.yyyy.Также можно использовать вычисляемое поле в СКД. На вкладке "Вычисляемые поля" создайте новое поле, например, ДатаПредставление, и в колонке "Выражение" напишите:
ФОРМАТ(Дата, "ДФ = дд.ММ.гггг")
Важная ошибка новичков: Попытка использовать функцию ФОРМАТ() непосредственно в тексте запроса приведет к синтаксической ошибке. Как видно из обсуждения на форуме, многие сталкиваются с этой проблемой.
// ТАК ДЕЛАТЬ НЕЛЬЗЯ! БУДЕТ ОШИБКА!
ВЫБРАТЬ
ФОРМАТ(Дата, "ДЛФ=Д")
ИЗ
Документ.ЧекККМ
Функция ФОРМАТ() относится к встроенному языку 1С и механизмам СКД, но не к языку запросов.
Выбор способа получения даты без времени напрямую зависит от вашей задачи:
НАЧАЛОПЕРИОДА(ВашаДата, ДЕНЬ).ПОДСТРОКА или СТРЗАМЕНИТЬ.НАЧАЛОПЕРИОДА, а форматирование настраивайте в самой СКД. Это разделяет логику получения данных и их представления.