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

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

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

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

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

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

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

Как устроен тип «Дата» в 1С и почему время появляется всегда

Тип «Дата» в платформе 1С хранит календарную дату и время вместе. Когда вы пишете литерал вида '20260115', платформа интерпретирует его как 15 января 2026 года 0 часов 0 минут 0 секунд. Отдельного типа «только дата» без времени в языке нет — есть только значения, у которых время равно началу дня.

Это важно понимать при сравнениях. Условие ДатаДокумента = '20260115' будет истинным только для документов, проведённых ровно в полночь. Документ от 15 января 10:30:00 такому условию не удовлетворяет, хотя пользователь считает его «документом за 15 января». Поэтому корректные сравнения строят через диапазоны: начало дня и конец дня.

В реквизитах объектов состав даты задаётся в конфигураторе свойством «Состав даты»: «Дата», «Время» или «Дата и время». Если у реквизита выбран состав «Дата», платформа сама хранит время как 00:00:00. Но у документов стандартный реквизит «Дата» почти всегда содержит время, потому что оно участвует в позиционировании документа на оси времени.

Получение даты без времени во встроенном языке

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

ДатаДокумента = ДокументОбъект.Дата; // 15.01.2026 14:35:12

ТолькоДата = НачалоДня(ДатаДокумента); // 15.01.2026 0:00:00

Функция не изменяет исходное значение, а возвращает новое. Это безопасно: исходный реквизит документа остаётся нетронутым. Обратная функция — КонецДня() — возвращает 23:59:59 того же дня, и пара этих функций стандартно используется для отбора документов за один день.

Если нужна текущая дата без времени, комбинируйте ТекущаяДатаСеанса() с НачалоДня(). Используйте именно дату сеанса, а не ТекущаяДата() на сервере без необходимости: дата сеанса учитывает часовой пояс пользователя и корректнее работает в распределённых системах.

bsl
ТолькоДата = НачалоДня(ТекущаяДатаСеанса());
НачалоПериода = НачалоДня(ДатаДокумента);
КонецПериода = КонецДня(ДатаДокумента);

Форматирование даты для вывода без времени

Когда задача — показать пользователю дату без времени, а не изменить значение, правильнее использовать функцию Формат(). Она возвращает строку и не трогает исходные данные:

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

СтрокаДаты = Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"); // "15.01.2026"

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

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

НачалоДня или Формат

НачалоДня()

Возвращает значение типа Дата с нулевым временем. Подходит для сравнений, отборов, записи в реквизиты. Не подходит для вывода в произвольном формате.

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

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

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

Меняет только отображение на форме, данные не трогает. Подходит, когда обработки значения в коде нет вообще.

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

В языке запросов для отсечения времени используется функция НАЧАЛОПЕРИОДА с параметром ДЕНЬ:

ВЫБРАТЬ

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

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

ИЗ

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

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

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

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

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

ГДЕ

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

Параметры передаются из кода: Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ДатаОтбора)) и аналогично для конца дня. Альтернатива — условие НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = &Дата, но оно не использует индекс по полю «Дата» и на больших таблицах работает медленнее. Для отборов по периоду предпочтителен вариант с МЕЖДУ.

Дата без времени в СКД и отчётах

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

Второй уровень — формат поля в настройках СКД. На закладке «Наборы данных» у выбранного поля или в настройках отчёта на закладке «Пользовательские поля / Настройки» для поля можно задать параметр «Формат» со значением ДЛФ=D. Тогда время не отображается, хотя в данных остаётся. Этого достаточно, когда группировка уже корректна и нужно только убрать «0:00:00» из ячеек.

Третий уровень — вычисляемые поля. Если дата собирается из нескольких источников или требует обработки, добавьте вычисляемое поле с выражением на языке СКД. Учтите, что в выражениях СКД доступны не все функции встроенного языка; для сложной логики надёжнее подготовить значение в запросе набора данных.

Отображение даты без времени на форме

Для поля ввода на форме время убирается без программного кода — через свойство «Формат» или «Формат редактирования» элемента формы. Установите значение ДЛФ=D или ДФ=dd.MM.yyyy, и пользователь увидит только дату. Само значение в реквизите при этом не меняется.

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

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

Как убрать время у реквизита формы
  1. 1
    Откройте конфигуратор и найдите нужный реквизит объекта
  2. 2
    В палитре свойств установите «Состав даты» = «Дата»
  3. 3
    Обновите конфигурацию базы данных, согласившись на реструктуризацию
  4. 4
    Проверьте на копии базы, что существующие значения отображаются корректно
  5. 5
    Убедитесь, что в коде нет логики, зависящей от времени этого реквизита

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

Самая распространённая ошибка — сравнение дат после преобразования в строку. Выражение Формат(Дата1, "ДЛФ=D") = Формат(Дата2, "ДЛФ=D") работает, но медленнее и хрупче, чем НачалоДня(Дата1) = НачалоДня(Дата2): строковое сравнение зависит от формата и не использует типизированную логику дат.

Вторая ошибка — использование КонецДня с ручным указанием времени «23:59:59» через Дата(Год, Месяц, День, 23, 59, 59). Это допустимо, но функция КонецДня() читабельнее и не требует ручного контроля границ. Третья ошибка — ожидание, что НачалоДня изменит реквизит объекта: функция возвращает новое значение, его нужно явно присвоить.

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

Типичные ошибки
01
Сравнение дат через Формат() вместо НачалоДня() — лишние преобразования и риск несовпадения форматов
02
Условие Дата = &Дата в запросе без диапазона — документы за день, но не в полночь, не попадают в выборку
03
Ожидание, что НачалоДня() меняет исходную переменную — функция возвращает новое значение, его нужно присвоить
04
Изменение состава даты реквизита с данными без копии базы — время в существующих записях теряется безвозвратно
Контрольные точки

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

Значение в отладчике
Норма

Отображается как ДД.ММ.ГГГГ 0:00:00

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

В конце ненулевые часы, минуты или секунды

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

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

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

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

Отображение на форме
Норма

Поле показывает только дату, ввод времени недоступен

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

Поле по-прежнему показывает или требует время

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

Можно ли в 1С создать переменную типа «только дата» без времени?

Отдельного типа «дата без времени» в платформе нет. Используется тот же тип «Дата», у которого время равно 00:00:00. Получить такое значение можно через НачалоДня() или задав литерал без времени, например '20260115'. На уровне реквизитов объектов аналогичного эффекта добиваются свойством «Состав даты» = «Дата».

Чем отличается НачалоДня от КонецДня и когда что применять?

НачалоДня возвращает 00:00:00 указанной даты, КонецДня — 23:59:59. Для отбора данных за один день нужны обе границы: условие МЕЖДУ НачалоДня(Дата) И КонецДня(Дата). Если использовать только НачалоДня с равенством, документы, созданные после полуночи, в выборку не попадут.

Как убрать «0:00:00» в печатной форме или макете?

Если в макет значение подставляется из кода, используйте Формат(Дата, "ДЛФ=D") при заполнении параметра. Если параметр макета имеет тип Дата, можно задать формат прямо в свойствах параметра области макета — поле «Формат». Тогда код менять не потребуется.

Почему условие НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) = &Дата в запросе работает медленно?

Применение функции к полю таблицы мешает СУБД использовать индекс по этому полю — приходится вычислять функцию для каждой строки. На больших таблицах замените условие на Дата МЕЖДУ &НачалоДня И &КонецДня, передав границы параметрами: такой фильтр выполняется по индексу.

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

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

Что произойдёт с данными, если изменить состав даты реквизита с «Дата и время» на «Дата»?

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

Итог

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

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