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

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

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

Как убрать время из даты в 1С: НАЧАЛОПЕРИОДА в запросе, функции встроенного языка, настройка формата в отчётах и СКД. Примеры кода и типичные ошибки.

Дата в 1С почти всегда хранится с точностью до секунды, даже если пользователь вводит только день. Поэтому типовая дата документа выглядит как «15.03.2026 14:23:07», а при сравнении, группировке или выводе на печать время часто мешает: две записи одного дня считаются разными, отчёт группируется по секундам, а в печатной форме появляются лишние «0:00:00».

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

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

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

Тип «Дата» в платформе 1С всегда содержит и календарную дату, и время с точностью до секунды. Отдельного типа «только день» в встроенном языке нет. Если пользователь вводит в поле только дату, время автоматически становится «0:00:00» — но значение всё равно остаётся полноценной датой-временем.

Из-за этого возникают типичные проблемы. Сравнение Дата1 = Дата2 возвращает «Ложь», если различаются хотя бы секунды. Группировка в запросе по полю даты разбивает данные по моментам времени, а не по дням. При выгрузке в Excel или выводе в табличный документ время отображается, даже когда оно не нужно.

Как убрать время в запросе через НАЧАЛОПЕРИОДА

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

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК День,

СУММА(Реализация.Сумма) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

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

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ)

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

Учтите особенность с отборами по периоду. Если нужно выбрать записи за день, надёжнее сравнивать дату с границами >= &НачалоДня И <= &КонецДня, где конец дня получается через КОНЕЦПЕРИОДА(Дата, ДЕНЬ) — это 23:59:59. Сравнение через равенство с НАЧАЛОПЕРИОДА работает, но на больших таблицах применение функции к индексированному полю в условии может мешать использованию индекса.

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

В модуле используется встроенная функция НачалоДня(), которая возвращает дату с обнулённым временем:

ДатаБезВремени = НачалоДня(ДокументОбъект.Дата);

// 15.03.2026 14:23:07 превратится в 15.03.2026 0:00:00

Аналогично работают функции НачалоМесяца(), НачалоНедели(), НачалоКвартала() и НачалоГода() — все они приводят дату к началу соответствующего периода. Для получения конца дня есть КонецДня(), возвращающая 23:59:59.

Если функция почему-то недоступна (например, пишется универсальный код), время можно отсечь арифметикой: вычесть из даты остаток от деления на 86400 (число секунд в сутках). Но штатные функции читаемее и предпочтительнее.

Порядок действий при сравнении дат в коде
  1. 1
    Получите оба значения дат, которые нужно сравнить
  2. 2
    Приведите каждую дату к началу дня через НачалоДня()
  3. 3
    Сравните полученные значения обычным оператором равенства
  4. 4
    Проверьте результат на датах с разным временем одного дня

Как вывести дату без времени, не меняя значение

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

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

// Результат: "15.03.2026"

Параметр ДЛФ=D (длинный формат даты) выводит только календарную часть. Вариант ДФ=dd.MM.yyyy даёт тот же результат с явным шаблоном. Форматные строки работают и в языке запросов — через выражение ВЫБОР или в построителе отчёта, но чаще форматирование применяют уже к результату запроса при выводе.

Важно помнить: Формат() возвращает строку, а не дату. Такое значение нельзя сравнивать как дату, использовать в расчётах периодов или передавать в реквизиты типа «Дата» без обратного преобразования.

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

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

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

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

Сравнение способов убрать время

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

Подходит для группировок и отборов; меняет значение на уровне данных; требует осторожности с индексами в условиях

НачалоДня() в коде

Универсально для сравнений и записи в реквизиты; работает только во встроенном языке, не в запросе

Формат() / ДЛФ=D

Только отображение; возвращает строку; не подходит для сравнений и расчётов

Формат поля в СКД

Лучший вариант для отчётов: данные целые, вид чистый; не работает вне компоновки

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

Самая частая ошибка — сравнение дат без приведения к началу дня. Проверка Если Документ.Дата = ОтчетнаяДата Тогда не сработает, если у документа время отлично от нуля. Всегда приводите обе стороны через НачалоДня().

Вторая ошибка — использование конца дня «23:59:59», заданного вручную, при выгрузке в системы, где время хранится с миллисекундами. Записи в последнюю секунду могут потеряться. Надёжнее условие < НачалоДня(СледующийДень) вместо <= КонецДня(День).

Третья ошибка — попытка «убрать время» изменением типа реквизита в конфигураторе на «Дата» с составом «Дата» вместо «Дата и время». Это рабочее решение для новых реквизитов, но для существующих данных изменение состава даты отсекает время безвозвратно. Перед таким изменением сделайте резервную копию информационной базы.

Типичные ошибки
01
Сравнение дат напрямую — записи одного дня с разным временем считаются разными
02
Формат() вместо НачалоДня() — строка вместо даты ломает сортировку и сравнение
03
Изменение состава даты реквизита без копии базы — время теряется безвозвратно
04
Условие <= КонецДня при обмене с системами с миллисекундами — потеря пограничных записей

Контрольные точки: как проверить результат

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

Для запросов полезно вывести рядом исходное поле и обработанное — так сразу видно, что время обнулено, а день сохранился. В отчётах СКД проверьте итоги: группировка по дням должна объединять все документы дня в одну строку.

Контрольные точки

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

Значение после НачалоДня()
Норма

Время равно 0:00:00, день не изменился

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

День сместился или время осталось

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

Одна строка на день, суммы совпадают с контрольным расчётом

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

Несколько строк на один день

Вывод через Формат()
Норма

На экране только дата, исходное значение доступно для расчётов

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

Дальнейшие сравнения работают некорректно — значит, строка попала в расчёты

Итог

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

Время в 1С отсекается приведением к началу дня: НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) в запросе и НачалоДня() в коде. Для отображения без изменения значения используйте Формат(..., "ДЛФ=D") или формат поля в СКД. Перед изменением состава даты реквизита делайте резервную копию.

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

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

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

Чем отличается НачалоДня() от Формат()?

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

Почему сравнение дат не работает, хотя дни одинаковые?

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

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

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

Можно ли сделать реквизит, который хранит дату без времени?

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

Как правильно задать отбор за один день?

Используйте условие Дата >= НачалоДня(&День) И Дата < ДобавитьКДате(НачалоДня(&День), ДЕНЬ, 1) или пару НАЧАЛОПЕРИОДА/КОНЕЦПЕРИОДА в запросе. Это надёжнее, чем сравнение на равенство.