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

Разработка и Конфигурация · 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, а сравнения по дням выполняйте через НАЧАЛОПЕРИОДА или НачалоДня, а не прямым равенством.