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

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

Как выразить значение как дату без времени в запросе 1С 8.3

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

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

Основной инструмент для этого — функция НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Она возвращает ту же дату, но со временем 00:00:00, что эквивалентно «дате без времени». Для формирования границ периода дополнительно используются КОНЕЦПЕРИОДА и конструктор ДАТАВРЕМЯ.

Ниже разобраны рабочие приёмы: обнуление времени, сравнение с днём, передача параметров из кода, вывод в выборку и типичные ошибки, из-за которых условия по датам «молча» не находят данные.

Почему в запросе 1С нельзя «отрезать» время напрямую

В платформе 1С:Предприятие 8.3 значение типа «Дата» физически хранится с точностью до секунды. В языке запросов отсутствует функция вида «ДАТА(Поле)», которая вернула бы значение без временной части — в отличие, например, от T-SQL с его типом date. Любая попытка привести значение к строке и обратно обречена на проблемы с производительностью и форматами.

Поэтому все приёмы сводятся к нормализации значения: приведению его к началу суток. Две даты с нулевым временем сравниваются корректно, группируются единообразно и одинаково отображаются. Это стандартная практика, которую используют и в типовых конфигурациях.

Как обнулить время через НАЧАЛОПЕРИОДА

Базовый приём выглядит так:

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК ДатаБезВремени

ИЗ

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

В поле ДатаБезВремени попадёт та же календарная дата, но с временем 00:00:00. Такое значение удобно для группировки по дням, соединения с таблицей, где даты уже нормализованы, и для единообразного вывода.

Если нужно сгруппировать документы по дням, применяйте ту же функцию в предложении СГРУППИРОВАТЬ ПО:

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Учтите: функция применяется к каждой строке, поэтому на больших таблицах в условиях отбора она мешает использованию индекса. В ВЫБРАТЬ и группировке это не критично, а вот в ГДЕ лучше нормализовать параметр, а не поле — об этом ниже.

Как сравнить поле с конкретным днём без потери данных

Самая частая практическая задача — выбрать документы за один день, когда у поля «Дата» время не нулевое. Сравнение Документ.Дата = &Дата сработает только если время совпало до секунды, что почти никогда не выполняется.

Правильный вариант — отбор по интервалу суток:

ВЫБРАТЬ

Реализация.Ссылка

ИЗ

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

ГДЕ

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

И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)

Здесь КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) возвращает 23:59:59 того же дня, поэтому попадают все документы суток. Функции применяются к параметру один раз, а не к каждой строке таблицы — индекс по полю «Дата» продолжает работать.

Сравнение через ВЫРАЗИТЬ — почему не подходит

Оператор ВЫРАЗИТЬ в языке запросов приводит значение к типу, но для даты он не убирает время: ВЫРАЗИТЬ(Поле КАК ДАТА) оставляет значение как есть, включая секунды. Этот оператор полезен для сужения составного типа (например, в полях с несколькими типами), но не для обнуления времени.

Как сформировать дату без времени конструктором ДАТАВРЕМЯ

Если день известен заранее и задан литералом, используйте функцию ДАТАВРЕМЯ(Год, Месяц, День) — без указания часов, минут и секунд она возвращает начало суток:

ВЫБРАТЬ

ДАТАВРЕМЯ(2026, 3, 15) КАК ДатаБезВремени

Результат — 15.03.2026 00:00:00. Полная форма ДАТАВРЕМЯ(2026, 3, 15, 23, 59, 59) позволяет явно задать конец дня, если КОНЕЦПЕРИОДА по какой-то причине неудобен.

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

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

Часто дату формируют не в запросе, а в модуле. Тогда нормализацию делают встроенной функцией НачалоДня():

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Реализация.Ссылка

|ИЗ

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

|ГДЕ

| Реализация.Дата МЕЖДУ &НачалоДня И &КонецДня";

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

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

Функции НачалоДня() и КонецДня() встроенного языка делают то же, что НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА в запросе: возвращают 00:00:00 и 23:59:59 соответственно. Такой подход даёт максимальный контроль и легко тестируется.

Как отобрать документы за один день
  1. 1
    Определите дату отбора — параметр или литерал
  2. 2
    Сформируйте границы: НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) и КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)
  3. 3
    Напишите условие Дата МЕЖДУ началом и концом дня
  4. 4
    Выполните запрос в консоли и проверьте, что попали документы с любым временем суток

Как вывести дату без времени в результате и СКД

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

В системе компоновки данных формат задаётся через оформление поля: в настройках поля укажите форматную строку ДЛФ=D (только дата). При этом само значение остаётся полным — время просто не отображается, что важно для последующих вычислений.

Не приводите дату к строке функцией ПОДСТРОКА или представлением ради «красивого» вывода: строковое значение теряет возможность сортировки по дате, сравнения и группировки по периодам. Форматирование — задача оформления, а не запроса.

Способы получить дату без времени

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

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

Параметры НачалоДня/КонецДня из кода

Лучший вариант для отборов: индекс работает, границы контролируются из модуля.

ДАТАВРЕМЯ(год, месяц, день)

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

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

Время не обнуляет — только сужает составной тип. Для задачи не подходит.

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

Первая ошибка — сравнение Дата = &Дата при ненулевом времени в данных. Внешне запрос «работает», но возвращает пустой результат, и причину ищут не там. Диагностика проста: выведите поле даты в консоли и посмотрите, есть ли время, отличное от 00:00:00.

Вторая ошибка — использование НАЧАЛОПЕРИОДА к полю в условии ГДЕ на больших таблицах. Запрос корректен, но медленен; перенесите нормализацию на параметр.

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

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

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

Время в выборке
Норма

Все значения имеют время 00:00:00

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

Часть строк с ненулевым временем — нормализация не применилась

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

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

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

Находятся только документы ровно в 00:00:00

Скорость запроса
Норма

Отбор по параметрам-границам, индекс используется

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

Функция применена к полю в ГДЕ, план показывает скан таблицы

FAQ

Можно ли в запросе 1С получить тип «только дата» без времени?

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

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

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

Почему условие Дата = &Дата не находит документы?

Потому что сравнение идёт с точностью до секунды: если у документа время 10:23:45, а в параметре 00:00:00, равенства нет. Замените условие на интервал МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ).

Работает ли ВЫРАЗИТЬ(Поле КАК ДАТА) для отсечения времени?

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

Как сгруппировать данные по дням, игнорируя время?

Укажите НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) и в списке выбираемых полей, и в предложении СГРУППИРОВАТЬ ПО. Все записи одного календарного дня попадут в одну группу независимо от времени.

Что лучше для отбора за период: МЕЖДУ или два условия через И?

Функционально они эквивалентны: Дата МЕЖДУ &Начало И &Конец то же самое, что Дата >= &Начало И Дата <= &Конец. Выбор — вопрос читаемости; на производительность и использование индекса форма записи не влияет.

Итог

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

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