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