Разработка и Конфигурация · 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 — её используют для верхней границы периода. НачалоМесяца(), НачалоНедели(), НачалоКвартала() и НачалоГода() обнуляют не только время, но и «лишнюю» часть даты, что удобно при построении отборов по периодам.
ДатаБезВремени = НачалоДня(ИсходнаяДата); // время обнуляется до 0:00:00, тип «Дата» сохраняетсяСпособ 2. Формат() — когда время нужно скрыть только при выводе
Если дата нужна не для сравнения, а для показа пользователю, печати или выгрузки в файл, время убирают функцией Формат() с форматной строкой:
СтрокаДаты = Формат(ДокументОбъект.Дата, "ДЛФ=D"); // "15.05.2026"
СтрокаДатыДлинная = Формат(ДокументОбъект.Дата, "ДЛФ=DD"); // "15 мая 2026 г."
Результат — строка, а не дата. С ней нельзя выполнять сравнение по «больше/меньше» как с датой, нельзя прибавлять дни, сортировка будет лексикографической. Поэтому Формат() применяют только на финальном этапе — при заполнении макета, формировании текста сообщения или записи в файл обмена.
Для реквизитов формы есть более чистый путь: не преобразовывать значение в коде, а задать свойство «Формат» у элемента формы (или в свойствах реквизита объекта метаданных). Тогда в базе хранится полная дата со временем, а пользователь видит только день. Это предпочтительнее, потому что не разрушает данные.
Способ 3. Убрать время в запросе
В языке запросов 1С нет функции НачалоДня, но есть более общая — НАЧАЛОПЕРИОДА. Для обнуления времени её вызывают с периодичностью ДЕНЬ:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,
СУММА(Продажи.Сумма) КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)
Такой запрос сгруппирует все движения внутри одного календарного дня в одну строку независимо от времени регистрации. Аналогично работают периодичности НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД.
Для отбора документов за конкретный день не сравнивайте дату напрямую — используйте диапазон или приведение:
ГДЕ
РеализацияТоваров.Дата МЕЖДУ &НачалоДня И &КонецДня
Параметры при этом передают уже подготовленными: НачалоДня(ДатаОтбора) и КонецДня(ДатаОтбора). Альтернатива — условие НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) = &День, но оно не использует индекс по полю «Дата» и на больших таблицах работает заметно медленнее. Предпочитайте вариант с МЕЖДУ.
Способ 4. Дата без времени в СКД и динамических списках
В схеме компоновки данных работают те же функции языка запросов: в вычисляемом поле или в группировке укажите НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Дополнительно в СКД у поля типа «Дата» можно настроить формат отображения на закладке «Наборы данных» или через условное оформление — тогда время просто не выводится, хотя в данных остаётся.
В динамических списках (журналах документов) время в колонке «Дата» убирается через свойство «Формат» колонки таблицы формы: достаточно указать ДЛФ=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С любая дата содержит время, и «убрать» его можно двумя путями: обнулить через НачалоДня() (в запросах — НАЧАЛОПЕРИОДА с периодичностью ДЕНЬ) или преобразовать в строку через Формат(). Для сравнений и отборов используйте первый путь, для вывода — второй, а данные в базе без крайней необходимости не изменяйте.