Разработка и Конфигурация · 10 мин
Как в 1С указать дату без времени
Как в 1С указать дату без времени: функции НачалоДня, КонецДня, Дата(), форматирование и типовые ошибки при сравнении дат в запросах и коде.
В 1С:Предприятии встроенный тип «Дата» всегда содержит и календарную дату, и время с точностью до секунды. Отдельного типа «только дата» в платформе нет, поэтому под «датой без времени» понимают значение, у которого время обнулено — то есть полночь, 00:00:00. Такое значение получают функцией НачалоДня() или конструктором даты без указания часов, минут и секунд.
Проблема времени в датах — один из самых частых источников ошибок в отчётах и запросах. Документ проведён в 14:35:12, а пользователь отбирает данные «за 15 марта», указывая дату 15.03 с нулевым временем. Сравнение на равенство не срабатывает, документ «пропадает» из выборки, и бухгалтер видит расхождения в отчётах. Понимание того, как платформа хранит и сравнивает даты, позволяет избежать таких ситуаций.
Материал охватывает работу с датами во встроенном языке 1С, в языке запросов, в форматировании вывода и в типовых сценариях отбора по периоду. Приёмы одинаково применимы в конфигурациях на управляемых и обычных формах — различий в работе самих функций даты между ними нет.
Как платформа 1С хранит дату и почему время всегда присутствует
Тип «Дата» в 1С — это единое значение, включающее год, месяц, день, часы, минуты и секунды. Даже если вы вводите в поле документа только календарную дату, платформа дополняет значение временем 00:00:00. Убрать время из значения невозможно — можно только сделать его равным началу суток.
Из этого следует важное правило сравнения: две даты равны, только если совпадают и календарная часть, и время с точностью до секунды. Значение 15.03.2026 00:00:00 не равно 15.03.2026 09:15:00, хотя для пользователя это «один и тот же день». Все приёмы работы с датами без времени сводятся к тому, чтобы привести сравниваемые значения к единому виду — обычно к началу дня.
Получение даты без времени во встроенном языке
Основной инструмент — функция НачалоДня(). Она принимает любую дату и возвращает ту же дату с временем 00:00:00. Функция работает и с переменными, и с реквизитами объектов.
ДатаДокумента = Документ.Дата; // например, 15.03.2026 14:35:12
ДатаБезВремени = НачалоДня(ДатаДокумента); // 15.03.2026 00:00:00
Второй способ — конструктор даты. Если при создании значения указать только год, месяц и день, время автоматически станет нулевым:
НоваяДата = Дата(2026, 3, 15); // 15.03.2026 00:00:00
ТекущаяДатаБезВремени = НачалоДня(ТекущаяДатаСеанса());
Обратная функция — КонецДня() — возвращает 23:59:59 указанных суток. Она нужна не для «даты без времени», а для корректного указания границы периода: если отобрать документы по условию «меньше или равно НачалоДня(ДатаОкончания)», документы последнего дня с ненулевым временем в выборку не попадут.
- 1Определите исходное значение даты — реквизит объекта, параметр или ТекущаяДатаСеанса()
- 2Примените НачалоДня(ИсходнаяДата) — время обнулится до 00:00:00
- 3Для конца периода используйте КонецДня(ИсходнаяДата), а не НачалоДня
- 4Проверьте результат выводом: Сообщить(НачалоДня(Дата)) — должно отобразиться время 0:00:00
Дата без времени в запросах 1С
В языке запросов есть аналогичные приёмы. Чтобы отбросить время у поля даты, применяется функция НАЧАЛОПЕРИОДА с параметром ДЕНЬ:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК ДатаБезВремени
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Для отбора документов за конкретный день надёжнее всего передавать границы периода параметрами и сравнивать через «между» или пару условий. Не сравнивайте дату документа на равенство с датой без времени — это классическая ошибка, из-за которой теряются документы.
ГДЕ
Реализация.Дата МЕЖДУ &НачалоДня И &КонецДня
// Параметры в коде:
// Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ДатаОтбора));
// Запрос.УстановитьПараметр("КонецДня", КонецДня(ДатаОтбора));
Альтернатива — сравнение уже усечённых значений: НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) = &Дата. Такой вариант читаемее, но при больших объёмах данных может работать медленнее, потому что функция применяется к каждой строке таблицы и мешает использовать индекс по полю даты.
Способы отбора за один день
Быстро работает на больших таблицах, использует индекс. Требует передачи двух параметров или одного параметра-границы.
Проще читается, один параметр. Минус — вычисление для каждой строки, на больших таблицах запрос может замедлиться.
Не используйте: документы с ненулевым временем не попадут в выборку, ошибка проявится только в отчётности.
Вывод даты без времени: форматирование
Часто требуется не изменить значение, а только показать его пользователю без времени — в печатной форме, сообщении или отчёте. Для этого служит функция Формат() с форматной строкой.
СтрокаДаты = Формат(Документ.Дата, "ДЛФ=D"); // "15 марта 2026 г."
КороткаяДата = Формат(Документ.Дата, "ДФ=dd.MM.yyyy"); // "15.03.2026"
Параметр ДЛФ=D выводит длинную дату без времени, ДФ позволяет задать произвольный шаблон. Важно понимать разницу: форматирование меняет только представление, само значение даты со временем остаётся прежним. Если дальше эта дата участвует в сравнениях, время по-прежнему учитывается.
В макетах табличных документов и схемах компоновки данных формат задаётся в свойствах поля или параметра вывода — там же доступна форматная строка даты. Это удобно, когда отчёт строится без написания кода.
Дата без времени в реквизитах и на формах
У реквизита типа «Дата» в конфигураторе есть свойство «Состав даты». Оно принимает три значения: «Дата», «Время» и «Дата и время». Если для реквизита достаточно календарной даты — например, дата рождения сотрудника или дата договора — установите состав «Дата». Тогда платформа будет хранить только календарную часть, а поле ввода на форме не станет предлагать ввод времени.
Это правильное архитектурное решение для данных, где время заведомо не нужно. Оно исключает случайное появление ненулевого времени и упрощает сравнения. Менять состав даты у существующего реквизита с данными следует осторожно: при сужении состава с «Дата и время» до «Дата» компонент времени в хранимых значениях может быть усечён — проверьте последствия на копии базы.
Для даты документа состав менять обычно нельзя и не нужно: платформа использует момент времени документа для упорядочивания проведения, поэтому дата документа всегда содержит время. Обрабатывайте её функциями НачалоДня() и КонецДня() в местах отбора и сравнения.
Типичные ошибки при работе с датами без времени
Самая распространённая ошибка — сравнение даты документа с датой без времени на равенство. Пока разработчик тестирует на документах, введённых ровно в полночь (что бывает при загрузке), всё работает; на реальных данных отбор перестаёт находить записи.
Вторая ошибка — использование НачалоДня() для правой границы периода. Отчёт «с 1 по 31 марта» с условием «Дата <= НачалоДня(31.03)» фактически включает только 30 марта полностью. Правильная правая граница — КонецДня(ДатаОкончания) или начало следующего дня со строгим неравенством.
Третья группа ошибок связана с часовыми поясами. Функция ТекущаяДата() на клиенте возвращает время компьютера пользователя, а ТекущаяДатаСеанса() — время сеанса с учётом настроек сервера. При обнулении времени через НачалоДня() разница в часовых поясах может сдвинуть «сегодня» на соседние сутки. В серверном коде и запросах используйте ТекущаяДатаСеанса().
Проверка результата и границы применения
Проверить, что дата действительно без времени, можно простым выводом: Сообщить(НачалоДня(ТекущаяДатаСеанса())) покажет значение с временем 0:00:00. В запросе контролируйте результат через консоль запросов — поле после НАЧАЛОПЕРИОДА(..., ДЕНЬ) должно отображаться с нулевым временем.
Для проверки корректности отбора за период сравните количество документов за день двумя способами: через «МЕЖДУ начало и конец дня» и через условие на равенство усечённой даты. Совпадение результата подтверждает, что границы заданы верно.
Как проверить результат
Время равно 0:00:00
Время отлично от нуля — НачалоДня не применено
Находятся все документы дня независимо от времени проведения
Часть документов не попадает в выборку
Документы последнего дня периода присутствуют
Последний день пустой — граница задана через НачалоДня
Часто задаваемые вопросы
Можно ли вообще убрать время из значения типа «Дата»?
Нет, тип «Дата» в 1С всегда содержит компонент времени. Можно обнулить его функцией НачалоДня() или настроить реквизит с составом даты «Дата», чтобы платформа хранила только календарную часть.
Чем отличается НачалоДня от КонецДня?
НачалоДня возвращает 00:00:00 указанных суток, КонецДня — 23:59:59. Первая функция нужна для дат без времени и левой границы периода, вторая — для правой границы, чтобы включить весь день целиком.
Как вывести дату без времени в печатной форме?
Используйте Формат(Дата, "ДЛФ=D") для полного написания или Формат(Дата, "ДФ=dd.MM.yyyy") для числового. В макете табличного документа формат можно задать в свойствах параметра без кода.
Почему запрос не находит документы за выбранный день?
Чаще всего дата документа сравнивается на равенство с датой без времени. Документ проведён, например, в 10:20:00 и не равен полуночи. Замените условие на «МЕЖДУ НачалоДня И КонецДня» или сравнение через НАЧАЛОПЕРИОДА.
Что выбрать в свойстве «Состав даты» для даты рождения?
Значение «Дата». Время для таких реквизитов не нужно, а состав «Дата» исключает случайное появление ненулевого времени и упрощает сравнения и поиск.
Как получить текущую дату без времени на сервере?
Используйте НачалоДня(ТекущаяДатаСеанса()). Функция ТекущаяДатаСеанса() учитывает часовой пояс сеанса, поэтому результат не сместится на соседние сутки, в отличие от клиентской ТекущаяДата().
Что важно запомнить
Дата в 1С всегда содержит время; «дата без времени» — это значение с нулевым временем. Получайте его функцией НачалоДня(), для правой границы периода берите КонецДня(), для вывода — Формат() с ДЛФ или ДФ, а для реквизитов без времени настраивайте состав даты «Дата». Никогда не сравнивайте дату документа на равенство с датой без времени.