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