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