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

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

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

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

В 1С тип «Дата» всегда хранит и дату, и время — пустой отдельного типа «только дата» в платформе нет. Поэтому задача «выразить дату и время как дату» на практике означает одно из двух: либо отбросить время (получить начало дня, то есть 00:00:00), либо изменить представление значения — в запросе, в коде, в СКД или при выводе в строку.

Способ решения зависит от контекста. В языке запросов используют функции НАЧАЛОПЕРИОДА или ВЫРАЗИТЬ, во встроенном языке — НачалоДня() или конструктор Дата(), в СКД — выражения ресурсов и параметры формата. Неправильный выбор приводит к типичным ошибкам: документы за последний день не попадают в отчёт, сравнение дат не срабатывает, а индексы перестают использоваться.

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

Что именно означает «выразить как дату» в 1С

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

На практике встречаются четыре разные задачи, которые часто путают:

  • отбросить время в запросе — для сравнения и группировки по дням;
  • отбросить время в коде — для сравнения значений или записи в реквизит;
  • вывести дату без времени в строку, печатную форму или поле отчёта;
  • привести составную дату (например, строку или число) к типу «Дата» через ВЫРАЗИТЬ.

Каждая задача решается своим инструментом, и смешивать их нельзя: например, форматирование в строку не подходит для сравнения дат, потому что строки сравниваются лексикографически, а не хронологически.

Приведение даты в запросе: ВЫРАЗИТЬ и НАЧАЛОПЕРИОДА

В языке запросов есть два основных инструмента. Функция ВЫРАЗИТЬ(Поле КАК ДАТА) приводит значение к типу «Дата» — она полезна, когда поле имеет составной тип (строка, число или «Дата») и нужно зафиксировать именно тип. Время при этом не обрезается: если в значении было 15:30:00, оно сохранится.

Для отсечения времени служит НАЧАЛОПЕРИОДА(Поле, ДЕНЬ). Функция возвращает начало дня, то есть ту же дату с временем 00:00:00. Именно её применяют для группировки по дням и сравнения «по дате без времени».

// Отбросить время и сгруппировать по дням

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Сравнение дат без учёта времени в условии ГДЕ

Частая задача — отобрать документы за конкретный день. Прямое сравнение Документ.Дата = &Дата сработает, только если параметр содержит то же время до секунды. Надёжнее два подхода: сравнение начала дня или интервал от начала до конца дня.

// Вариант 1: через НАЧАЛОПЕРИОДА

ГДЕ

НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = &НужнаяДата

// Вариант 2: через интервал (быстрее при наличии индекса)

ГДЕ

Документ.Дата МЕЖДУ &НачалоДня И &КонецДня

Вариант с интервалом предпочтительнее на больших таблицах: функция НАЧАЛОПЕРИОДА в условии ГДЕ применяется к каждой строке и не даёт СУБД использовать индекс по полю даты. Параметры интервала передают из кода: НачалоДня(Дата) и КонецДня(Дата).

Отбрасывание времени во встроенном языке

В коде модулей для получения даты без времени используют НачалоДня(). Функция возвращает значение типа «Дата» с временем 00:00:00, тип не меняется — меняется только время.

ДатаДокумента = Дата("20260315173045"); // 15.03.2026 17:30:45

ТолькоДата = НачалоДня(ДатаДокумента); // 15.03.2026 0:00:00

// Сравнение двух дат без учёта времени

Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда

// Один и тот же календарный день

КонецЕсли;

Родственные функции: КонецДня() возвращает 23:59:59, НачалоМесяца() и КонецМесяца() — границы месяца. Для сравнения «больше/меньше по дате» удобно сравнивать именно НачалоДня обеих величин, иначе 15.03.2026 10:00 окажется «больше», чем 15.03.2026 09:00, хотя календарный день один.

Создание даты из компонентов

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

НоваяДата = Дата(2026, 3, 15); // 15.03.2026 0:00:00
Как отобрать документы за один день
  1. 1
    В коде вычислите границы: НачалоПериода = НачалоДня(НужнаяДата) и КонецПериода = КонецДня(НужнаяДата)
  2. 2
    Передайте оба значения параметрами в запрос
  3. 3
    В условии ГДЕ используйте Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
  4. 4
    Выполните запрос и проверьте, что попали документы с любым временем внутри дня

Вывод даты без времени: форматирование

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

СтрокаДаты = Формат(ТекущаяДатаСеанса(), "ДЛФ=D");   // "15.03.2026"

СтрокаДаты = Формат(ТекущаяДатаСеанса(), "ДЛФ=DD"); // "15 марта 2026 г."

СтрокаДаты = Формат(ТекущаяДатаСеанса(), "ДФ=dd.MM.yyyy"); // "15.03.2026"

В формах и отчётах формат задают декларативно, без кода: в свойствах поля есть параметр «Формат», где указывают ту же форматную строку, например ДФ=dd.MM.yyyy. Это правильный способ для табличных частей и динамических списков — данные в базе остаются полными, а отображается только дата.

Приведение типа через ВЫРАЗИТЬ в запросе и СКД

Конструкция ВЫРАЗИТЬ(Поле КАК ДАТА) решает задачу приведения типа, а не отсечения времени. Она нужна, когда поле имеет составной тип — например, в реквизите хранится «Строка или Дата», и дальше по запросу требуется сравнение именно с датами или соединение с таблицей по дате.

ВЫБРАТЬ

ВЫРАЗИТЬ(Таблица.ЗначениеСвойства КАК ДАТА) КАК ДатаЗначения

ИЗ

РегистрСведений.ДополнительныеСведения КАК Таблица

ГДЕ

Таблица.Свойство = &СвойствоДата

В СКД та же функция применяется в выражении поля набора данных. Дополнительно в настройках поля на вкладке «Наборы данных» или в пользовательских настройках можно задать формат ДФ=dd.MM.yyyy, чтобы в отчёте время не отображалось. Если нужна группировка по дням — в выражении поля пишут НАЧАЛОПЕРИОДА(Период, ДЕНЬ), а не форматирование.

Ограничения ВЫРАЗИТЬ

ВЫРАЗИТЬ не выполняет преобразование значения из строки в дату по содержимому: если в строковом поле лежит текст «15.03.2026», приведение типа не распарсит его в дату — результат будет пустой датой. Для разбора строки используют код: функцию Дата() с компонентами или обработку через СтрРазделить и сборку.

Выбор способа по задаче

НАЧАЛОПЕРИОДА(Поле, ДЕНЬ)

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

МЕЖДУ НачалоДня И КонецДня

Отбор за конкретный день в запросе. Самый быстрый вариант, параметры вычисляются в коде.

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

Сравнение и присваивание дат в модулях. Тип сохраняется, время обнуляется.

Формат() с ДЛФ или ДФ

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

ВЫРАЗИТЬ(Поле КАК ДАТА)

Фиксация типа для составных полей в запросе и СКД. Время не отсекает, строку в дату не парсит.

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

Проверить, что время действительно отсечено, проще всего выводом значения: Сообщить(НачалоДня(Значение)) должно показать время 0:00:00. В запросе результат проверяют в консоли запросов — колонка с НАЧАЛОПЕРИОДА должна содержать одинаковое время 00:00:00 во всех строках одного дня.

Контрольный случай для отбора: создайте документ с временем 23:59:59 и документ с 00:00:01 нужного дня — оба должны попасть в выборку за этот день. Если попадает только один, условие построено неверно (чаще всего сравнение идёт с точным временем параметра).

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

Частные сценарии и ограничения

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

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

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

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

Значение после НачалоДня() или НАЧАЛОПЕРИОДА
Норма

Время равно 0:00:00

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

Время сохранилось — применена не та функция (например, только ВЫРАЗИТЬ)

Отбор документов за день
Норма

Попадают документы с 00:00:01 по 23:59:59

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

Попадают только документы с конкретным временем

Сортировка по дате после форматирования
Норма

Сортировка выполняется по исходному полю типа Дата

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

Сортировка идёт по строке — 01.02 раньше 15.01

FAQ

Чем ВЫРАЗИТЬ(Поле КАК ДАТА) отличается от НАЧАЛОПЕРИОДА(Поле, ДЕНЬ)?

ВЫРАЗИТЬ меняет тип значения на «Дата», но сохраняет время без изменений. НАЧАЛОПЕРИОДА с параметром ДЕНЬ возвращает ту же дату с обнулённым временем (00:00:00). Для отсечения времени нужна именно НАЧАЛОПЕРИОДА.

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

Сравните НачалоДня(Дата1) = НачалоДня(Дата2). Оба значения будут иметь время 00:00:00, поэтому равенство означает совпадение календарного дня независимо от исходного времени.

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

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

Можно ли хранить в реквизите только дату без времени?

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

Как вывести дату без времени в отчёте на СКД?

Два варианта: для группировки по дням в выражении поля набора данных напишите НАЧАЛОПЕРИОДА(Период, ДЕНЬ); для простого скрытия времени задайте в настройках поля формат ДФ=dd.MM.yyyy. Формат влияет только на отображение, группировку он не меняет.

Преобразует ли ВЫРАЗИТЬ строку «15.03.2026» в дату?

Нет. ВЫРАЗИТЬ приводит тип, но не разбирает содержимое строки — результатом будет пустая дата. Строку нужно разобрать в коде: извлечь год, месяц и день (например, через СтрРазделить) и собрать значение конструктором Дата(Год, Месяц, День).

Итог

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

Время отсекают функциями НАЧАЛОПЕРИОДА(..., ДЕНЬ) в запросе и НачалоДня() в коде; ВЫРАЗИТЬ меняет тип, но не время; Формат() даёт строку только для вывода. Для отбора за день на больших таблицах используйте интервал МЕЖДУ НачалоДня И КонецДня — он сохраняет работу индекса.