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

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

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

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

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

Чаще всего проблема возникает при сравнении дат: документ проведён 15.03.2026 в 14:32:17, и сравнение с «чистой» датой 15.03.2026 0:00:00 даёт ложный результат. Ещё одна типичная ситуация — отбор в запросе, когда нужно выбрать все документы за день независимо от времени проведения.

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

Функция НачалоДня — основной способ в коде

Функция НачалоДня возвращает ту же дату, но с временем 0:00:00. Это стандартный и безопасный приём, когда нужно сравнить две даты по календарному дню или записать в реквизит значение без времени.

ДатаДокумента = ДокументОбъект.Дата;

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

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

Сообщить("Документ проведён сегодня");

КонецЕсли;

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

НачалоДня(МояДата); // ошибка: результат потерян, МояДата не изменилась

МояДата = НачалоДня(МояДата); // правильно

Для получения конца дня (23:59:59) существует парная функция КонецДня. Она незаменима при построении интервалов «за день»: условие Дата МЕЖДУ НачалоДня(&Дата) И КонецДня(&Дата) захватывает все документы суток.

Дата без времени в запросе: НАЧАЛОПЕРИОДА

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

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК ДеньДокумента,

СУММА(Реализация.СуммаДокумента) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) = &ДатаОтбора

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

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ)

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

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

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

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

Для группировки по дням в отчётах НАЧАЛОПЕРИОДА остаётся правильным инструментом: она позволяет свернуть все документы суток в одну строку результата.

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

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

Подходит для сравнений и присваиваний в алгоритмах. Ограничение — работает только вне запроса.

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

Нужна для группировок по дням и отборов. В условии ГДЕ на больших таблицах уступает по скорости сравнению с диапазоном.

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

Только меняет отображение, значение остаётся с временем. Не подходит для сравнений и записи в базу.

Состав даты «Дата» у реквизита

Решает задачу на уровне структуры: время не хранится вообще. Требует изменения конфигурации.

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

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

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

Сообщить("Документ от " + Формат(ДокументОбъект.Дата, "ДЛФ=D"));

Вариант ДЛФ=DD выводит длинный формат вида «15 марта 2026 г.». Важно понимать ограничение: Формат возвращает строку, а не дату. Сравнивать такие строки оператором «=» нельзя — строковое сравнение дат в формате ДД.ММ.ГГГГ не совпадает с хронологическим порядком.

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

Типичные ошибки
01
Сравнение дат без НачалоДня: документ 15.03.2026 14:32 не равен дате 15.03.2026 0:00, условие ложно срабатывает как неравенство.
02
Использование Формат для сравнения: строки дат сравниваются лексикографически, а не по хронологии.
03
Вызов НачалоДня(Дата) без присваивания результата — значение переменной не меняется.
04
Отбор в запросе через НАЧАЛОПЕРИОДА в условии ГДЕ на больших таблицах вместо передачи диапазона параметрами — лишняя нагрузка.
05
Попытка обрезать дату вычитанием секунд или арифметикой со строками — хрупкое решение, ломающееся при смене настроек.

Реквизит с составом даты «Дата»

Если поле по смыслу никогда не должно хранить время — дата рождения, дата договора, дата плановой отгрузки — правильнее настроить это в конфигураторе. В свойствах реквизита у типа «Дата» есть параметр «Состав даты» с вариантами: Дата, Время, Дата и время.

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

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

Текущая дата без времени и дата сеанса

Для получения «сегодня» без времени комбинируйте ТекущаяДатаСеанса с НачалоДня:

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

Предпочитайте ТекущаяДатаСеанса устаревшей паре ТекущаяДата() / РабочаяДата. ТекущаяДатаСеанса учитывает часовой пояс сеанса и корректно работает в клиент-серверном режиме, тогда как ТекущаяДата на сервере и на клиенте может дать разные значения в распределённой системе.

Если нужна произвольная дата без времени из составляющих, используйте конструктор Дата(Год, Месяц, День) — время по умолчанию будет 0:00:00:

ДатаНачала = Дата(2026, 3, 15); // 15.03.2026 0:00:00
Порядок действий при сравнении дат по дню
  1. 1
    Определите, где выполняется сравнение: в коде, в запросе или в условии отбора.
  2. 2
    В коде оберните обе даты в НачалоДня и сравнивайте результаты.
  3. 3
    В запросе либо примените НАЧАЛОПЕРИОДА к полю, либо передайте границы дня параметрами НачалоДня/КонецДня.
  4. 4
    Проверьте результат на документе, проведённом не в полночь — например, в 14:30.
  5. 5
    Если дата выводится пользователю, убедитесь, что отображение задано форматом ДЛФ=D, а значение осталось типа Дата.

Проверка результата и граничные случаи

Проверить, что время действительно отсечено, проще всего выводом значения в полном формате:

Сообщить(Формат(НачалоДня(МояДата), "ДЛФ=DT")); // должно быть 0:00:00

Учитывайте пустую дату: значение '00010101' (1 января 1 года) считается пустым. НачалоДня от пустой даты вернёт ту же пустую дату, и сравнение с реальной датой даст «ложь». Если реквизит может быть незаполнен, добавляйте проверку ЗначениеЗаполнено до сравнения.

Отдельный нюанс — границы периодов в запросах по регистрам. Виртуальные таблицы остатков принимают параметр периода, и если передать туда НачалоДня, остатки будут рассчитаны на начало дня, а не на конец. Для остатков «на конец дня» используйте КонецДня или объект Граница с видом «Включая».

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

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

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

Формат с ДЛФ=DT показывает время 0:00:00

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

Время отлично от полуночи — функция не применена или результат не присвоен

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

Равенство истинно при любом времени исходных дат

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

Документ в 14:30 не равен дате дня — сравниваются значения с временем

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

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

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

Выпадают документы с ненулевым временем — условие сравнивает с точной датой

Вывод пользователю
Норма

Показывается только дата, тип значения остался Дата

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

Значение превращено в строку и дальше участвует в сравнениях

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

Можно ли полностью избавиться от времени в типе «Дата»?

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

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

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

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

Используйте условие НачалоДня(Документ.Дата) = НачалоДня(ТекущаяДатаСеанса()). Прямое сравнение Дата = ТекущаяДатаСеанса() почти всегда ложно, потому что значения различаются на уровне секунд.

Почему отбор за день в запросе не находит документы?

Скорее всего, параметр отбора содержит время 0:00:00, а условие проверяет равенство с полем Дата, где хранится время проведения. Замените условие на диапазон: Дата МЕЖДУ НачалоДня(&Дата) И КонецДня(&Дата), либо сравнивайте НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) с параметром.

Как получить конец дня для интервала?

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

Что делать, если дата хранится как строка?

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

Итог

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

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