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

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

Как получить дату без времени в 1С

Как получить дату без времени в 1С: функция НачалоДня, форматирование строкой, сравнение дат в запросах и типичные ошибки при работе с типом Дата.

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

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

Важно понимать разницу между двумя задачами: «получить дату без времени для сравнения и отбора» и «показать пользователю дату без времени». В первом случае нужна функция НачалоДня(), во втором достаточно форматирования — само значение при этом не меняется.

Как устроен тип «Дата» в 1С

Значение типа «Дата» в 1С хранит календарную дату и время с точностью до секунды: например, 15.03.2026 14:32:17. Пустая дата представлена как 01.01.0001 00:00:00. Это единый тип — нельзя объявить переменную, которая хранит только число, месяц и год без временной части.

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

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

Основной способ — функция НачалоДня()

Функция НачалоДня() принимает один параметр — значение типа «Дата» — и возвращает дату с обнулённым временем. Это стандартный и рекомендуемый способ получить дату без времени во встроенном языке 1С.

ДатаДокумента = Документ.Дата; // 15.03.2026 14:32:17

ДатаБезВремени = НачалоДня(ДатаДокумента); // 15.03.2026 00:00:00

Сегодня = НачалоДня(ТекущаяДата()); // сегодняшний день, 00:00:00

Типичный сценарий — проверка, что документ проведён сегодня. Сравнивать нужно именно начала дней, иначе условие никогда не выполнится:

Если НачалоДня(Документ.Дата) = НачалоДня(ТекущаяДата()) Тогда

// документ датирован сегодняшним днём

КонецЕсли;

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

Вывод даты без времени без изменения значения

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

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

Параметр ДЛФ=D задаёт локальный формат даты без времени. Вариант ДЛФ=DD выводит длинный формат с названием месяца: «15 марта 2026 г.». Есть и сокращённый вариант ДФ=dd.MM.yyyy с явным шаблоном, который не зависит от региональных настроек сеанса.

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

Сравнение вариантов

НачалоДня(Дата)

Меняет само значение, обнуляя время. Подходит для сравнений, отборов и вычислений. Не подходит для вывода — результат всё равно типа Дата.

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

Возвращает строку для отображения. Значение не меняется. Не подходит для сравнений и дальнейших вычислений с датами.

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

Работает на уровне СУБД внутри запроса. Оптимально для группировок и отборов по дням в больших выборках.

Дата без времени в запросах

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

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,

СУММА(Продажи.СуммаОборот) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

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

НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)

Для отбора документов за конкретный день не сравнивайте дату с одним значением — используйте диапазон от начала до конца дня через параметры:

ГДЕ

Документ.Дата МЕЖДУ &НачалоДня И &КонецДня

Параметры передаются из кода: Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ДатаОтбора)) и Запрос.УстановитьПараметр("КонецДня", КонецДня(ДатаОтбора)). Такой подход корректно работает с индексами и не заставляет СУБД вычислять функцию для каждой строки таблицы.

Проверка результата и типичные ошибки

Проверить, что время действительно обнулено, можно через ту же функцию Формат() с полным форматом или выводом значения в сообщение. Если после НачалоДня() в строке видно «00:00:00» — всё сработало.

Самая частая ошибка — сравнение Документ.Дата = ТекущаяДата() или с датой, введённой пользователем на форме. Пользователь вводит дату без времени (00:00:00), а документ записан со временем — условие не срабатывает, и логика молча не выполняется. Такие ошибки трудно ловить, потому что код не падает, а просто даёт неверный результат.

Вторая распространённая ошибка — хранение «даты без времени» в строковом реквизите ради удобства отображения. Это ломает сортировку, сравнение и отборы: строки «01.02.2026» и «15.01.2026» сравниваются посимвольно, а не как даты. Хранить нужно тип «Дата», а форматировать только при выводе.

Типичные ошибки
01
Сравнение дат напрямую без НачалоДня — условие не выполняется из-за разного времени, ошибка проявляется молча
02
Хранение даты в строковом реквизите — ломаются сортировка, отборы и сравнение периодов
03
Отбор в запросе через НАЧАЛОПЕРИОДА от поля таблицы — теряется индекс, запрос резко замедляется
04
Использование Формат() для последующих вычислений — строка нельзя сравнивать и складывать как дату
Контрольные точки

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

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

Время равно 00:00:00, тип остался «Дата»

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

Время отлично от нуля или значение стало строкой

Сравнение двух дат одного дня
Норма

НачалоДня(Дата1) = НачалоДня(Дата2) возвращает Истина

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

Равенство Ложь при одинаковом календарном дне

Отбор документов за день в запросе
Норма

Выбираются все документы дня независимо от времени

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

Документы с ненулевым временем выпадают из выборки

Дополнительные приёмы и смежные задачи

Иногда нужно не обнулить время, а получить составные части даты: функции Год(), Месяц() и День() возвращают числа. Для арифметики с датами используется сложение в секундах: НачалоДня(Дата) + 86400 — начало следующего дня, НачалоДня(Дата) - 86400 — начало предыдущего. Прибавление месяцев корректнее делать через ДобавитьМесяц(), чтобы не получить несуществующую дату вроде 31 февраля.

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

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

Порядок действий для отбора за один день
  1. 1
    Определите дату отбора — из параметра, реквизита или ТекущаяДата()
  2. 2
    Вычислите границы: НачалоДня(ДатаОтбора) и КонецДня(ДатаОтбора)
  3. 3
    Передайте обе границы в запрос через УстановитьПараметр
  4. 4
    Используйте условие Дата МЕЖДУ &НачалоДня И &КонецДня
  5. 5
    Проверьте на документах с ненулевым временем — все должны попасть в выборку

Ответы на частые вопросы

Можно ли объявить реквизит справочника только с датой, без времени?

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

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

НачалоДня() возвращает тот же день со временем 00:00:00, КонецДня() — со временем 23:59:59. Пара этих функций задаёт замкнутый диапазон одних суток и обычно используется вместе для отборов «за день включительно».

Почему сравнение даты документа с текущей датой не срабатывает?

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

Как получить дату без времени в запросе к виртуальной таблице?

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

Как вывести дату в печатной форме без времени?

При заполнении параметров макета передайте Формат(Дата, "ДЛФ=D") — в документ попадёт строка вида «15.03.2026». Для длинного формата с названием месяца используйте "ДЛФ=DD". Само значение даты при этом не изменяется.

Что вернёт НачалоДня() от пустой даты?

Пустая дата 01.01.0001 00:00:00 уже находится в начале суток, поэтому функция вернёт её без изменений. Перед обработкой дат из необязательных реквизитов полезно проверять значение на пустоту, чтобы не строить логику на дате 0001 года.

Итог

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

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