Разработка и Конфигурация · 10 мин
Как явно указать дату в 1С: литералы, функции и преобразование строк
Как явно задать дату в 1С: литералы даты, функции Дата() и ДатаВремя(), преобразование строки в дату, форматирование и типичные ошибки разработчиков.
Явное указание даты в 1С требуется в самых разных задачах: при заполнении документов обработкой, в запросах с отбором по периоду, при тестировании алгоритмов и в формулах СКД. Платформа 1С:Предприятие 8 предлагает несколько способов задать конкретное значение даты — от литерала в коде до преобразования строки. Выбор способа зависит от того, где именно используется дата: во встроенном языке, в тексте запроса, в выражении СКД или при вводе пользователем.
Главная ошибка начинающих разработчиков — попытка присвоить дате строковое значение вида "01.01.2026" и ожидать, что платформа сама разберётся. В большинстве контекстов такое присваивание либо даст строку вместо даты, либо приведёт к ошибке сравнения несовместимых типов. Ниже разобраны все рабочие способы явно указать дату, их ограничения и типичные подводные камни.
Литерал даты во встроенном языке
Самый короткий способ явно указать дату в коде — литерал. Он записывается в одинарных кавычках в формате ГГГГММДД, без разделителей: ДатаДокумента = '20260115';. Такой литерал платформа интерпретирует как значение типа «Дата» с началом дня (время 00:00:00).
Если нужны часы, минуты и секунды, их дописывают в том же литерале: '20260115143000' — это 15 января 2026 года, 14:30:00. Порядок строго фиксирован: год, месяц, день, часы, минуты, секунды. Перестановка частей или добавление точек и дефисов внутри литерала недопустимы — будет ошибка компиляции модуля.
Важное ограничение: литерал в одинарных кавычках работает только во встроенном языке. В тексте запроса он воспринимается как строка, а в выражениях СКД и вовсе не поддерживается. Поэтому один и тот же подход нельзя механически переносить между контекстами.
ДатаОтгрузки = '20260315';
МоментОплаты = '20260315120000'; // 15.03.2026 12:00:00Функции Дата() и ДатаВремя()
Функция Дата() позволяет собрать дату из отдельных числовых компонентов: Дата(2026, 3, 15). Этот вариант удобен, когда год, месяц или день вычисляются программно или приходят из реквизитов числового типа. Для даты со временем используют расширенный вызов: Дата(2026, 3, 15, 12, 30, 0).
Та же функция умеет преобразовывать строку в дату, но строка должна быть в строгом внутреннем формате ГГГГММДДЧЧММСС (время можно опустить): Дата("20260315"). Строки вида «15.03.2026» или «2026-03-15» функция не примет — результатом будет пустая дата (01.01.0001) или ошибка в зависимости от контекста. Это одна из самых частых причин «молчаливых» ошибок, когда обработка отрабатывает, но дата оказывается пустой.
Для получения даты со временем также существует функция ДатаВремя() с аналогичным синтаксисом числовых аргументов. На практике чаще встречается универсальный вариант Дата() с шестью параметрами — он читается одинаково во всех версиях платформы.
Явное указание даты в запросе
В языке запросов 1С литерал даты записывается ключевым словом ДАТАВРЕМЯ с числовыми аргументами через запятую: ДАТАВРЕМЯ(2026, 3, 15) или с временем ДАТАВРЕМЯ(2026, 3, 15, 23, 59, 59). Строковые литералы в условиях сравнения с датами использовать нельзя — запрос либо не выполнится, либо сравнение даст неожиданный результат.
Рекомендуемая практика — передавать дату через параметр запроса, а не встраивать литерал в текст. Это исключает ошибки форматирования при конкатенации строк и ускоряет выполнение, так как план запроса переиспользуется. Параметр заполняется обычным значением типа «Дата» из встроенного языка.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ Реализация.Дата >= &НачалоПериода";
Запрос.УстановитьПараметр("НачалоПериода", '20260101');
Результат = Запрос.Выполнить();Обратите внимание на границы периодов. Дата без времени — это начало дня (00:00:00). Если нужно захватить весь день включительно, используйте либо конец дня через КонецДня(Дата) перед передачей в параметр, либо виртуальную таблицу с параметром «Период», где граница задаётся объектом Граница с видом «Включая».
Преобразование строки в дату из внешних данных
При загрузке из файлов, обмене с сайтом или чтении данных из Excel дата часто приходит строкой в произвольном формате: «15.03.2026», «2026-03-15», «15/03/2026». Встроенная функция Дата() такие строки напрямую не понимает, поэтому строку сначала разбирают вручную.
Типовой приём — извлечь подстроки функциями Лев(), Сред(), Прав() или разбить строку через СтрРазделить() по разделителю, а затем собрать дату из числовых компонентов. Перед сборкой стоит удалить нецифровые символы и проверить, что компонентов ровно три и они в ожидаемых диапазонах.
- 1Разбейте строку функцией СтрРазделить(СтрокаДаты, ".") — получите массив из дня, месяца, года.
- 2Проверьте, что элементов ровно три и каждый состоит из цифр.
- 3Преобразуйте элементы в числа и соберите дату: Дата(Число(Год), Число(Месяц), Число(День)).
- 4Проверьте результат: если дата равна 01.01.0001 — исходная строка была некорректной, зафиксируйте ошибку загрузки.
Для формата ISO 8601 («2026-03-15T14:30:00»), который часто приходит из веб-сервисов, в платформе есть функция XMLЗначение(Тип("Дата"), Строка) — она корректно разбирает каноническое представление даты и времени. Это надёжнее ручного разбора, если источник гарантированно отдаёт ISO-формат.
Дата в СКД, формулах и форматированный вывод
В выражениях системы компоновки данных дату задают функцией языка выражений ДатаВремя(2026, 3, 15). Литерал в одинарных кавычках там не работает. В параметрах СКД типа «Дата» значение удобнее передавать извне через КомпоновщикНастроек, чем зашивать константу в схему.
Обратная задача — показать дату пользователю в нужном виде — решается функцией Формат(): Формат(ДатаДокумента, "ДЛФ=D") выведет длинный формат даты, а Формат(ДатаДокумента, "ДФ=dd.MM.yyyy") — привычное «15.03.2026». Форматная строка влияет только на отображение, само значение остаётся типа «Дата».
Способы задать дату
Самый короткий вариант для кода. Не работает в запросах и СКД.
Подходит, когда компоненты вычисляются или приходят числами. Чуть длиннее записи.
Единственный литерал даты в языке запросов. Во встроенном языке не используется.
Предпочтительный способ в запросах: безопаснее, быстрее, без проблем форматов.
Для строк в формате ISO 8601 из веб-сервисов и обменов.
Частые ошибки и как их проверить
Самая распространённая ошибка — сравнение даты со строкой: Если Документ.Дата = "15.03.2026" Тогда. Такое условие всегда ложно, потому что типы разные, и платформа не выдаёт ошибку — алгоритм просто молча не срабатывает. Всегда приводите обе стороны сравнения к типу «Дата».
Вторая группа ошибок связана с границами дня и часовыми поясами. Дата, полученная функцией ТекущаяДата() на сервере и на клиенте, может различаться в распределённых системах, а сравнение «дата больше или равна 15.03.2026» без указания времени отсекает весь день 15-го числа, если имелась в виду конечная граница. Для конца периода используйте КонецДня() или КонецМесяца().
Как проверить результат
ТипЗнч(Значение) возвращает тип Дата
Тип — Строка, сравнения и отборы не работают
Дата соответствует исходной строке
01.01.0001 — строка не разобрана
Документы последнего дня попадают в выборку
Документы последнего дня теряются — граница задана началом дня
Для отладки удобно выводить проверяемое значение через Сообщить(Формат(Значение, "ДЛФ=DT")) — так видно и дату, и время, и сразу заметно, что значение пустое или сдвинуто. В толстом клиенте и конфигураторе тип и значение проверяются в табло через точку останова.
Что важно запомнить
В коде используйте литерал 'ГГГГММДД' или функцию Дата(), в запросах — ДАТАВРЕМЯ() или параметры. Никогда не сравнивайте дату со строкой и всегда проверяйте, что после преобразования не получилась пустая дата 01.01.0001. Для конца периода применяйте КонецДня().
Частые вопросы
Почему Дата("15.03.2026") возвращает пустую дату?
Функция Дата() понимает строку только во внутреннем формате ГГГГММДД без разделителей. Строку «15.03.2026» нужно разбить по точке через СтрРазделить() и собрать дату из числовых компонентов: Дата(Число(Год), Число(Месяц), Число(День)).
Как задать дату со временем в запросе?
Используйте литерал ДАТАВРЕМЯ с шестью аргументами: ДАТАВРЕМЯ(2026, 3, 15, 23, 59, 59). Если значение приходит из кода, передайте его параметром запроса — УстановитьПараметр("Граница", КонецДня(НужнаяДата)).
Чем отличается пустая дата от незаполненного реквизита?
Пустая дата — это конкретное значение 01.01.0001 00:00:00. Проверить её можно сравнением: Если Дата = '00010101' Тогда, либо функцией ЗначениеЗаполнено(Дата), которая для пустой даты вернёт Ложь.
Как вывести дату в нужном формате в печатной форме?
Используйте функцию Формат(): Формат(ДатаДокумента, "ДЛФ=D") для длинного представления или Формат(ДатаДокумента, "ДФ='dd.MM.yyyy'") для краткого. Форматирование меняет только отображение, тип значения остаётся «Дата».
Работает ли литерал '20260315' в СКД?
Нет. В выражениях СКД дату задают функцией ДатаВремя(2026, 3, 15). Параметры отчёта типа «Дата» лучше заполнять извне через настройки компоновщика, а не зашивать константу в схему.
Как преобразовать дату из формата ISO 8601, полученного с сайта?
Используйте XMLЗначение(Тип("Дата"), "2026-03-15T14:30:00") — функция корректно разбирает каноническое представление. Это надёжнее ручного разбора строки, если источник данных гарантирует формат ISO.