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

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

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

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

В 1С значение типа «Дата» всегда хранит и дату, и время с точностью до секунды. Даже если в документе время не видно, внутри оно присутствует — чаще всего как 00:00:00. Из-за этого сравнение двух дат «напрямую» часто даёт неожиданный результат: 15.03.2026 00:00:00 и 15.03.2026 14:32:10 — разные значения, хотя календарный день один.

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

Ниже разобраны основные способы с примерами кода, условиями выбора и типичными ошибками. Материал применим к платформе 1С:Предприятие 8.3 вне зависимости от конкретной конфигурации.

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

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

Практическая проблема проявляется при сравнении. Если проверить условие Документ.Дата = ТекущаяДатаСеанса(), оно почти никогда не выполнится: текущая дата сеанса содержит время с точностью до секунды, а дата документа — своё собственное время. Корректная проверка выглядит так:

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

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

КонецЕсли;

Отсечение времени функциями НачалоДня и КонецДня

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

ДатаБезВремени = НачалоДня(ДатаСВременем);

// 15.03.2026 14:32:10 превратится в 15.03.2026 00:00:00

Функция КонецДня() полезна для построения диапазонов. Если нужно выбрать все документы за один календарный день, границы задают как НачалоДня(Дата) и КонецДня(Дата) — тогда в интервал попадут записи с любым временем внутри этого дня.

bsl
НачалоПериода = НачалоДня(ДатаОтбора);
КонецПериода = КонецДня(ДатаОтбора);

Обратите внимание: при записи результата в реквизит типа «Дата» с составом «Дата» (без времени) платформа сама отсекает время. Но в запросах и сравнениях явное приведение через НачалоДня() всё равно обязательно.

Получение даты и времени строкой через Формат()

Когда значение нужно показать пользователю, выгрузить в файл или передать во внешнюю систему, дату и время разделяют функцией Формат() с параметрами локального форматирования.

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

СтрокаВремени = Формат(ДатаСВременем, "ДЛФ=T"); // "14:32:10"

ДатаПрописью = Формат(ДатаСВременем, "ДЛФ=DD"); // "15 марта 2026 г."

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

СтрокаДаты = Формат(ДатаСВременем, "ДФ=yyyy-MM-dd"); // "2026-03-15"

СтрокаВремени = Формат(ДатаСВременем, "ДФ=HH:mm:ss"); // "14:32:10"

Отделение даты от времени в запросах

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Такой приём — стандартный способ сгруппировать обороты по дням, не создавая дополнительных измерений. Для отбора записей за конкретный день условие строят через диапазон:

ГДЕ

Таблица.Дата МЕЖДУ &НачалоДня И &КонецДня

Параметры &НачалоДня и &КонецДня вычисляют на встроенном языке через НачалоДня() и КонецДня() перед выполнением запроса.

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

НачалоДня() / КонецДня()

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

Формат()

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

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

Работает только внутри запроса. Используется для группировок и виртуальных таблиц, где код недоступен.

Как выбрать подходящий способ

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

Маршрут решения

Как выбрать действие

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

Отдельный случай — реквизиты с составом даты «Время». Такие хранят только время, а дата в них равна пустой (01.01.0001). Извлечь время из полной даты для записи в такой реквизит можно, вычтя начало дня и прибавив результат к пустой дате:

ВремяБезДаты = '00010101' + (ДатаСВременем - НачалоДня(ДатаСВременем));

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

После преобразования полезно убедиться, что результат имеет ожидаемый вид. Самый быстрый способ — вывести значение через Сообщить() или посмотреть в отладчике: дата без времени должна отображаться с 00:00:00.

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

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

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

Время равно 00:00:00, тип остался «Дата»

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

Время сохранилось — функция не применена к нужной переменной

Сравнение двух дат за один день
Норма

Условие выполняется для любого времени внутри дня

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

Сравнение ложное — вероятно, сравниваются исходные значения с временем

Строка из Формат()
Норма

Совпадает с ожидаемым шаблоном

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

Другой порядок дня и месяца — влияют региональные настройки, задайте явный шаблон ДФ

Типичные ошибки
01
{'titleless': '', '0': '', 'items': ''}
02
{'name': '', 'text': ''}
03
{'label': '', 'value': '', 'text': ''}
04
{'Ошибка': 'Сравнение дат напрямую без НачалоДня() — условие не срабатывает, хотя день совпадает'}
05
{'Ошибка': 'Использование строки из Формат() в сравнениях — строки сравниваются лексикографически, а не как даты'}
06
{'Ошибка': 'Отбор за день условием «равно НачалоДня» — записи со временем после полуночи не попадают в выборку'}
07
{'Ошибка': 'Ожидание, что запись в реквизит «только дата» обрежет время в языке запроса — в запросе приведение нужно делать явно'}

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

FAQ: частые вопросы

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

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

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

Для строкового представления используйте Формат(Дата, "ДЛФ=T"). Если нужен числовой результат в секундах от начала суток, вычтите из даты её начало дня: Дата - НачалоДня(Дата).

Почему сравнение «ДатаДокумента = ТекущаяДатаСеанса()» никогда не срабатывает?

Потому что сравниваются значения с точностью до секунды, и время у них разное. Приведите обе части к началу дня: НачалоДня(ДатаДокумента) = НачалоДня(ТекущаяДатаСеанса()).

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

Передайте в запрос два параметра — НачалоДня(Дата) и КонецДня(Дата), вычисленные на встроенном языке, и используйте условие «Дата МЕЖДУ &Начало И &Конец». Условие на равенство началу дня пропустит документы с ненулевым временем.

Чем ДЛФ отличается от ДФ в функции Формат()?

ДЛФ — локализованные форматы (D, T, DD и другие), результат зависит от региональных настроек сеанса. ДФ — явный шаблон вида "yyyy-MM-dd", который даёт одинаковый результат в любой среде и предпочтителен для обмена данными.

Обрезается ли время при записи в реквизит с составом даты «Дата»?

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

Итог

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

Тип «Дата» в 1С всегда содержит время. Для отсечения времени в логике используйте НачалоДня() и КонецДня(), для вывода — Формат() с ДЛФ или явным шаблоном ДФ, в запросах — НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА. Не сравнивайте даты напрямую без приведения и не используйте строки из Формат() в вычислениях.