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

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

Как обрезать время у даты в 1С

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

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

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

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

Как 1С хранит дату и почему время нельзя «удалить» физически

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

Из этого следует важное практическое правило: любые манипуляции сводятся не к удалению времени, а к его обнулению (приведению к началу дня) или к преобразованию значения в строку. Если вы сравниваете две даты оператором «=», сравниваются и время: 15.03.2026 10:30:00 не равна 15.03.2026 00:00:00, хотя календарный день один и тот же.

Способ 1. Функция НачалоДня() во встроенном языке

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

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

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

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

bsl
Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда
	// даты относятся к одному календарному дню
КонецЕсли;

Способ 2. Получить строку без времени через Формат()

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

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

Доступны и другие варианты: ДЛФ=DD — длинный формат («15 марта 2026 г.»), ДФ=dd.MM.yyyy — явный шаблон, удобный для выгрузок в фиксированном формате. Помните, что результат — строка: сравнивать её с датами и сортировать как дату уже нельзя без обратного преобразования.

Способ 3. Отсечь время в запросе

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Аналогично работают периоды НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, а также обратная функция КОНЕЦПЕРИОДА(). Для отбора документов за конкретный день передавайте в параметры запроса границы НачалоДня() и КонецДня(), вычисленные в коде, — это надёжнее, чем отсекать время у каждой строки в условии ГДЕ.

Отбор за один день

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаОтбора));

Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОтбора));

// В тексте запроса: ГДЕ Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Способ 4. Скрыть время в форме, отчёте и СКД

Часто время нужно не обрезать в данных, а просто не показывать. Для реквизита формы или колонки таблицы откройте свойство «Формат» и задайте строку ДЛФ=D или ДФ=dd.MM.yyyy. Значение в данных останется полным, но пользователь увидит только дату.

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

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

Сравнение способов

НачалоДня() в коде

Для сравнений, границ периодов и записи в реквизиты. Тип остаётся Дата.

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

Для вывода строки пользователю, в печать и имена файлов. Результат — строка.

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

Для группировок и вычисляемых полей в запросах и СКД.

Свойство Формат поля

Когда данные менять нельзя, а время нужно просто скрыть в интерфейсе.

Типичные ошибки и как их избежать

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

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

Третья ошибка — попытка «вычесть» время арифметикой: дата в 1С поддерживает сложение и вычитание секунд, но конструкции вида Дата - (Дата % 86400) не работают, операция остатка для дат не определена. Используйте штатные функции периодов.

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

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

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

В запросе удобно временно добавить в выборку исходное поле даты рядом с выражением НАЧАЛОПЕРИОДА и сравнить значения построчно в консоли запросов. Для проверки отбора за день убедитесь, что в выборку попали документы с временем 00:00:01 и 23:59:59 — значит, границы заданы верно.

Контрольные точки

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

Вывод значения после НачалоДня()
Норма

Время 0:00:00

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

Время сохранилось — применена не к той переменной

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

Попадают документы с 00:00:00 по 23:59:59

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

Теряются утренние или вечерние документы

Группировка в запросе по дням
Норма

Одна строка на каждый календарный день

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

Несколько строк внутри одного дня

Итог

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

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

Частые вопросы

Можно ли полностью удалить время из значения типа Дата?

Нет, тип Дата в 1С всегда содержит время. Можно либо обнулить его функцией НачалоДня(), либо преобразовать значение в строку через Формат(), либо настроить у реквизита в конфигураторе состав даты «Дата» без времени — тогда платформа будет хранить только календарную часть.

Чем НачалоДня() отличается от НАЧАЛОПЕРИОДА()?

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

Почему сравнение двух дат одного дня даёт «ложь»?

Потому что сравниваются значения целиком, включая время. 15.03.2026 09:00:00 не равна 15.03.2026 18:30:00. Приведите обе даты к началу дня перед сравнением: НачалоДня(Дата1) = НачалоДня(Дата2).

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

При заполнении параметров макета передайте Формат(ДатаДокумента, "ДЛФ=D") — в шаблон уйдёт строка вида «15.03.2026». Если нужен развёрнутый вид, используйте "ДЛФ=DD" — получится «15 марта 2026 г.».

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

Вычислите в коде границы НачалоДня(Дата) и КонецДня(Дата), передайте их параметрами и используйте условие Документ.Дата МЕЖДУ &Начало И &Конец. Такой отбор использует индекс по полю Дата и работает быстро даже на больших таблицах.

Что будет, если изменить состав даты реквизита на «Дата» в конфигураторе?

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