Разработка и Конфигурация · 9 мин
Как выразить значение как дату и время в 1С
Как выразить значение как датавремя в 1С: функция ДатаВремя в запросах, ВЫРАЗИТЬ, преобразование строки в дату, типы Дата и ДатаВремя, типичные ошибки.
В языке запросов 1С и во встроенном языке платформы типы «Дата» и «Строка» несовместимы напрямую: сравнить строковое поле с параметром типа «Дата» или выполнить арифметику дат над строкой нельзя. Поэтому задача «выразить как датавремя» возникает постоянно — при написании запросов, при загрузке данных из файлов, при работе с реквизитами составного типа.
В зависимости от контекста используются разные инструменты: конструкция ВЫРАЗИТЬ(Поле КАК ДАТА) в запросе, литерал ДАТАВРЕМЯ(2026, 1, 15, 12, 0, 0), функция Дата() во встроенном языке или шаблонное преобразование строки. Выбор зависит от того, где находятся исходные данные — в реквизите объекта, в строке из файла или в параметре запроса.
Важно понимать: в 1С нет отдельных типов «дата» и «время» — есть единый тип «Дата», который всегда содержит и календарную дату, и время с точностью до секунды. Поэтому «выразить как датавремя» фактически означает «привести значение к типу Дата», а вопрос отсечения времени решается отдельными функциями.
Тип «Дата» в 1С: что именно вы выражаете
Тип «Дата» в платформе 1С хранит календарную дату и время одновременно. Диапазон допустимых значений — с 01.01.0001 00:00:00 по 31.12.3999 23:59:59. Пустая дата (значение по умолчанию) — это '00010101000000', то есть 01.01.0001 0:00:00, и именно с ней часто сравнивают поля при проверке заполненности.
Из-за того что время хранится всегда, типичная ошибка — сравнение даты документа с «датой без времени». Условие Документ.Дата = &Дата не сработает, если у документа время 10:30:15, а в параметре передано начало дня. Для таких сравнений используют либо диапазон «от начала до конца дня», либо функцию НАЧАЛОПЕРИОДА в запросе.
Как выразить поле как дату в запросе через ВЫРАЗИТЬ
Основной сценарий — реквизит составного типа или строковое поле, которое нужно интерпретировать как дату. Конструкция выглядит так:
ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.ПолеСтрока КАК ДАТА) КАК ДатаДокумента
ИЗ
РегистрСведений.ЗагруженныеДанные КАК Таблица
Если строка в поле не соответствует формату даты, результатом будет пустая дата 01.01.0001, а не ошибка запроса. Это удобно для отбора «непреобразованных» записей: их легко найти условием ВЫРАЗИТЬ(Поле КАК ДАТА) = ДАТАВРЕМЯ(1,1,1).
Также ВЫРАЗИТЬ(... КАК ДАТА) применяют к параметрам и к полям составного типа, чтобы убрать лишние типы из результата и ускорить соединения. При соединении таблиц по полю составного типа платформа строит более эффективный план, если тип сужен явно.
Литерал ДАТАВРЕМЯ и задание конкретного момента в запросе
Когда нужно указать конкретную дату прямо в тексте запроса, используют литерал ДАТАВРЕМЯ(год, месяц, день, час, минута, секунда). Время можно опустить — тогда оно будет равно 00:00:00:
ГДЕ
Заказы.Дата >= ДАТАВРЕМЯ(2026, 1, 1)
И Заказы.Дата < ДАТАВРЕМЯ(2026, 2, 1)
Обратите внимание на приём с правой границей: вместо «меньше или равно 31.01.2026 23:59:59» корректнее писать строгое «меньше первого числа следующего месяца». Это исключает потерю документов, проведённых в последнюю секунду, и не зависит от точности хранения времени.
Если границы периода приходят параметрами, тип параметра лучше задать явно через ВЫРАЗИТЬ(&НачалоПериода КАК ДАТА) — особенно когда параметр может быть не заполнен. Пустой параметр без типа иногда приводит к ошибке «Несовместимые типы» при сравнении.
Преобразование строки в дату во встроенном языке
Вне запросов, в модуле, строку преобразуют функцией Дата(). Она понимает канонический формат ГГГГММДДччммсс, где время можно опустить:
ДатаИзСтроки = Дата("20260115103000"); // 15.01.2026 10:30:00
ДатаБезВремени = Дата("20260115"); // 15.01.2026 0:00:00
Если строка приходит в «человеческом» формате вида «15.01.2026», прямой вызов Дата() вернёт пустую дату или вызовет ошибку в зависимости от контекста. Надёжный способ — разобрать строку вручную:
Функция СтрокаВДату(СтрокаДаты) Экспорт
// Ожидаем формат ДД.ММ.ГГГГ
Части = СтрРазделить(СтрокаДаты, ".");
Если Части.Количество() <> 3 Тогда
Возврат Дата(1, 1, 1);
КонецЕсли;
Канон = Части[2] + Части[1] + Части[0]; // ГГГГММДД
Возврат Дата(Канон);
КонецФункции
При массовой загрузке из файлов всегда проверяйте результат преобразования на пустую дату и логируйте исходную строку — иначе «молчаливые» пустые даты попадут в базу и исказят отчёты по периодам.
Вычисления с датами и проверка результата
Разность двух дат в 1С — это число секунд. Чтобы получить разницу в днях, делят на 86400: (Дата2 - Дата1) / 86400. В запросах для добавления интервала есть функция ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 7), во встроенном языке дни прибавляют простым сложением секунд или через Дата + 7 * 86400.
После любого преобразования проверяйте результат. Признаки корректной работы: дата не равна 01.01.0001, год находится в ожидаемом диапазоне, при группировке по дням не появляется отдельная строка с пустой датой. Если в отчёте внезапно возникла строка с датой 01.01.0001 — почти наверняка где-то не сработало преобразование строки или не заполнен реквизит.
Как проверить результат
Реальная дата в ожидаемом диапазоне лет
01.01.0001 0:00:00 — преобразование не сработало
Используется НАЧАЛОПЕРИОДА или диапазон от начала до конца дня
Прямое равенство дат с разным временем
Правая граница — строго меньше начала следующего периода
Документы последней секунды периода теряются или дублируются
Частые вопросы по выражению даты и времени в 1С
Чем отличается ДАТАВРЕМЯ в запросе от функции Дата() в коде?
ДАТАВРЕМЯ — литерал языка запросов, работает только в тексте запроса и принимает числовые аргументы. Дата() — функция встроенного языка, принимает либо числовые аргументы, либо строку в каноническом формате ГГГГММДДччммсс. Взаимозаменяемы они не являются: внутри запроса функцию Дата() вызвать нельзя.
Почему ВЫРАЗИТЬ(Поле КАК ДАТА) возвращает 01.01.0001?
Это значит, что исходное значение невозможно интерпретировать как дату: строка в неподдерживаемом формате, поле пустое или содержит значение другого типа. Проверьте фактическое содержимое поля и при необходимости приведите строку к каноническому виду до загрузки в базу.
Как сравнить две даты без учёта времени?
В запросе сравнивайте НАЧАЛОПЕРИОДА(Дата1, ДЕНЬ) и НАЧАЛОПЕРИОДА(Дата2, ДЕНЬ). Во встроенном языке — НачалоДня(Дата1) = НачалоДня(Дата2). Прямое сравнение исходных значений даст ложное неравенство, если время различается хотя бы на секунду.
Как получить текущую дату и время в запросе?
В языке запросов есть функция ТекущаяДата() — она возвращает дату сеанса. Во встроенном языке используют ТекущаяДатаСеанса(), которая корректно учитывает часовой пояс сеанса, в отличие от устаревшего варианта, берущего время компьютера.
Как прибавить к дате месяц или год?
Простым сложением секунд месяцы прибавлять нельзя — их длина разная. В запросе используйте ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, 1), во встроенном языке — функцию ДобавитьМесяц(Дата, 1). Для дней и часов сложение секунд допустимо.
Можно ли хранить в 1С только время без даты?
Отдельного типа «Время» нет. Обычно время хранят как дату с фиксированной календарной частью (например, 01.01.0001 14:30:00) либо как число секунд от начала дня. При сравнениях таких значений учитывайте выбранное соглашение, чтобы не смешивать подходы.
Что важно запомнить
В запросе приводите значения к дате через ВЫРАЗИТЬ(... КАК ДАТА), конкретный момент задавайте литералом ДАТАВРЕМЯ, строки в коде преобразуйте через Дата() в каноническом формате. Всегда проверяйте результат на пустую дату 01.01.0001, а сравнения по дням выполняйте через НАЧАЛОПЕРИОДА или НачалоДня, а не прямым равенством.