Разработка и Конфигурация · 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 того же дня, НачалоМесяца(), НачалоНедели(), НачалоКвартала() и НачалоГода() приводят дату к началу соответствующего периода. Пара НачалоДня() и КонецДня() — стандартный способ построить границы отбора за один день.
Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда
// даты относятся к одному календарному дню
КонецЕсли;Способ 2. Получить строку без времени через Формат()
Если дата нужна для вывода пользователю, в печатную форму, в имя файла или в текст сообщения — преобразуйте её в строку функцией Формат() с параметром ДЛФ=D (локальный формат даты без времени):
СтрокаДаты = Формат(ДатаДокумента, "ДЛФ=D"); // "15.03.2026"
Доступны и другие варианты: ДЛФ=DD — длинный формат («15 марта 2026 г.»), ДФ=dd.MM.yyyy — явный шаблон, удобный для выгрузок в фиксированном формате. Помните, что результат — строка: сравнивать её с датами и сортировать как дату уже нельзя без обратного преобразования.
Способ 3. Отсечь время в запросе
В языке запросов 1С функция НачалоДня() недоступна — вместо неё используется выражение НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Оно приводит дату к началу дня прямо на стороне СУБД, что важно для производительности при группировках и соединениях.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)
Аналогично работают периоды НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, а также обратная функция КОНЕЦПЕРИОДА(). Для отбора документов за конкретный день передавайте в параметры запроса границы НачалоДня() и КонецДня(), вычисленные в коде, — это надёжнее, чем отсекать время у каждой строки в условии ГДЕ.
Отбор за один день
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаОтбора));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОтбора));
// В тексте запроса: ГДЕ Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Способ 4. Скрыть время в форме, отчёте и СКД
Часто время нужно не обрезать в данных, а просто не показывать. Для реквизита формы или колонки таблицы откройте свойство «Формат» и задайте строку ДЛФ=D или ДФ=dd.MM.yyyy. Значение в данных останется полным, но пользователь увидит только дату.
В схеме компоновки данных формат задаётся на закладке «Наборы данных» для поля или в настройках отчёта через «Оформление» — параметр «Формат» с тем же значением ДЛФ=D. Если нужна группировка по дням, добавьте вычисляемое поле с выражением НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) и группируйте по нему.
Для реквизитов объектов есть и более радикальный вариант: в конфигураторе у реквизита типа «Дата» можно установить состав даты «Дата» (без времени). Тогда платформа сама будет хранить только дату. Но менять состав даты у существующих реквизитов с данными следует осторожно: время в уже записанных значениях будет потеряно.
Сравнение способов
Для сравнений, границ периодов и записи в реквизиты. Тип остаётся Дата.
Для вывода строки пользователю, в печать и имена файлов. Результат — строка.
Для группировок и вычисляемых полей в запросах и СКД.
Когда данные менять нельзя, а время нужно просто скрыть в интерфейсе.
Типичные ошибки и как их избежать
Самая распространённая ошибка — сравнение дат без приведения к началу дня. Документ создан сегодня в 09:15, а проверка Документ.Дата = ТекущаяДатаСеанса() почти никогда не сработает, потому что время различается. Правильно: НачалоДня(Документ.Дата) = НачалоДня(ТекущаяДатаСеанса()).
Вторая частая проблема — использование ТекущаяДата() вместо ТекущаяДатаСеанса() на сервере с учётом часовых поясов, из-за чего «сегодня» у пользователя и на сервере различаются, и обрезанная дата оказывается вчерашней. В клиент-серверном режиме всегда используйте дату сеанса.
Третья ошибка — попытка «вычесть» время арифметикой: дата в 1С поддерживает сложение и вычитание секунд, но конструкции вида Дата - (Дата % 86400) не работают, операция остатка для дат не определена. Используйте штатные функции периодов.
Как проверить результат
Быстрая проверка в коде — вывести значение в сообщение: Сообщить(НачалоДня(ДатаДокумента)). Результат должен заканчиваться на «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 г.».
Как получить в запросе все документы за конкретный день?
Вычислите в коде границы НачалоДня(Дата) и КонецДня(Дата), передайте их параметрами и используйте условие Документ.Дата МЕЖДУ &Начало И &Конец. Такой отбор использует индекс по полю Дата и работает быстро даже на больших таблицах.
Что будет, если изменить состав даты реквизита на «Дата» в конфигураторе?
Платформа перестанет хранить время для этого реквизита, и при обновлении конфигурации время в уже записанных значениях будет обнулено без возможности восстановления. Перед таким изменением убедитесь, что время в этом реквизите нигде не используется, и сделайте резервную копию базы.