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