Разработка и Конфигурация · 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"); // "15.03.2026"
Сообщить("Документ от " + Формат(ДокументОбъект.Дата, "ДЛФ=D"));
Вариант ДЛФ=DD выводит длинный формат вида «15 марта 2026 г.». Важно понимать ограничение: Формат возвращает строку, а не дату. Сравнивать такие строки оператором «=» нельзя — строковое сравнение дат в формате ДД.ММ.ГГГГ не совпадает с хронологическим порядком.
В табличных документах и СКД формат задаётся декларативно: у ячейки или поля компоновки есть свойство «Формат», куда вписывается та же строка ДЛФ=D. Тогда преобразование выполняется при выводе, а исходные данные остаются полноценными датами.
Реквизит с составом даты «Дата»
Если поле по смыслу никогда не должно хранить время — дата рождения, дата договора, дата плановой отгрузки — правильнее настроить это в конфигураторе. В свойствах реквизита у типа «Дата» есть параметр «Состав даты» с вариантами: Дата, Время, Дата и время.
Установите значение «Дата» — и платформа сама будет хранить и возвращать только календарную часть. Пользователь в поле ввода не увидит время, а в запросе и коде реквизит придёт уже без времени, без дополнительных преобразований.
Менять состав даты у существующего реквизита, в котором уже есть данные со временем, следует осторожно. При реструктуризации время у накопленных значений будет отброшено. Если это время где-то используется в логике — например, для сортировки документов внутри дня, — поведение системы изменится. Перед таким изменением сделайте резервную копию информационной базы и проверьте все места использования реквизита через поиск ссылок в конфигураторе.
Текущая дата без времени и дата сеанса
Для получения «сегодня» без времени комбинируйте ТекущаяДатаСеанса с НачалоДня:
Сегодня = НачалоДня(ТекущаяДатаСеанса()); // сегодня, 0:00:00
Предпочитайте ТекущаяДатаСеанса устаревшей паре ТекущаяДата() / РабочаяДата. ТекущаяДатаСеанса учитывает часовой пояс сеанса и корректно работает в клиент-серверном режиме, тогда как ТекущаяДата на сервере и на клиенте может дать разные значения в распределённой системе.
Если нужна произвольная дата без времени из составляющих, используйте конструктор Дата(Год, Месяц, День) — время по умолчанию будет 0:00:00:
ДатаНачала = Дата(2026, 3, 15); // 15.03.2026 0:00:00
- 1Определите, где выполняется сравнение: в коде, в запросе или в условии отбора.
- 2В коде оберните обе даты в НачалоДня и сравнивайте результаты.
- 3В запросе либо примените НАЧАЛОПЕРИОДА к полю, либо передайте границы дня параметрами НачалоДня/КонецДня.
- 4Проверьте результат на документе, проведённом не в полночь — например, в 14:30.
- 5Если дата выводится пользователю, убедитесь, что отображение задано форматом ДЛФ=D, а значение осталось типа Дата.
Проверка результата и граничные случаи
Проверить, что время действительно отсечено, проще всего выводом значения в полном формате:
Сообщить(Формат(НачалоДня(МояДата), "ДЛФ=DT")); // должно быть 0:00:00
Учитывайте пустую дату: значение '00010101' (1 января 1 года) считается пустым. НачалоДня от пустой даты вернёт ту же пустую дату, и сравнение с реальной датой даст «ложь». Если реквизит может быть незаполнен, добавляйте проверку ЗначениеЗаполнено до сравнения.
Отдельный нюанс — границы периодов в запросах по регистрам. Виртуальные таблицы остатков принимают параметр периода, и если передать туда НачалоДня, остатки будут рассчитаны на начало дня, а не на конец. Для остатков «на конец дня» используйте КонецДня или объект Граница с видом «Включая».
Как проверить результат
Формат с ДЛФ=DT показывает время 0:00:00
Время отлично от полуночи — функция не применена или результат не присвоен
Равенство истинно при любом времени исходных дат
Документ в 14:30 не равен дате дня — сравниваются значения с временем
Выбраны все документы суток, включая утренние и вечерние
Выпадают документы с ненулевым временем — условие сравнивает с точной датой
Показывается только дата, тип значения остался Дата
Значение превращено в строку и дальше участвует в сравнениях
Частые вопросы
Можно ли полностью избавиться от времени в типе «Дата»?
Нет, тип «Дата» в 1С всегда включает время с точностью до секунды. Можно либо обнулять время функцией НачалоДня, либо настроить у реквизита состав даты «Дата» — тогда время не хранится и не отображается, но физически тип остаётся прежним.
Чем НачалоДня отличается от НАЧАЛОПЕРИОДА?
НачалоДня — функция встроенного языка, применяется в коде к переменным. НАЧАЛОПЕРИОДА — функция языка запросов, работает с полями таблиц внутри запроса. По смыслу НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) эквивалентна НачалоДня, но одну нельзя подставить вместо другой.
Как сравнить дату документа с сегодняшним днём?
Используйте условие НачалоДня(Документ.Дата) = НачалоДня(ТекущаяДатаСеанса()). Прямое сравнение Дата = ТекущаяДатаСеанса() почти всегда ложно, потому что значения различаются на уровне секунд.
Почему отбор за день в запросе не находит документы?
Скорее всего, параметр отбора содержит время 0:00:00, а условие проверяет равенство с полем Дата, где хранится время проведения. Замените условие на диапазон: Дата МЕЖДУ НачалоДня(&Дата) И КонецДня(&Дата), либо сравнивайте НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) с параметром.
Как получить конец дня для интервала?
Функцией КонецДня(Дата) — она возвращает 23:59:59 указанного дня. Пара НачалоДня и КонецДня — стандартный способ задать границы суток в запросах и отборах динамических списков.
Что делать, если дата хранится как строка?
Сначала преобразуйте строку в дату через Дата() с числовыми аргументами, разобрав строку функциями работы со строками, или через стандартные механизмы обмена. Затем применяйте НачалоДня. Сравнивать и обрезать даты как строки ненадёжно: формат зависит от региональных настроек.
Что важно запомнить
В коде время отсекает НачалоДня, в запросе — НАЧАЛОПЕРИОДА с параметром ДЕНЬ, при выводе — Формат с ДЛФ=D. Для сравнений дат по дню всегда приводите обе стороны к началу дня, а для отборов за сутки используйте диапазон НачалоДня–КонецДня. Если время не нужно в принципе, задайте реквизиту состав даты «Дата» в конфигураторе.