Разработка и Конфигурация · 11 мин
Как убрать время в дате в 1С
Как убрать время из даты в 1С: функции НачалоДня и Дата в запросе, форматная строка ДЛФ=D, настройка реквизитов и отчётов. Примеры кода и типичные ошибки.
В 1С значение типа «Дата» всегда хранит и дату, и время с точностью до секунды. Часто время мешает: оно выводится в отчётах и печатных формах в виде «12.03.2026 14:35:07», ломает сравнения дат в запросах и создаёт лишние группировки в СКД. Убрать время можно несколькими способами — в зависимости от того, где именно нужен результат: в коде, в запросе, в отчёте или в самом хранилище данных.
Важно понимать разницу между двумя подходами. Первый — реально отсечь время от значения, то есть получить дату с нулевым временем (начало дня). Второй — оставить значение как есть, но отобразить только дату без времени через форматную строку. Выбор зависит от задачи: для сравнений и группировок нужно реальное отсечение, для вывода на экран достаточно форматирования.
Ниже разобраны рабочие способы для встроенного языка, языка запросов, СКД и пользовательских настроек, а также типичные ошибки, из-за которых время «возвращается» даже после, казалось бы, правильных действий.
Как устроен тип «Дата» в 1С и почему время появляется
Тип «Дата» в платформе 1С:Предприятие всегда содержит и календарную дату, и время суток. Отдельного типа «только дата» в платформе нет. Когда вы видите в документе «12.03.2026 0:00:00», это означает, что время равно полуночи, но оно физически присутствует в значении.
Время появляется в реквизитах по разным причинам. Документы по умолчанию получают дату с текущим временем сеанса. Реквизиты с составом даты «Дата и время» явно хранят время. При загрузке данных из внешних источников время часто приходит вместе с датой. Именно поэтому задача «убрать время» возникает так часто.
В конфигураторе у реквизита типа «Дата» есть свойство «Состав даты» с вариантами «Дата», «Время» и «Дата и время». Если у реквизита выбран состав «Дата», платформа сама обрезает время при записи. Это единственный способ заставить базу хранить чистую дату без дополнительного кода.
Как убрать время в коде на встроенном языке
Основной инструмент — функция НачалоДня(). Она принимает значение типа «Дата» и возвращает ту же дату, но с нулевым временем. Это стандартный способ отсечь время перед сравнением, записью в реквизит или передачей в запрос.
ДатаДокумента = НачалоДня(ТекущаяДатаСеанса());
// Результат: 12.03.2026 0:00:00
Рядом работают функции КонецДня() (23:59:59) и НачалоМесяца(), КонецМесяца() и другие календарные функции. Пара «НачалоДня + КонецДня» особенно полезна при формировании периодов отбора: если нужно выбрать документы за один день, корректный диапазон — от начала дня до конца дня, а не просто равенство дате.
Если нужно только вывести дату без времени в сообщение, журнал или строковое поле, используйте функцию Формат() с форматной строкой:
СтрокаДаты = Формат(ДатаДокумента, "ДЛФ=D");
// Результат: 12.03.2026
Параметр ДЛФ=D означает «локальный формат даты» без времени. Вариант ДЛФ=DT выводит дату и время, ДЛФ=T — только время. Помните: Формат() возвращает строку, а не дату. Использовать результат для сравнений и арифметики дат нельзя.
ДатаБезВремени = НачалоДня(ТекущаяДатаСеанса());
СтрокаДляВывода = Формат(ДатаБезВремени, "ДЛФ=D");Как отсечь время в запросе
В языке запросов 1С для отсечения времени используется функция НАЧАЛОПЕРИОДА(<Дата>, ДЕНЬ). Она возвращает начало дня для указанной даты и работает как в выборке полей, так и в условиях и группировках.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,
СУММА(Продажи.Сумма) КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)
Такой приём решает типичную проблему: если группировать по полю «Период» напрямую, каждый документ с уникальным временем попадёт в отдельную группу, и итоги по дням развалятся на множество строк. Группировка по НАЧАЛОПЕРИОДА(..., ДЕНЬ) объединяет все записи одного календарного дня.
Для сравнения дат без учёта времени есть два подхода. Первый — привести обе стороны к началу дня: ГДЕ НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = &ДатаБезВремени. Второй, обычно более быстрый, — передать в запрос диапазон: ГДЕ Документ.Дата МЕЖДУ &НачалоДня И &КонецДня, где параметры вычислены в коде через НачалоДня() и КонецДня(). Диапазонное условие позволяет использовать индекс по дате, а оборачивание поля в функцию индекс, как правило, отключает.
Как убрать время в отчётах и СКД
В отчётах на системе компоновки данных время убирается настройкой формата поля, без изменения запроса. Откройте схему компоновки, перейдите на закладку «Наборы данных», выделите нужное поле даты и в его свойствах найдите параметр «Формат». Укажите форматную строку ДЛФ=D — поле будет отображаться только как дата.
Тот же приём доступен пользователю в режиме предприятия, если отчёт это позволяет: в настройках отчёта откройте расширенные настройки поля и задайте формат. Это удобно, когда править конфигурацию нельзя или не хочется.
Если время ломает группировки в отчёте, одного формата недостаточно — формат меняет только отображение, а группировка строится по реальному значению. В этом случае в запросе набора данных примените НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) либо используйте вычисляемое поле с выражением отсечения времени.
В динамических списках и журналах документов колонка «Дата» по умолчанию показывает дату и время. Если список построен на произвольном запросе, добавьте в запрос поле с началом дня и выведите его вместо стандартной даты. Для стандартных журналов без изменения конфигурации скрыть время обычно нельзя.
Настройка реквизитов: состав даты и формат полей формы
Если время не нужно в принципе, правильное решение — на уровне метаданных. В конфигураторе откройте свойства реквизита типа «Дата» и установите «Состав даты» = «Дата». После обновления конфигурации платформа будет автоматически обрезать время при записи, и в базе останутся чистые даты.
У этого решения есть ограничения. Изменение состава даты не перезаписывает существующие данные: время в уже сохранённых объектах останется до их перезаписи. Для документов состав даты менять нельзя — дата документа всегда содержит время, потому что оно участвует в определении позиции документа на временной оси. Для регистров сведений с периодичностью «в пределах дня» аналогичное ограничение снимается выбором периодичности «в пределах дня» или «непериодический».
Для полей формы можно задать формат отображения без изменения данных: в свойствах поля ввода найдите «Формат» или «ФорматРедактирования» и укажите ДЛФ=D. Пользователь увидит только дату, хотя в реквизите время сохранится.
Сравнение вариантов
Реально отсекает время. Подходит для сравнений, группировок, записи в реквизиты. Требует изменения кода или запроса.
Меняет только отображение, значение не трогает. Подходит для печатных форм, отчётов, полей формы. Не решает проблемы сравнений и группировок.
Решение на уровне хранения: время не сохраняется вообще. Не применимо к датам документов и не меняет уже записанные данные.
Типичные ошибки и как их проверить
Самая частая ошибка — сравнение дат «в лоб»: Если Документ.Дата = ТекущаяДатаСеанса() Тогда .... Такое условие почти никогда не выполняется, потому что время различается до секунд. Сравнивайте начала дней или используйте диапазон.
Вторая ошибка — использовать Формат() и затем сравнивать или сортировать результат как дату. Строка «01.02.2026» при строковой сортировке окажется раньше «02.01.2026», что даёт неверный порядок. Форматируйте только на последнем этапе, при выводе.
Третья ошибка — обрезать время строковыми функциями (Лев(Строка(Дата), 10)). Результат зависит от региональных настроек и формата представления даты, такой код непереносим и хрупок. Всегда используйте специализированные функции работы с датами.
Как проверить результат
Время равно 0:00:00 (начало дня)
Осталось исходное время или значение стало строкой
Даты одного календарного дня распознаются как равные
Условие не срабатывает для дат внутри одного дня
Одна строка на каждый календарный день
Несколько строк на один день с разным временем
Выводится только дата, например 12.03.2026
Рядом с датой по-прежнему выводится время
Проверка результата и безопасные границы
После применения любого способа проверьте результат на контрольном примере. Возьмите документ с известным временем, убедитесь, что в выборке дата стала с нулевым временем, а итоги по дню сгруппированы корректно. Для запросов удобно временно вывести исходное и обработанное значение рядом.
Изменения в коде и запросах безопасны: они не трогают данные в базе. Осторожность нужна при смене состава даты реквизита и при массовой перезаписи объектов для очистки времени — такие операции выполняйте на копии базы и с резервной копией. Массовая перезапись документов может затронуть связанные движения и обмены данными.
Если время появляется из обмена или загрузки из файла, исправлять лучше на этапе загрузки: применяйте НачалоДня() при присвоении даты в обработчике. Это дешевле, чем потом чистить уже записанные данные.
Что важно запомнить
Для отсечения времени в значении используйте НачалоДня() в коде и НАЧАЛОПЕРИОДА(..., ДЕНЬ) в запросе. Для отображения без времени — формат ДЛФ=D. Для хранения чистых дат — состав даты «Дата» в метаданных. Сравнивайте даты через начало и конец дня, а не через равенство.
Частые вопросы
Можно ли в 1С создать переменную, которая хранит только дату без времени?
Отдельного типа «только дата» в платформе нет: значение типа «Дата» всегда содержит время. Практический аналог — хранить дату, приведённую к началу дня через НачалоДня(), либо использовать реквизит с составом даты «Дата».
Почему в запросе условие «Дата = &Дата» не находит документы?
Потому что сравнение идёт с точностью до секунды, а время документа почти всегда отличается от времени параметра. Передайте в запрос границы дня (НачалоДня и КонецДня) и используйте условие МЕЖДУ — оно корректно и использует индекс.
Как убрать время в печатной форме, если дата выводится из макета?
В модуле, где формируется печатная форма, выводите в параметр макета не само значение даты, а Формат(Дата, "ДЛФ=D"). Если дата подставляется в макет как значение типа «Дата», задайте формат в свойствах параметра области макета.
Изменится ли время в уже записанных документах, если поменять состав даты реквизита?
Нет. Состав даты влияет только на новые записи и перезаписываемые объекты. Существующие данные сохранят время до их перезаписи. Кроме того, для даты документа состав даты изменить нельзя в принципе.
Как убрать время в динамическом списке без изменения конфигурации?
Если список использует произвольный запрос, добавьте в запрос поле НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) и выведите его вместо исходной даты. Для стандартного списка без доступа к запросу пользовательскими настройками скрыть время обычно нельзя.
Чем отличаются ДЛФ=D и ДФ=dd.MM.yyyy в функции Формат()?
ДЛФ=D использует региональные настройки и выводит дату в привычном пользователю виде, а ДФ=dd.MM.yyyy задаёт жёсткий шаблон. Для интерфейсов предпочтителен ДЛФ=D, фиксированный шаблон уместен при обмене данными, где важен стабильный формат строки.