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

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

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

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

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

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

Почему в 1С дата всегда содержит время

Тип «Дата» в платформе 1С хранит момент времени целиком: год, месяц, день, час, минуту и секунду. Даже если вы создаёте дату конструктором Дата(2026, 5, 15), внутри она равна 15.05.2026 0:00:00. Присвоить переменной «только календарный день» без времени невозможно на уровне типа данных.

Из-за этого возникают практические проблемы. Документ, проведённый в 14:32:07, не будет равен дате 15.05.2026 0:00:00 при сравнении оператором «=». Запрос с условием ГДЕ Дата = &Дата не найдёт документы, если в параметре не совпадает время. Группировка по полю «Дата» в отчёте разобьёт данные на отдельные строки для каждой секунды.

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

Способ 1. Функция НачалоДня() — основной вариант

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

ДатаДокумента = ДокументОбъект.Дата; // 15.05.2026 14:32:07

ДатаБезВремени = НачалоДня(ДатаДокумента); // 15.05.2026 0:00:00

Такой приём корректно работает в сравнениях. Например, проверка, что документ относится к сегодняшнему дню:

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

// документ проведён сегодня

КонецЕсли;

Обратите внимание на пару сопутствующих функций. КонецДня() возвращает дату с временем 23:59:59 — её используют для верхней границы периода. НачалоМесяца(), НачалоНедели(), НачалоКвартала() и НачалоГода() обнуляют не только время, но и «лишнюю» часть даты, что удобно при построении отборов по периодам.

1c
ДатаБезВремени = НачалоДня(ИсходнаяДата); // время обнуляется до 0:00:00, тип «Дата» сохраняется

Способ 2. Формат() — когда время нужно скрыть только при выводе

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

СтрокаДаты = Формат(ДокументОбъект.Дата, "ДЛФ=D"); // "15.05.2026"

СтрокаДатыДлинная = Формат(ДокументОбъект.Дата, "ДЛФ=DD"); // "15 мая 2026 г."

Результат — строка, а не дата. С ней нельзя выполнять сравнение по «больше/меньше» как с датой, нельзя прибавлять дни, сортировка будет лексикографической. Поэтому Формат() применяют только на финальном этапе — при заполнении макета, формировании текста сообщения или записи в файл обмена.

Для реквизитов формы есть более чистый путь: не преобразовывать значение в коде, а задать свойство «Формат» у элемента формы (или в свойствах реквизита объекта метаданных). Тогда в базе хранится полная дата со временем, а пользователь видит только день. Это предпочтительнее, потому что не разрушает данные.

Способ 3. Убрать время в запросе

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Такой запрос сгруппирует все движения внутри одного календарного дня в одну строку независимо от времени регистрации. Аналогично работают периодичности НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД.

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

ГДЕ

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

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

Типичные ошибки
01
Сравнение Дата = &Дата, где в параметре день без времени — документы за этот день, проведённые после 0:00:00, не попадут в выборку. Используйте МЕЖДУ НачалоДня() И КонецДня().
02
Группировка в запросе по полю Дата без НАЧАЛОПЕРИОДА — каждая секунда образует отдельную строку, отчёт «рассыпается».
03
Перезапись реквизита объекта значением Формат() — в базу попадает строка вместо даты, ломаются отборы и сортировка.
04
Вычитание времени арифметикой вроде Дата - (Дата % 86400) вместо НачалоДня() — нечитаемо и легко ошибиться в секундах.

Способ 4. Дата без времени в СКД и динамических списках

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

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

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

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

НачалоДня()

Основной вариант в коде: сохраняет тип «Дата», пригоден для сравнений и передачи в запросы. Не работает внутри текста запроса.

Формат(Дата, "ДЛФ=D")

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

НАЧАЛОПЕРИОДА(Дата, ДЕНЬ)

Для запросов и СКД: группировка по дням, вычисляемые поля. В условии ГДЕ хуже варианта с МЕЖДУ по производительности.

Свойство «Формат» элемента формы

Скрывает время только визуально, данные не трогает. Лучший выбор для журналов и форм документов.

Когда время нельзя убирать

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

Время критично и в документах, где важна последовательность проведения внутри дня: кассовые операции, складские перемещения, производственные задания. Если перезаписать даты таких документов началом дня, граница проведения сместится, а отчёты по остаткам на произвольный момент времени перестанут сходиться.

Безопасное правило: приводите дату к началу дня только в локальных переменных, параметрах запросов и вычисляемых полях отчётов. Не записывайте обнулённое значение обратно в реквизиты объектов, если конфигурация не спроектирована под «даты без времени».

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

После применения любого способа убедитесь, что результат соответствует ожиданиям. Быстрее всего это сделать в консоли кода (во внешних обработках-консолях) или через «Вычислить выражение» в отладчике: выведите значение и проверьте представление времени.

Сообщить(НачалоДня(ТекущаяДатаСеанса())); // ожидаем "... 0:00:00"

Для запросов проверяйте две вещи: количество строк в выборке (при группировке по дню их должно стать меньше или столько же) и корректность отбора (документы за граничные дни не должны «протекать» в результат). Для печатных форм — визуально: в макете не должно остаться фрагментов вида «0:00:00».

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

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

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

Время равно 0:00:00, тип значения — Дата

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

Осталось исходное время или тип стал Строка

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

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

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

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

Группировка в отчёте
Норма

Одна строка на календарный день

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

Несколько строк с одинаковой датой и разным временем

Печатная форма
Норма

Дата выведена без времени

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

Видны хвосты вида 0:00:00 или 23:59:59

Частые вопросы

Как получить дату без времени из строки вида «15.05.2026»?

Используйте конструктор Дата(2026, 5, 15) — время автоматически будет 0:00:00, то есть дата уже «без времени». Если строка приходит из внешнего источника, разберите её на год, месяц и день и передайте в конструктор; готовой функции «строка в дату» во встроенном языке нет.

НачалоДня() не работает в запросе — что делать?

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

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

Приведите обе к началу дня и сравнивайте: НачалоДня(Дата1) = НачалоДня(Дата2). Для проверки «в пределах одного дня» в запросе используйте условие МЕЖДУ началом и концом дня — так сохраняется использование индекса.

Можно ли хранить в реквизите только дату, чтобы время не вводилось вообще?

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

Чем отличается КонецДня() от НачалоДня() следующего дня?

КонецДня() возвращает 23:59:59 того же дня, а НачалоДня(Дата + 86400) — 0:00:00 следующего. Между ними есть одна секунда разницы. В условиях МЕЖДУ обычно используют КонецДня — так граница включительна и не захватывает начало следующих суток.

Почему в выгрузке в Excel дата отображается со временем 0:00:00?

Потому что выгружается полное значение типа «Дата», а Excel показывает время, если оно задано в формате ячейки. Перед выгрузкой преобразуйте значение через Формат(Дата, "ДЛФ=D") в строку или настройте формат ячеек в самом Excel.

Итог

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

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