Разработка и Конфигурация · 10 мин
1С 8: как получить дату без времени
Как в 1С 8 получить дату без времени: функции НачалоДня, запросы, формат и состав даты в реквизитах. Примеры кода, типичные ошибки и проверка результата.
Во встроенном языке 1С 8 значение типа «Дата» всегда содержит и дату, и время с точностью до секунды. Это часто становится проблемой: сравнение двух дат даёт «ложь», отбор в запросе не находит документы, а отчёт группирует данные по секундам вместо дней. Причина почти всегда одна — в значении осталась ненулевая часть времени.
Задача «получить дату без времени» решается несколькими способами в зависимости от контекста: в коде, в запросе, при настройке реквизита или при выводе на форму и в печать. Ниже разобраны все рабочие варианты с примерами и типичными ошибками.
Важно понимать: «дата без времени» в 1С — это не отдельный тип данных на уровне значения, а дата, у которой время равно 00:00:00. Либо это реквизит с составом даты «Дата», где платформа сама отсекает время при записи.
Как устроен тип «Дата» в 1С 8
Тип «Дата» в 1С 8 хранит календарную дату и время одновременно. Даже если вы создаёте дату конструктором Дата(2026, 5, 15), внутри значения будет 15.05.2026 00:00:00 — время присутствует всегда, просто равно началу суток.
Из-за этого выражение Документ.Дата = ТекущаяДатаСеанса() почти никогда не бывает истинным: у документа своё время, у текущей даты сеанса — своё, и совпадение до секунды практически невозможно. Корректное сравнение «в один день» требует обрезания времени у обеих сторон.
Отдельно существует понятие состава даты у реквизитов метаданных: «Дата», «Время» или «Дата и время». Это настройка хранения, а не тип значения — она определяет, что платформа запишет в базу.
Получение даты без времени в коде: НачалоДня
Основной способ — функция НачалоДня(). Она принимает любое значение даты и возвращает начало этого дня:
ДатаБезВремени = НачалоДня(ТекущаяДатаСеанса());
// результат: сегодняшняя дата со временем 00:00:00
ДатаДокументаБезВремени = НачалоДня(ДокументОбъект.Дата);
Типичная задача — сравнить, относятся ли два значения к одному дню:
Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда
// обе даты относятся к одному календарному дню
КонецЕсли;
Для проверки «дата попадает в сегодня» удобна связка НачалоДня и КонецДня, но чаще достаточно сравнения с началом текущего и следующего дня:
Если Документ.Дата >= НачалоДня(ТекущаяДатаСеанса())
И Документ.Дата < НачалоДня(ТекущаяДатаСеанса()) + 86400 Тогда
// документ проведён сегодня
КонецЕсли;
Обратите внимание: 86400 — это количество секунд в сутках. Арифметика дат в 1С работает именно в секундах, операция Дата + 1 добавит одну секунду, а не один день. Это одна из самых частых ошибок начинающих разработчиков.
ДатаБезВремени = НачалоДня(ТекущаяДатаСеанса()); // 00:00:00 текущего дняДата без времени в запросах
Функция НАЧАЛОПЕРИОДА
В языке запросов для отсечения времени используется функция НАЧАЛОПЕРИОДА с параметром «ДЕНЬ»:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)
Такой запрос сгруппирует обороты по календарным дням, отбросив время каждой записи. Без НАЧАЛОПЕРИОДА группировка шла бы по каждой уникальной секунде, и итоги «по дням» не получились бы.
Отбор по конкретному дню
Чтобы выбрать документы за один день, не сравнивайте дату на равенство — используйте диапазон:
ГДЕ
Док.Дата >= &НачалоДня
И Док.Дата < &СледующийДень
Параметры при этом задаются из кода: НачалоДня(НужнаяДата) и НачалоДня(НужнаяДата) + 86400. Вариант с КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) тоже рабочий, но сравнение «меньше начала следующего дня» надёжнее: граница 23:59:59 может конфликтовать с точностью хранения в некоторых СУБД.
Если нужно сравнить параметр-константу с датой без времени прямо в тексте запроса, используйте конструктор ДАТАВРЕМЯ(2026, 5, 15) — он создаёт дату с нулевым временем.
Состав даты в реквизитах: отсечение времени на уровне хранения
Если время в реквизите вообще не нужно (дата рождения, дата договора, дата начала действия цены), правильное решение — настроить состав даты в конфигураторе. Откройте свойства реквизита, найдите параметр «Состав даты» и установите значение «Дата».
После этого платформа будет автоматически отбрасывать время при записи: даже если код присвоит реквизиту значение с временем 14:32:07, в базу запишется 00:00:00. Это избавляет от необходимости вызывать НачалоДня в каждом месте, где реквизит заполняется или сравнивается.
Обратная настройка — состав даты «Время» — хранит только время, и при чтении дата будет 01.01.0001 с заданным временем. Для типа «Дата и время» (по умолчанию) хранится всё.
Отображение даты без времени: формат и форматная строка
Когда время нужно скрыть только визуально — в форме, отчёте СКД или печатной форме — данные трогать не требуется. Достаточно задать представление:
СтрокаДаты = Формат(Документ.Дата, "ДЛФ=D"); // "15.05.2026"
В форме для поля ввода и колонки таблицы есть свойство «Формат», куда можно вписать ту же строку ДЛФ=D или ДФ=dd.MM.yyyy. В СКД формат задаётся на закладке «Наборы данных» для поля либо в настройках оформления.
Важно различать: формат меняет только отображение, значение по-прежнему содержит время. Если дальше эта дата участвует в сравнениях или отборах — используйте НачалоДня, а не Формат. Преобразование в строку и обратно через Дата() — плохая практика: результат зависит от региональных настроек и легко ломается.
Сравнение вариантов
Универсально для сравнений и вычислений. Значение остаётся типом «Дата». Требует вызова в каждом месте использования
Для группировок и отборов в запросах. Не применимо вне запроса
Решение на уровне хранения: время отсекается автоматически. Требует изменения конфигурации и реструктуризации
Только визуальное отображение. Значение в данных не меняется, для логики не подходит
Проверка результата
Убедиться, что время действительно отсечено, можно несколькими способами. Самый быстрый — вывести значение в сообщение:
Сообщить(НачалоДня(ТекущаяДатаСеанса()));
// ожидаемый вид: 15.05.2026 0:00:00
Если в выводе после даты стоит 0:00:00 — время обрезано. Любое другое значение времени означает, что отсечение не сработало или применено не к той переменной.
Для реквизита с составом даты «Дата» проверка делается через запрос или консоль кода: прочитайте записанное значение и посмотрите на время. Помните, что данные, записанные до изменения состава даты, обновятся только после реструктуризации при обновлении конфигурации.
Как проверить результат
Время равно 0:00:00
Время отличается от полуночи — НачалоДня не применён
НачалоДня(Д1) = НачалоДня(Д2) возвращает Истина
Сравнение ложно при визуально одинаковых датах — время не обрезано
Одна строка на каждый календарный день
Много строк внутри одного дня — группировка без НАЧАЛОПЕРИОДА
В базе время 00:00:00 при составе даты «Дата»
Время сохраняется — состав даты не изменён или реструктуризация не выполнена
FAQ
Чем отличается НачалоДня от КонецДня?
НачалоДня возвращает 00:00:00 указанного дня, КонецДня — 23:59:59. Для отборов в запросах надёжнее использовать пару «начало дня — начало следующего дня» со строгим неравенством, чем КонецДня: это исключает пограничные проблемы с точностью хранения дат в СУБД.
Можно ли получить дату без времени без функций, просто присвоением?
Конструктор Дата(год, месяц, день) создаёт значение с нулевым временем, поэтому Дата(2026, 5, 15) — уже «дата без времени». Но если исходное значение получено из документа или ТекущаяДатаСеанса(), время в нём есть, и без НачалоДня не обойтись.
Почему запрос не находит документы при отборе по дате?
Чаще всего параметр содержит время, отличное от времени документов, а условие записано через равенство. Замените условие на диапазон: Дата >= НачалоДня и Дата < НачалоДня следующего дня. Также проверьте, что в параметр передаётся дата, а не строка.
Что произойдёт со старыми данными при смене состава даты на «Дата»?
При обновлении конфигурации платформа выполнит реструктуризацию и обрежет время у всех существующих значений реквизита. Операция необратима, поэтому перед изменением нужна резервная копия базы и проверка, что время не используется в прикладной логике.
Как вывести дату без времени в печатной форме?
Используйте Формат(Дата, "ДЛФ=D") при заполнении параметров макета — получится строка вида «15.05.2026». Если в макете поле типа «Дата», можно задать форматную строку непосредственно в свойствах области или параметра.
Есть ли разница между ТекущаяДата() и ТекущаяДатаСеанса() для этой задачи?
ТекущаяДатаСеанса() возвращает дату компьютера сеанса с учётом часового пояса сеанса и предпочтительна в клиент-серверном режиме. Для отсечения времени разницы нет — обе функции возвращают дату со временем, и обе требуют НачалоДня.
Что важно запомнить
Дата в 1С 8 всегда содержит время; «дата без времени» — это дата со временем 00:00:00. В коде используйте НачалоДня(), в запросах — НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) и отборы диапазоном, для реквизитов — состав даты «Дата», для отображения — Формат с ДЛФ=D. Не сравнивайте даты на равенство без отсечения времени и помните, что арифметика дат идёт в секундах.