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

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

Как убрать время в дате в 1С

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

В 1С значение типа «Дата» всегда хранит и дату, и время с точностью до секунды. Часто время мешает: оно выводится в отчётах и печатных формах в виде «12.03.2026 14:35:07», ломает сравнения дат в запросах и создаёт лишние группировки в СКД. Убрать время можно несколькими способами — в зависимости от того, где именно нужен результат: в коде, в запросе, в отчёте или в самом хранилище данных.

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

Ниже разобраны рабочие способы для встроенного языка, языка запросов, СКД и пользовательских настроек, а также типичные ошибки, из-за которых время «возвращается» даже после, казалось бы, правильных действий.

Как устроен тип «Дата» в 1С и почему время появляется

Тип «Дата» в платформе 1С:Предприятие всегда содержит и календарную дату, и время суток. Отдельного типа «только дата» в платформе нет. Когда вы видите в документе «12.03.2026 0:00:00», это означает, что время равно полуночи, но оно физически присутствует в значении.

Время появляется в реквизитах по разным причинам. Документы по умолчанию получают дату с текущим временем сеанса. Реквизиты с составом даты «Дата и время» явно хранят время. При загрузке данных из внешних источников время часто приходит вместе с датой. Именно поэтому задача «убрать время» возникает так часто.

В конфигураторе у реквизита типа «Дата» есть свойство «Состав даты» с вариантами «Дата», «Время» и «Дата и время». Если у реквизита выбран состав «Дата», платформа сама обрезает время при записи. Это единственный способ заставить базу хранить чистую дату без дополнительного кода.

Как убрать время в коде на встроенном языке

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

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

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

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

Если нужно только вывести дату без времени в сообщение, журнал или строковое поле, используйте функцию Формат() с форматной строкой:

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

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

Параметр ДЛФ=D означает «локальный формат даты» без времени. Вариант ДЛФ=DT выводит дату и время, ДЛФ=T — только время. Помните: Формат() возвращает строку, а не дату. Использовать результат для сравнений и арифметики дат нельзя.

bsl
ДатаБезВремени = НачалоДня(ТекущаяДатаСеанса());
СтрокаДляВывода = Формат(ДатаБезВремени, "ДЛФ=D");

Как отсечь время в запросе

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Такой приём решает типичную проблему: если группировать по полю «Период» напрямую, каждый документ с уникальным временем попадёт в отдельную группу, и итоги по дням развалятся на множество строк. Группировка по НАЧАЛОПЕРИОДА(..., ДЕНЬ) объединяет все записи одного календарного дня.

Для сравнения дат без учёта времени есть два подхода. Первый — привести обе стороны к началу дня: ГДЕ НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = &ДатаБезВремени. Второй, обычно более быстрый, — передать в запрос диапазон: ГДЕ Документ.Дата МЕЖДУ &НачалоДня И &КонецДня, где параметры вычислены в коде через НачалоДня() и КонецДня(). Диапазонное условие позволяет использовать индекс по дате, а оборачивание поля в функцию индекс, как правило, отключает.

Как убрать время в отчётах и СКД

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

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

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

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

Настройка реквизитов: состав даты и формат полей формы

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

У этого решения есть ограничения. Изменение состава даты не перезаписывает существующие данные: время в уже сохранённых объектах останется до их перезаписи. Для документов состав даты менять нельзя — дата документа всегда содержит время, потому что оно участвует в определении позиции документа на временной оси. Для регистров сведений с периодичностью «в пределах дня» аналогичное ограничение снимается выбором периодичности «в пределах дня» или «непериодический».

Для полей формы можно задать формат отображения без изменения данных: в свойствах поля ввода найдите «Формат» или «ФорматРедактирования» и укажите ДЛФ=D. Пользователь увидит только дату, хотя в реквизите время сохранится.

Сравнение вариантов

НачалоДня / НАЧАЛОПЕРИОДА

Реально отсекает время. Подходит для сравнений, группировок, записи в реквизиты. Требует изменения кода или запроса.

Формат с ДЛФ=D

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

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

Решение на уровне хранения: время не сохраняется вообще. Не применимо к датам документов и не меняет уже записанные данные.

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

Самая частая ошибка — сравнение дат «в лоб»: Если Документ.Дата = ТекущаяДатаСеанса() Тогда .... Такое условие почти никогда не выполняется, потому что время различается до секунд. Сравнивайте начала дней или используйте диапазон.

Вторая ошибка — использовать Формат() и затем сравнивать или сортировать результат как дату. Строка «01.02.2026» при строковой сортировке окажется раньше «02.01.2026», что даёт неверный порядок. Форматируйте только на последнем этапе, при выводе.

Третья ошибка — обрезать время строковыми функциями (Лев(Строка(Дата), 10)). Результат зависит от региональных настроек и формата представления даты, такой код непереносим и хрупок. Всегда используйте специализированные функции работы с датами.

Типичные ошибки
01
Сравнение дат оператором «=» без приведения к началу дня — условие не срабатывает из-за различий во времени.
02
Группировка в запросе по полю Период без НАЧАЛОПЕРИОДА — итоги по дням распадаются на отдельные строки по каждому документу.
03
Применение Формат() и последующее сравнение результата как даты — строка не участвует в арифметике дат, логика ломается.
04
Обрезка даты строковыми функциями — код зависит от региональных настроек и ломается на другом окружении.
05
Смена состава даты реквизита без перезаписи существующих объектов — старые данные остаются с временем.
Контрольные точки

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

Значение даты после обработки
Норма

Время равно 0:00:00 (начало дня)

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

Осталось исходное время или значение стало строкой

Сравнение дат в коде или запросе
Норма

Даты одного календарного дня распознаются как равные

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

Условие не срабатывает для дат внутри одного дня

Группировка в отчёте
Норма

Одна строка на каждый календарный день

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

Несколько строк на один день с разным временем

Отображение в отчёте и печатной форме
Норма

Выводится только дата, например 12.03.2026

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

Рядом с датой по-прежнему выводится время

Проверка результата и безопасные границы

После применения любого способа проверьте результат на контрольном примере. Возьмите документ с известным временем, убедитесь, что в выборке дата стала с нулевым временем, а итоги по дню сгруппированы корректно. Для запросов удобно временно вывести исходное и обработанное значение рядом.

Изменения в коде и запросах безопасны: они не трогают данные в базе. Осторожность нужна при смене состава даты реквизита и при массовой перезаписи объектов для очистки времени — такие операции выполняйте на копии базы и с резервной копией. Массовая перезапись документов может затронуть связанные движения и обмены данными.

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

Итог

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

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

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

Можно ли в 1С создать переменную, которая хранит только дату без времени?

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

Почему в запросе условие «Дата = &Дата» не находит документы?

Потому что сравнение идёт с точностью до секунды, а время документа почти всегда отличается от времени параметра. Передайте в запрос границы дня (НачалоДня и КонецДня) и используйте условие МЕЖДУ — оно корректно и использует индекс.

Как убрать время в печатной форме, если дата выводится из макета?

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

Изменится ли время в уже записанных документах, если поменять состав даты реквизита?

Нет. Состав даты влияет только на новые записи и перезаписываемые объекты. Существующие данные сохранят время до их перезаписи. Кроме того, для даты документа состав даты изменить нельзя в принципе.

Как убрать время в динамическом списке без изменения конфигурации?

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

Чем отличаются ДЛФ=D и ДФ=dd.MM.yyyy в функции Формат()?

ДЛФ=D использует региональные настройки и выводит дату в привычном пользователю виде, а ДФ=dd.MM.yyyy задаёт жёсткий шаблон. Для интерфейсов предпочтителен ДЛФ=D, фиксированный шаблон уместен при обмене данными, где важен стабильный формат строки.