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

Разработка и Конфигурация · 10 мин

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

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

В 1С тип «Дата» всегда содержит и дату, и время с точностью до секунды. Даже если пользователь видит на форме только «12.05.2026», внутри значения хранится и время — чаще всего 00:00:00 или текущий момент. Из-за этого при выводе в отчёт, печатную форму или строку сообщения время «вылезает» там, где оно не нужно.

Задача «убрать время» решается несколькими способами: правильной настройкой состава даты в метаданных, функцией НачалоДня(), функцией Формат() с параметром «ДЛФ», а также средствами языка запросов. Выбор зависит от того, где именно нужно избавиться от времени — в данных, на форме или только при выводе.

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

Как 1С хранит дату и почему время появляется само

Тип «Дата» в платформе 1С — это единое значение, включающее календарную дату и время суток. Разделить их «физически» нельзя: любая переменная типа «Дата» содержит обе части. Максимум, что можно сделать, — обнулить время (привести его к 00:00:00) или не выводить его при преобразовании в строку.

Функция ТекущаяДата() возвращает дату вместе с текущим временем сеанса. Если записать её результат в реквизит и потом вывести, пользователь увидит, например, «12.05.2026 14:37:22». Именно это чаще всего становится причиной вопроса «как убрать время».

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

Способ 1. Настроить состав даты в свойствах реквизита

Самый правильный вариант, если время не нужно вообще, — задать состав даты на уровне конфигурации. Откройте свойства реквизита (документа, справочника, регистра) и в поле «Состав даты» выберите значение «Дата». После этого платформа сама будет отсекать время при записи, а на форме поле ввода не будет предлагать ввод часов и минут.

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

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

Способ 2. Обнулить время функцией НачалоДня()

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

ДатаДокумента = НачалоДня(ТекущаяДата());

// Результат: 12.05.2026 0:00:00

Обратная функция — КонецДня(Дата) — возвращает время 23:59:59. Пара этих функций стандартно используется для построения интервалов: отбор «за день» корректно задавать как период от НачалоДня(Дата) до КонецДня(Дата), а не сравнивать даты напрямую.

Присваивайте обнулённое значение до записи объекта, а не после. Если записать документ с временем, а потом менять реквизит, понадобится повторная запись — лишняя транзакция и риск срабатывания подписок на события.

bsl
ДатаБезВремени = НачалоДня(ТекущаяДата());
Сообщить(ДатаБезВремени); // 12.05.2026 0:00:00

Способ 3. Вывести дату без времени через Формат()

Когда время должно храниться, но не должно отображаться — в печатной форме, сообщении пользователю, наименовании файла — используют функцию Формат() с параметром «ДЛФ» (локальный формат даты).

СтрокаДаты = Формат(ДатаДокумента, "ДЛФ=D");

// Результат: 12.05.2026

СтрокаДлинная = Формат(ДатаДокумента, "ДЛФ=DD");

// Результат: 12 мая 2026 г.

Основные варианты параметра: ДЛФ=D — короткая дата (дд.мм.гггг), ДЛФ=DD — длинная дата с названием месяца, ДЛФ=DT — дата со временем. Полный форматный строковый синтаксис позволяет задать и произвольный шаблон, например Формат(Дата, "ДФ=dd.MM.yyyy").

Помните: Формат() возвращает строку, а не дату. Такое значение нельзя сравнивать как дату, использовать в отборах запроса или сортировать хронологически — строки «01.02.2026» и «31.01.2026» отсортируются по алфавиту, а не по времени.

Сравнение способов

Состав даты «Дата» в метаданных

Когда время не нужно в принципе. Ограничение: требует изменения конфигурации и реструктуризации данных.

НачалоДня()

Когда тип менять нельзя, но время в значении мешает. Ограничение: обнуляет время только в момент присвоения.

Формат() с ДЛФ

Когда нужно только красиво вывести. Ограничение: результат — строка, непригодная для сравнений и отборов.

НАЧАЛОПЕРИОДА в запросе

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

Способ 4. Получить дату без времени в запросе

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

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,

СУММА(Продажи.Сумма) КАК Сумма

ИЗ

РегистрНакопления.Продажи КАК Продажи

СГРУППИРОВАТЬ ПО

НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)

Для отбора записей за конкретный день не сравнивайте период равенством с датой без времени — записи с временем 10:00 не попадут в условие Период = &Дата, где &Дата имеет время 00:00:00. Правильно использовать диапазон: Период МЕЖДУ &НачалоДня И &КонецДня или условие Период >= &Начало И Период < &СледующийДень.

В отчётах на СКД дату без времени выводят либо через вычисляемое поле с НАЧАЛОПЕРИОДА, либо настройкой формата поля на закладке «Наборы данных» — там можно указать форматную строку ДЛФ=D для конкретного поля, не меняя запрос.

Вывод даты без времени в печатных формах и макетах

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

Область.Параметры.ДатаОтгрузки = Формат(Док.ДатаОтгрузки, "ДЛФ=D");

Альтернатива — задать формат прямо в макете. В свойствах ячейки макета (или параметра) есть поле «Формат», куда вписывается та же строка ДЛФ=D. Тогда при выводе параметра платформа сама применит формат, и в коде форматирование не потребуется.

Для полей ввода на управляемой форме действует похожий механизм: в свойствах поля задайте «Формат редактирования» — и пользователь увидит только дату, даже если в связанном реквизите хранится время.

Порядок действий для печатной формы
  1. 1
    Определите, где теряется время: в макете, в коде заполнения параметров или в самом реквизите
  2. 2
    Если время не нужно нигде — задайте состав даты «Дата» в свойствах реквизита
  3. 3
    Если время нужно в данных, но не на печати — добавьте Формат(Дата, "ДЛФ=D") при заполнении параметров
  4. 4
    Альтернатива: пропишите формат ДЛФ=D в свойствах ячейки макета
  5. 5
    Сформируйте печатную форму и проверьте, что время не отображается

Типичные ошибки и как их проверить

Самая частая ошибка — сравнение дат равенством, когда у одного значения есть время, а у другого нет. Условие Док.Дата = НачалоДня(ТекущаяДата()) не сработает для документа, созданного в 09:15. Сравнивайте через НачалоДня() обеих сторон или через диапазон.

Вторая ошибка — использование Формат() для последующей логики. Строка «12.05.2026» не участвует в сравнениях дат и в запросах как параметр типа «Дата» без обратного преобразования, которое платформа не делает автоматически.

Третья группа проблем — регистры сведений с периодичностью «в пределах дня» и «в пределах секунды». Если записи создаются с текущим временем, а потом ищутся по дате без времени, отбор ничего не найдёт. Здесь помогает либо запись через НачалоДня(), либо отбор по диапазону.

Типичные ошибки
01
Сравнение дат через «равно» без обнуления времени — условие не срабатывает для записей с ненулевым временем
02
Использование результата Формат() в отборах и сортировке — строка сортируется по алфавиту, а не по хронологии
03
Отбор в запросе «Период = &Дата» вместо диапазона — теряются все записи дня, кроме 00:00:00
04
Изменение состава даты без копии базы — время из существующих записей удаляется необратимо
05
Присвоение ТекущаяДата() реквизиту, который потом участвует в группировке по дням, — одна и та же дата распадается на несколько групп
Контрольные точки

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

Значение реквизита после записи
Норма

Время равно 0:00:00

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

Время отлично от нуля — проверьте состав даты и код присвоения

Вывод в печатной форме
Норма

Отображается только дата в нужном формате

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

Видны часы и минуты — формат не применён

Отбор записей за день
Норма

Попадают все записи с 00:00:00 до 23:59:59

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

Попадают только записи с нулевым временем — условие построено равенством

FAQ

Почему НачалоДня() не помогает — время всё равно выводится?

Скорее всего, функция применена не к тому значению или после вывода. НачалоДня() возвращает новое значение, а не меняет исходную переменную: нужно присвоить результат обратно, например Дата = НачалоДня(Дата). Также проверьте, что форматируется именно обнулённое значение.

Как вывести дату в формате «12 мая 2026» без года?

Используйте произвольную форматную строку: Формат(Дата, "ДФ='d MMMM'"). Параметр ДФ позволяет собрать шаблон из компонентов дня, месяца и года в любом сочетании.

Можно ли убрать время у даты документа?

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

Чем ТекущаяДата() отличается от ТекущаяДатаСеанса() в этой задаче?

Обе возвращают дату со временем, но ТекущаяДатаСеанса() учитывает часовой пояс сеанса, а ТекущаяДата() — время клиентского компьютера. Для обнуления времени разницы нет: обе оборачиваются в НачалоДня(). Для серверной логики предпочтительнее ТекущаяДатаСеанса().

Как в СКД сгруппировать продажи по дням без времени?

Добавьте в запрос набора данных поле НАЧАЛОПЕРИОДА(Период, ДЕНЬ) и группируйте по нему. Либо используйте стандартные поля-периоды «ПериодДень», которые СКД создаёт автоматически для дат — они уже содержат дату без времени.

Итог

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

Дата в 1С всегда содержит время — его можно только обнулить или скрыть. Для хранения без времени задайте состав даты «Дата» в метаданных, для обнуления значения используйте НачалоДня(), для вывода — Формат() с ДЛФ=D, в запросах — НАЧАЛОПЕРИОДА(Период, ДЕНЬ). Никогда не сравнивайте даты равенством без учёта времени.