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

Разработка и Конфигурация · 10 мин

1С: как выразить значение как дату

Как в 1С выразить значение как дату: функция ДатаВремя, преобразование строки и числа в дату, работа с форматом даты в запросах и СКД. Примеры и ошибки.

Задача «выразить как дату» в 1С возникает в нескольких типовых ситуациях: нужно преобразовать строку или число в значение типа «Дата», привести дату к нужному виду в запросе, отсечь время или получить дату без времени для сравнения. В зависимости от контекста — встроенный язык, язык запросов или СКД — применяются разные инструменты, и путать их нельзя: синтаксис и возможности отличаются.

Во встроенном языке 1С нет отдельной функции «ВыразитьКакДату» — для создания даты используется функция Дата() и её варианты, а также преобразование через Дата(Строка) в ряде случаев. В языке запросов для приведения типов служит оператор ВЫРАЗИТЬ(... КАК ДАТА), который чаще всего применяют для усечения составного типа или отсечения времени. Ниже разобраны оба подхода с примерами, ограничениями и типичными ошибками.

Как устроен тип «Дата» в 1С

Тип «Дата» в 1С всегда содержит и календарную дату, и время с точностью до секунды. Отдельного типа «только дата без времени» в платформе нет: если время не задано, оно равно 00:00:00. Это важно при сравнениях — документ с датой 15.03.2026 14:30:00 не равен дате 15.03.2026 00:00:00, хотя календарный день один и тот же.

Пустая (незаполненная) дата в 1С — это значение 01.01.0001 00:00:00. Проверку на пустую дату выполняют сравнением с '00010101' или функцией ЗначениеЗаполнено(). Путаница с пустой датой — частая причина ошибок в отборах и условиях.

Создание даты во встроенном языке

Функция Дата() с числовыми параметрами

Основной способ задать конкретную дату в коде — функция Дата() с числовыми аргументами. Порядок параметров: год, месяц, день, затем необязательные час, минута, секунда.

ДатаОтчета = Дата(2026, 3, 15);          // 15.03.2026 0:00:00

МоментВремени = Дата(2026, 3, 15, 14, 30, 0); // 15.03.2026 14:30:00

Если передать недопустимые значения (месяц 13, день 32), платформа выдаст ошибку. Поэтому при формировании даты из пользовательского ввода параметры стоит проверять заранее.

Литералы даты

Для фиксированных дат удобнее литерал в одинарных кавычках в формате ГГГГММДД (можно дополнить временем ччммсс):

НачалоПериода = '20260315';

КонецПериода = '20260315235959';

Литералы работают и в параметрах запросов, и в условиях. Это самый читаемый способ задать константную дату без лишних вызовов функций.

Преобразование строки в дату

Если дата приходит строкой — из файла, веб-сервиса или пользовательского ввода — её нужно привести к ожидаемому формату. Функция Дата() умеет принимать строку в строгом формате «ГГГГММДДччммсс» (допускаются разделители в некоторых вариантах, но надёжнее придерживаться канонического вида):

СтрокаИзФайла = "20260315143000";

ДатаДокумента = Дата(СтрокаИзФайла);

Строки вида «15.03.2026» напрямую функцией Дата() не разбираются — попытка даст ошибку преобразования. Для таких форматов строку разбирают вручную: выделяют подстроки через Лев(), Сред(), Прав() или разбивают по разделителю через СтрРазделить(), затем собирают дату из чисел:

Части = СтрРазделить("15.03.2026", ".");

ДатаДокумента = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

Безопасное преобразование через Попытка/Исключение

При загрузке данных из внешних источников формат не гарантирован. Стандартный приём — обернуть преобразование в обработку исключений и при неудаче вернуть пустую дату или признак ошибки:

Функция СтрокаВДату(Строка)

Попытка

Возврат Дата(Строка);

Исключение

Возврат '00010101';

КонецПопытки;

КонецФункции

Типичные ошибки
01
Передача строки вида «15.03.2026» напрямую в Дата() — получение ошибки преобразования
02
Сравнение дат без учёта времени — документы за день «не находятся» из-за неравенства 00:00:00 и фактического времени
03
Путаница порядка день/месяц при разборе строк из файлов форматов MM.DD.YYYY и DD.MM.YYYY
04
Использование ТекущаяДата() на сервере там, где нужна дата сеанса с учётом часового пояса пользователя

Выразить как дату в запросе: ВЫРАЗИТЬ(... КАК ДАТА)

В языке запросов оператор ВЫРАЗИТЬ приводит значение к указанному типу. Наиболее частые сценарии с датой:

  • приведение составного поля (например, реквизита строкового типа, где хранится дата) к типу «Дата» — но только если значение физически является датой, строка «15.03.2026» так не преобразуется;
  • усечение составного типа до даты, чтобы упростить сравнения и соединения;
  • приведение параметра к типу «Дата» для корректной работы СУБД.
ВЫБРАТЬ

ВЫРАЗИТЬ(Регистр.Период КАК ДАТА) КАК День

ИЗ

РегистрНакопления.Продажи КАК Регистр

Важно понимать: ВЫРАЗИТЬ не выполняет «умного» разбора строк. Если поле строковое и содержит текст, приведение к дате даст пустую дату или значение по умолчанию, а не распарсенную дату. Для строковых данных преобразование делается на этапе загрузки во временную таблицу или в коде до запроса.

Как отсечь время и получить начало или конец дня

Для сравнения «в пределах дня» удобнее функции языка запросов НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА(). Они возвращают границы периода для переданной даты:

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) КАК НачалоДня,

КОНЕЦПЕРИОДА(Документ.Дата, ДЕНЬ) КАК КонецДня

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ГДЕ

Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Во встроенном языке аналогичные функции — НачалоДня(), КонецДня(), НачалоМесяца(), КонецМесяца() и другие. Для отбора за день правильно задавать интервал от НачалоДня(Дата) до КонецДня(Дата), а не сравнивать дату на равенство — иначе записи с ненулевым временем выпадут из выборки.

Отбор документов за один день
  1. 1
    Получите входную дату (например, из параметра формы)
  2. 2
    Вычислите НачалоДня(Дата) и КонецДня(Дата)
  3. 3
    Передайте оба значения параметрами в запрос
  4. 4
    В условии используйте МЕЖДУ &Начало И &Конец
  5. 5
    Проверьте результат на документе с ненулевым временем

Форматирование даты для вывода пользователю

Обратная задача — представить дату строкой в нужном виде — решается функцией Формат(). Она не меняет само значение, а только его отображение:

СтрокаДляПечати = Формат(ДатаДокумента, "ДЛФ=D");        // 15.03.2026

СтрокаПолная = Формат(ДатаДокумента, "ДЛФ=DD"); // 15 марта 2026 г.

СВременем = Формат(ДатаДокумента, "ДФ='dd.MM.yyyy ЧЧ:мм:сс'");

Часто используемые параметры: ДЛФ — локальный формат даты (D, DD, DT), ДФ — произвольный шаблон, ДП — представление пустой даты (например, ДП="не указана", чтобы пустая дата не выводилась как 01.01.0001). В макетах и полях форм формат можно задать в свойствах поля без программного кода.

Проверка результата и частые проблемы

После преобразования полезно убедиться, что значение действительно стало датой и содержит ожидаемые данные. Основные контрольные точки:

  • ТипЗнч(Значение) = Тип("Дата") — проверка типа после преобразования;
  • сравнение с '00010101' — признак того, что преобразование не удалось или входные данные были пустыми;
  • вывод через Формат(Значение, "ДЛФ=DT") в сообщение или журнал — визуальная проверка даты и времени;
  • при обмене — контрольное количество успешно преобразованных и отклонённых записей.
Контрольные точки

Как проверить результат

Тип значения после преобразования
Норма

ТипЗнч() возвращает Дата

Тревожный признак

Осталась строка или число — преобразование не выполнено

Значение даты
Норма

Совпадает с исходными данными, время ожидаемое

Тревожный признак

01.01.0001 — входная строка не разобрана

Отбор за период
Норма

Находятся документы с любым временем внутри дня

Тревожный признак

Выпадают записи с ненулевым временем — сравнение на равенство вместо интервала

Если дата «съезжает» на день при обмене между системами, проверяйте часовые пояса: универсальное время (UTC) при преобразовании в локальное может сместить календарный день. Для таких случаев используют МестноеВремя() и УниверсальноеВремя() и фиксируют, в каком поясе хранятся данные.

Итог

Что важно запомнить

В коде дату создают функцией Дата() или литералом 'ГГГГММДД', строку разбирают с проверкой формата через Попытка/Исключение. В запросах тип приводят оператором ВЫРАЗИТЬ(... КАК ДАТА), а границы дня — функциями НАЧАЛОПЕРИОДА/КОНЕЦПЕРИОДА. Для вывода используют Формат(), помня, что он возвращает строку.

Частые вопросы

Как преобразовать строку «15.03.2026» в дату?

Напрямую функцией Дата() — никак, она понимает только формат «ГГГГММДДччммсс». Разбейте строку по разделителю через СтрРазделить(), извлеките день, месяц и год, приведите их к числам и соберите дату: Дата(Год, Месяц, День). Обязательно проверяйте, что частей три и значения в допустимых диапазонах.

Чем отличается ВЫРАЗИТЬ(КАК ДАТА) от НАЧАЛОПЕРИОДА?

ВЫРАЗИТЬ меняет тип значения (например, сужает составной тип до даты), но сохраняет время. НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) возвращает новую дату — начало указанного периода, то есть отсекает время, устанавливая 00:00:00. Это разные операции, решающие разные задачи.

Почему сравнение дат на равенство не находит документы?

Потому что тип «Дата» включает время. Документ с датой 15.03.2026 10:25:00 не равен дате 15.03.2026 00:00:00. Используйте отбор интервалом: Дата МЕЖДУ НачалоДня(Дата) И КонецДня(Дата), либо сравнивайте НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) с нужным днём.

Как вывести пустую дату как пустую строку, а не 01.01.0001?

Используйте параметр ДП функции Формат(): Формат(ДатаЗначение, "ДЛФ=D; ДП=' '") — для пустой даты будет выведено указанное представление. В полях форм аналогичную настройку задают в свойстве «Формат» поля.

Можно ли в запросе разобрать строку с датой, например «2026-03-15»?

Штатных функций разбора произвольной строки в дату в языке запросов нет. Варианты: преобразовать строку во временную таблицу в коде до запроса, собрать дату через ПОДСТРОКА и арифметику (громоздко и хрупко) или хранить дату в реквизите типа «Дата» изначально — это правильное решение при проектировании.

Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?

ТекущаяДата() возвращает время компьютера, где выполняется код (на сервере — время сервера). ТекущаяДатаСеанса() учитывает часовой пояс сеанса пользователя. Для дат документов и отчётов, которые видит пользователь, корректнее использовать ТекущаяДатуСеанса(), иначе при разных часовых поясах возможны смещения на сутки.