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

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

Что такое литерал даты в 1С и как его использовать

Литерал даты в 1С — способ записать конкретную дату прямо в коде. Разбираем формат 'ГГГГММДДччммсс', примеры сравнения дат, типичные ошибки и советы.

Литерал даты в 1С — это способ записать конкретное значение типа «Дата» непосредственно в тексте программного модуля, без вызова функций и без переменных. Платформа распознаёт такую запись на этапе компиляции модуля и превращает её в готовое значение, которое можно сравнивать, присваивать реквизитам и передавать в запросы.

Литералы дат встречаются практически в любом коде на встроенном языке 1С: в условиях проверки периода, в отборах запросов, при установке границ обмена данными. При этом у формата есть строгие правила, и нарушение синтаксиса приводит к ошибке компиляции ещё до запуска кода.

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

Формат записи литерала даты

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

Минимальная допустимая запись — только дата из восьми цифр: '20260315'. Время при этом считается равным началу дня, то есть 00:00:00. Полная запись с точностью до секунды выглядит так: '20260315143000' — это 15 марта 2026 года, 14 часов 30 минут 00 секунд.

// Только дата — время будет 00:00:00

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

// Дата и время

СрокОплаты = '20260131235959';

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

Объект.ДатаНачалаДействия = '20260301';

Каждая часть записи должна содержать ровно столько цифр, сколько предусмотрено форматом: год — четыре, месяц, день, часы, минуты и секунды — по две. Запись '2026315' или '2026-03-15' вызовет синтаксическую ошибку при проверке модуля.

Чем литерал отличается от функций работы с датами

Литерал подходит только тогда, когда дата известна заранее и никогда не меняется. Если значение нужно вычислить — получить текущую дату, сдвинуть период, собрать дату из отдельных чисел — используются функции встроенного языка.

Основные альтернативы литералу:

  • ТекущаяДатаСеанса() — дата и время на момент выполнения кода с учётом настроек сеанса;
  • Дата(2026, 3, 15) — конструирование даты из числовых параметров, удобно, когда части даты хранятся в переменных;
  • Дата("20260315") — преобразование строки в дату, работает с тем же форматом ГГГГММДД;
  • НачалоДня(Дата), КонецДня(Дата), ДобавитьМесяц(Дата, 1) — вычисления на основе существующего значения.

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

Литерал или функция Дата()

Литерал '20260315'

Подходит для фиксированных границ: начало действия настройки, дата перехода на новый алгоритм. Проверяется компилятором, работает быстрее.

Функция Дата(Год, Месяц, День)

Подходит, когда части даты вычисляются или хранятся в переменных. Гибче, но ошибки выявляются только при выполнении.

ТекущаяДатаСеанса() и вычисления

Подходит для относительных периодов: последние 30 дней, текущий месяц. Литерал здесь бесполезен, так как дата постоянно меняется.

Где литералы дат применяются на практике

Самый частый сценарий — жёсткая граница в условии. Например, с определённой даты меняется алгоритм расчёта, и код должен ветвиться в зависимости от того, раньше документ этой даты или позже.

Если Документ.Дата >= '20260101' Тогда

// Новый алгоритм расчёта

СуммаНалога = База * 0.20;

Иначе

// Старый алгоритм для прошлых периодов

СуммаНалога = База * 0.18;

КонецЕсли;

Второй сценарий — параметры запросов. Когда граница периода фиксирована, литерал можно передать как параметр или, в простых случаях, вписать прямо в текст запроса. В языке запросов 1С литерал даты записывается через ключевое слово ДАТАВРЕМЯ.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Продажи.Номенклатура,

| СУММА(Продажи.Количество) КАК Количество

|ИЗ

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

|ГДЕ

| Продажи.Период >= ДАТАВРЕМЯ(2026, 1, 1)

|СГРУППИРОВАТЬ ПО

| Продажи.Номенклатура";

Обратите внимание: в тексте запроса формат другой — ДАТАВРЕМЯ(2026, 1, 1) с запятыми, а не сплошная строка в апострофах. Смешение этих двух синтаксисов — распространённая причина ошибок.

Литералы в динамических списках и СКД

В настройках динамических списков и схем компоновки данных литералы дат тоже встречаются в текстах запросов через ДАТАВРЕМЯ. Однако для пользовательских отборов лучше использовать параметры — тогда период можно менять без правки конфигурации.

Дата с временем и без: в чём подвох

Литерал '20260315' — это не «весь день 15 марта», а конкретный момент: 15 марта, 00:00:00. Если сравнить его с датой документа, проведённого в 10 утра того же дня, условие «равно» не сработает, потому что значения различаются временем.

Из-за этого типичная проверка «документ в пределах одного дня» через равенство почти всегда даёт неверный результат. Правильные приёмы:

  • использовать диапазон: Дата >= '20260315' И Дата <= '20260315235959';
  • либо сравнивать начала дней: НачалоДня(Документ.Дата) = '20260315';
  • либо для верхней границы брать начало следующего дня со строгим неравенством: Дата < '20260316'.

Третий вариант считается самым надёжным: он не зависит от того, хранится ли в базе время с точностью до секунды, и корректно работает в запросах по периодам регистров.

Типичные ошибки
01
Сравнение даты документа с литералом через равенство — время в дате документа не совпадает с 00:00:00, условие почти никогда не выполняется.
02
Пробелы или разделители внутри литерала: '2026 03 15' или '2026-03-15' — ошибка компиляции модуля.
03
Использование формата запроса ДАТАВРЕМЯ() в обычном коде и наоборот — синтаксическая ошибка.
04
Несуществующая дата вроде '20260230' — модуль скомпилируется, но значение будет некорректным или вызовет ошибку при выполнении.
05
Зашитая в код дата там, где нужен вычисляемый период — через год условие перестаёт соответствовать логике учёта.

Как проверить корректность литерала

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

Как убедиться, что литерал записан верно
  1. 1
    Запишите литерал в модуле и сохраните модуль — синтаксические ошибки подсветятся сразу.
  2. 2
    Проверьте длину строки: 8 цифр для даты, 14 для даты со временем.
  3. 3
    Убедитесь, что месяц в диапазоне 01–12, а день соответствует месяцу.
  4. 4
    В отладчике сравните литерал с реальным значением из базы и посмотрите результат условия.
  5. 5
    Если сравнение ведёт себя неожиданно, выведите обе даты через Сообщить() и проверьте компоненту времени.
Контрольные точки

Как отличить правильную запись от ошибочной

Сохранение модуля
Норма

Модуль сохраняется без сообщений об ошибках

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

Конфигуратор указывает строку с литералом как ошибочную

Сравнение с датой документа
Норма

Условие срабатывает на документах ожидаемого периода

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

Условие не срабатывает ни на одном документе — вероятно, проблема во времени

Длина значения в апострофах
Норма

8 или 14 цифр без пробелов и разделителей

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

Другое количество символов или посторонние знаки

Когда литерал использовать не стоит

Жёстко зашитая дата в коде — это технический долг. Если граница периода может измениться (начало применения новой ставки, дата обязательной маркировки, период обмена), правильнее вынести её в константу, настройку или регистр сведений. Тогда изменение потребует правки данных, а не доработки конфигурации и обновления релиза.

Также литералы не подходят для любых относительных периодов: «последний месяц», «текущий квартал», «три дня назад». Все эти значения вычисляются от ТекущаяДатаСеанса() с помощью функций ДобавитьМесяц(), НачалоМесяца() и арифметики дат (прибавление секунд).

Маршрут решения

Как выбрать способ задания даты

Дата фиксирована навсегда, например граница старого и нового алгоритма по уже прошедшему событиюИспользуйте литерал — это просто и проверяется компилятором
Дата может измениться по решению пользователей или законодательстваВынесите значение в константу или регистр сведений и читайте оттуда
Нужен период относительно текущего моментаВычисляйте дату функциями от ТекущаяДатаСеанса()
Дата собирается из отдельных полей или строкиИспользуйте функцию Дата() с проверкой входных данных

Ещё одно ограничение — переносимость кода между информационными базами с разными настройками. Литерал не зависит от региональных установок, и это его плюс: '20260315' означает одно и то же в любой базе. А вот строковое представление даты, полученное через Формат(), уже зависит от настроек и для обратного преобразования не годится.

При сравнении периодов в запросах удобно запомнить приём «левая граница включительно, правая — исключительно»: Период >= '20260101' И Период < '20260201'. Такой диапазон охватывает ровно январь без трюков с 23:59:59 и не пропускает документы на границе суток.
ПЗ
Практическое замечание

Частые вопросы о литералах дат в 1С

Можно ли записать литерал даты в привычном виде ДД.ММ.ГГГГ?

Нет. Встроенный язык принимает только формат ГГГГММДД без разделителей, например '20260315'. Запись '15.03.2026' будет воспринята как обычная строка или вызовет ошибку. Если дата приходит в привычном виде от пользователя, её нужно преобразовывать программно с проверкой корректности.

Что произойдёт, если указать несуществующую дату, например 30 февраля?

Компилятор проверяет в основном структуру записи, а не реальность календарной даты. Некорректное значение может привести к ошибке при выполнении или к непредсказуемому результату сравнения. Поэтому день и месяц стоит проверять вручную, особенно в феврале и в месяцах с 30 днями.

Чем отличается литерал '20260315' от ДАТАВРЕМЯ(2026, 3, 15)?

Первый вариант — синтаксис встроенного языка в модулях, второй — синтаксис языка запросов. Оба дают значение 15 марта 2026 года, 00:00:00, но используются в разных контекстах и не взаимозаменяемы: в запросе литерал в апострофах не сработает, а в модуле ДАТАВРЕМЯ() вызовет ошибку.

Как сравнить дату документа с литералом, если в дате есть время?

Не используйте равенство. Либо приведите дату документа к началу дня функцией НачалоДня() и сравнивайте с литералом, либо стройте диапазон: больше или равно началу нужного дня и строго меньше начала следующего. Второй способ надёжнее в запросах.

Можно ли использовать литерал даты в параметре запроса?

Да. Литерал — обычное значение типа Дата, его можно присвоить параметру через Запрос.УстановитьПараметр("НачалоПериода", '20260101'). Это удобно, когда текст запроса универсален, а граница фиксирована логикой алгоритма.

Почему условие с литералом перестало работать после обновления конфигурации?

Чаще всего дело не в литерале, а в изменении логики: дата перехода на новый алгоритм сдвинулась, а зашитое значение осталось прежним. Это признак того, что границу пора перенести из кода в настройку — константу или регистр сведений, чтобы менять её без доработки.

Итог

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

Литерал даты — это запись конкретной даты в апострофах в формате ГГГГММДДччммсс, например '20260101'. Он проверяется компилятором и подходит для фиксированных границ в коде. В запросах используется другой синтаксис — ДАТАВРЕМЯ(год, месяц, день). Главные подводные камни — компонента времени при сравнениях и зашитые даты, которые со временем должны стать настройками.