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