Разработка и Конфигурация · 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)— вычисления на основе существующего значения.
Ключевое отличие: литерал проверяется компилятором, поэтому ошибка в нём обнаруживается сразу при сохранении модуля. Ошибка в строке, передаваемой в функцию Дата(), проявится только во время выполнения, когда пользователь дойдёт до этой ветки кода.
Литерал или функция Дата()
Подходит для фиксированных границ: начало действия настройки, дата перехода на новый алгоритм. Проверяется компилятором, работает быстрее.
Подходит, когда части даты вычисляются или хранятся в переменных. Гибче, но ошибки выявляются только при выполнении.
Подходит для относительных периодов: последние 30 дней, текущий месяц. Литерал здесь бесполезен, так как дата постоянно меняется.
Где литералы дат применяются на практике
Самый частый сценарий — жёсткая граница в условии. Например, с определённой даты меняется алгоритм расчёта, и код должен ветвиться в зависимости от того, раньше документ этой даты или позже.
Если Документ.Дата >= '20260101' Тогда
// Новый алгоритм расчёта
СуммаНалога = База * 0.20;
Иначе
// Старый алгоритм для прошлых периодов
СуммаНалога = База * 0.18;
КонецЕсли;
Второй сценарий — параметры запросов. Когда граница периода фиксирована, литерал можно передать как параметр или, в простых случаях, вписать прямо в текст запроса. В языке запросов 1С литерал даты записывается через ключевое слово ДАТАВРЕМЯ.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура,
| СУММА(Продажи.Количество) КАК Количество
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ
| Продажи.Период >= ДАТАВРЕМЯ(2026, 1, 1)
|СГРУППИРОВАТЬ ПО
| Продажи.Номенклатура";
Обратите внимание: в тексте запроса формат другой — ДАТАВРЕМЯ(2026, 1, 1) с запятыми, а не сплошная строка в апострофах. Смешение этих двух синтаксисов — распространённая причина ошибок.
Литералы в динамических списках и СКД
В настройках динамических списков и схем компоновки данных литералы дат тоже встречаются в текстах запросов через ДАТАВРЕМЯ. Однако для пользовательских отборов лучше использовать параметры — тогда период можно менять без правки конфигурации.
Дата с временем и без: в чём подвох
Литерал '20260315' — это не «весь день 15 марта», а конкретный момент: 15 марта, 00:00:00. Если сравнить его с датой документа, проведённого в 10 утра того же дня, условие «равно» не сработает, потому что значения различаются временем.
Из-за этого типичная проверка «документ в пределах одного дня» через равенство почти всегда даёт неверный результат. Правильные приёмы:
- использовать диапазон:
Дата >= '20260315' И Дата <= '20260315235959'; - либо сравнивать начала дней:
НачалоДня(Документ.Дата) = '20260315'; - либо для верхней границы брать начало следующего дня со строгим неравенством:
Дата < '20260316'.
Третий вариант считается самым надёжным: он не зависит от того, хранится ли в базе время с точностью до секунды, и корректно работает в запросах по периодам регистров.
Как проверить корректность литерала
Проверка синтаксиса выполняется штатно: в конфигураторе откройте меню «Конфигурация — Проверка конфигурации» или просто сохраните модуль — компилятор укажет строку с ошибкой. Для проверки значения удобно вывести его в отладчике или через Сообщить().
- 1Запишите литерал в модуле и сохраните модуль — синтаксические ошибки подсветятся сразу.
- 2Проверьте длину строки: 8 цифр для даты, 14 для даты со временем.
- 3Убедитесь, что месяц в диапазоне 01–12, а день соответствует месяцу.
- 4В отладчике сравните литерал с реальным значением из базы и посмотрите результат условия.
- 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'. Он проверяется компилятором и подходит для фиксированных границ в коде. В запросах используется другой синтаксис — ДАТАВРЕМЯ(год, месяц, день). Главные подводные камни — компонента времени при сравнениях и зашитые даты, которые со временем должны стать настройками.