Работа с датами в запросах 1С — одна из самых частых задач при разработке отчётов, обработок и интеграций. Неправильно указанный формат может привести к ошибкам выполнения, некорректной фильтрации данных или даже падению системы. Эта статья поможет разобраться, как грамотно оформлять даты в различных сценариях: от простых условий ГДЕ до сложных конструкций с параметрами и динамическими интервалами.

Особенность языка запросов 1С:Предприятие заключается в том, что он использует собственный синтаксис для работы с датами, отличный от SQL-стандартов. Здесь нет кавычек или функций вроде TO_DATE() — вместо этого применяются специальные литералы и функции платформы. Мы рассмотрим все актуальные способы записи дат, включая нюансы для разных версий платформы (8.3.20+), а также типичные ошибки, которые допускают даже опытные разработчики.

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

Базовый синтаксис дат в запросах 1С

Самый простой способ указать дату в запросе — использовать литерал даты, который в записывается в квадратных скобках с ключевым словом ДАТАВРЕМЯ или ДАТА. Примеры:

ВЫБРАТЬ

ДатаДокумента КАК Период

ИЗ

Документ.ПоступлениеТоваров

ГДЕ

ДатаДокумента = ДАТАВРЕМЯ(2026, 05, 15)

Ключевые правила:

  • 📅 ДАТАВРЕМЯ() — указывает дату и время (по умолчанию время 00:00:00). Аргументы: год, месяц, день, часы, минуты, секунды.
  • 🗓️ ДАТА() — только дата без времени. Аналогичен ДАТАВРЕМЯ(год, месяц, день, 0, 0, 0).
  • ВРЕМЯ() — только время (редко используется в фильтрах по датам).

Обратите внимание: месяцы в функциях указываются числами от 1 до 12, а не названиями. Например, ДАТА(2026, 5, 15) — это 15 мая 2026 года, а не 5-е число 12-го месяца!

📊 Какой формат дат вы используете чаще всего?
ДАТАВРЕМЯ()
ДАТА()
Параметры запроса
Динамические выражения

Работа с параметрами дат

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

ВЫБРАТЬ

Номенклатура.Наименование,

СуммаДокумента

ИЗ

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

ГДЕ

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

Здесь &НачалоПериода и &КонецПериода — это параметры, которые передаются в запрос из кода . Важно помнить:

  • 🔹 Параметры в запросе всегда начинаются с &.
  • 📌 Тип параметра должен соответствовать типу поля в базе (для дат — Тип("Дата")).
  • ⚠️ Если параметр не задан, запрос завершится ошибкой "Неопределённое значение параметра".
💡

Чтобы избежать ошибок с пустыми параметрами, всегда проверяйте их заполненность перед выполнением запроса: ЕСТЬ NULL(&НачалоПериода, ДАТА(1,1,1)).

Пример передачи параметров из кода:

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

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

"ВЫБРАТЬ ...

ГДЕ Дата МЕЖДУ &Начало И &Конец";

Запрос.УстановитьПараметр("Начало", НачалоПериода); // Переменная типа Дата

Запрос.УстановитьПараметр("Конец", КонецПериода);

Результат = Запрос.Выполнить();

Интервалы и динамические даты

Часто требуется выбрать данные за текущий месяц, прошлый квартал или другой динамический период. Для этого в есть специальные функции:

Функция Описание Пример результата (на 15.05.2026)
НАЧАЛОДНЯ() Возвращает начало текущего дня (00:00:00) 15.05.2026 00:00:00
НАЧАЛОМЕСЯЦА() Первый день текущего месяца 01.05.2026 00:00:00
КОНЕЦМЕСЯЦА() Последний день текущего месяца (23:59:59) 31.05.2026 23:59:59
НАЧАЛОКВАРТАЛА() Первый день текущего квартала 01.04.2026 00:00:00

Пример использования в запросе:

ВЫБРАТЬ

Сумма(СуммаДокумента) КАК ИтогоЗаМесяц

ИЗ

Документ.ПоступлениеТоваров

ГДЕ

ДатаДокумента МЕЖДУ НАЧАЛОМЕСЯЦА() И КОНЕЦМЕСЯЦА()

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

ВЫБРАТЬ

...

ГДЕ

ДатаДокумента МЕЖДУ НАЧАЛОМЕСЯЦА(ДОБАВИТЬМЕСЯЦ(ТЕКУЩАЯДАТА(), -1))

И КОНЕЦМЕСЯЦА(ДОБАВИТЬМЕСЯЦ(ТЕКУЩАЯДАТА(), -1))

Как работают функции ДОБАВИТЬМЕСЯЦ() и ДОБАВИТЬДЕНЬ()?

Эти функции позволяют сдвигать дату на заданное количество периодов. Например, ДОБАВИТЬМЕСЯЦ(ТЕКУЩАЯДАТА(), -3) вернёт дату три месяца назад. Особенность: при добавлении месяцев корректно учитывается разная длительность месяцев (например, 31 января + 1 месяц = 28/29 февраля).

Форматирование дат в результатах запроса

Иногда требуется вывести дату в запросе в определённом формате — например, без времени или в текстовом виде. Для этого используют функцию ФОРМАТ():

ВЫБРАТЬ

ФОРМАТ(ДатаДокумента, "ДЛФ=DT") КАК ДатаДокумента,

ФОРМАТ(ДатаДокумента, "ДФ=dd.MM.yyyy; В=0") КАК ДатаБезВремени

ИЗ

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

Расшифровка форматов:

  • 📅 ДЛФ=DT — полный формат даты и времени (15.05.2026 14:30:00).
  • 🗓️ ДФ=dd.MM.yyyy; В=0 — только дата без времени (15.05.2026).
  • 📝 ДФ='DD MMMM YYYY' — текстовый формат (15 мая 2026 года).

Для вывода названий месяцев на русском языке используйте:

ФОРМАТ(ДатаДокумента, "ДФ='DD MMMM YYYY'") // "15 мая 2026"
💡

Функция ФОРМАТ() работает только в списке полей ВЫБРАТЬ. В условиях ГДЕ её использовать нельзя — там нужно применять стандартные функции сравнения дат.

Типичные ошибки и как их избежать

Даже опытные разработчики иногда сталкиваются с ошибками при работе с датами в запросах. Вот наиболее распространённые проблемы и их решения:

⚠️ Внимание: Если вы используете ДАТАВРЕМЯ() без указания времени, то по умолчанию будет подставлено 00:00:00. Это может привести к пропуску документов, созданных в этот день после полуночи. Например, условие ДатаДокумента = ДАТАВРЕМЯ(2026, 5, 15) не найдёт документы от 15.05.2026 09:00.

Чтобы избежать этой ошибки, используйте диапазон:

ГДЕ ДатаДокумента МЕЖДУ ДАТАВРЕМЯ(2026, 5, 15, 0, 0, 0)

И ДАТАВРЕМЯ(2026, 5, 15, 23, 59, 59)

Другие частые ошибки:

  • 🚫 Путаница с месяцами: ДАТА(2026, 13, 1) вызовет ошибку — месяцы нумеруются от 1 до 12.
  • 🚫 Несоответствие типов: сравнение даты с строкой (ГДЕ Дата = "15.05.2026") приведёт к ошибке.
  • 🚫 Использование кавычек: ДАТАВРЕМЯ("2026-05-15") — неверный синтаксис (кавычки не нужны).

Использованы правильные функции (ДАТАВРЕМЯ/ДАТА)|Параметры имеют корректный тип|Учтено время в условиях сравнения|Нет опечаток в названиях месяцев/дней-->

Оптимизация запросов с датами

Запросы с фильтрацией по датам могут работать медленно, если не оптимизированы. Вот несколько советов для ускорения:

1. Используйте индексируемые поля. Если фильтр идёт по полю ДатаДокумента, убедитесь, что оно проиндексировано в метаданных (в конфигураторе проверьте свойство Индексировать для реквизита).

2. Избегайте функций в условиях. Запрос:

ГДЕ ГОД(ДатаДокумента) = 2026

будет выполняться дольше, чем:

ГДЕ ДатаДокумента МЕЖДУ ДАТА(2026, 1, 1) И ДАТА(2026, 12, 31)

3. Для больших периодов используйте виртуальные таблицы. Например, вместо выборки всех документов за год лучше использовать виртуальную таблицу Документ.РеализацияТоваровУслуг.СрезПоследних с указанием границ периода.

⚠️ Внимание: При работе с виртуальными таблицами СрезПоследних или Обороты всегда явно указывайте период в параметрах. Неполные данные могут привести к некорректным расчётам в отчётах.

Практические примеры запросов с датами

Рассмотрим несколько реальных сценариев, где правильное указание дат критично.

Пример 1: Выборка документов за текущую неделю

ВЫБРАТЬ

Номер,

ДатаДокумента,

СуммаДокумента

ИЗ

Документ.ПоступлениеТоваров

ГДЕ

ДатаДокумента МЕЖДУ НАЧАЛОНЕДЕЛИ(ТЕКУЩАЯДАТА()) И КОНЕЦНЕДЕЛИ(ТЕКУЩАЯДАТА())

Пример 2: Сравнение с датой из другого поля

ВЫБРАТЬ

Клиент.Наименование,

МАКСИМУМ(ДатаДокумента) КАК ПоследняяПокупка

ИЗ

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Клиент

ПО Документ.Контрагент = Клиент.Ссылка

ГДЕ

ДатаДокумента > ДОБАВИТЬМЕСЯЦ(ТЕКУЩАЯДАТА(), -6) // За последние 6 месяцев

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

Клиент.Наименование

Пример 3: Использование параметров для динамического периода

ВЫБРАТЬ

Номенклатура.Наименование КАК Товар,

СУММА(Количество) КАК Количество

ИЗ

Документ.ОтгрузкаТоваров.Товары КАК Товары

ГДЕ

Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

Номенклатура.Наименование

Важно: При передаче параметров дат из формы всегда преобразуйте их в тип Дата явно, даже если источник — поле ввода с календарём. Это предотвратит ошибки при неявном приведении типов.

FAQ: Частые вопросы по датам в запросах 1С

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

Используйте функции НАЧАЛОМЕСЯЦА() и КОНЕЦМЕСЯЦА(). Например:

ВЫБРАТЬ

НАЧАЛОМЕСЯЦА(ТЕКУЩАЯДАТА()) КАК ПервыйДень,

КОНЕЦМЕСЯЦА(ТЕКУЩАЯДАТА()) КАК ПоследнийДень

Можно ли в запросе использовать строковые даты (например, "15.05.2026")?

Нет, это приведёт к ошибке. В языке запросов даты должны быть указаны только через функции ДАТА() или ДАТАВРЕМЯ(), либо передаваться как параметры типа Дата.

Как выбрать документы за вчера?

Используйте функцию ДОБАВИТЬДЕНЬ():

ГДЕ ДатаДокумента = ДОБАВИТЬДЕНЬ(ТЕКУЩАЯДАТА(), -1)

Или с учётом времени:

ГДЕ ДатаДокумента МЕЖДУ НАЧАЛОДНЯ(ДОБАВИТЬДЕНЬ(ТЕКУЩАЯДАТА(), -1))

И КОНЕЦДНЯ(ДОБАВИТЬДЕНЬ(ТЕКУЩАЯДАТА(), -1))

Почему запрос не находит документы за сегодня, если я использую ДАТАВРЕМЯ(Год, Месяц, День)?

Скорее всего, вы не учли время. Функция ДАТАВРЕМЯ() без указания времени подставляет 00:00:00, поэтому документы, созданные позже полуночи, не попадут в выборку. Используйте диапазон:

ГДЕ ДатаДокумента МЕЖДУ ДАТАВРЕМЯ(2026, 5, 15)

И ДАТАВРЕМЯ(2026, 5, 15, 23, 59, 59)

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

Используйте функцию РАЗНОСТЬДАТ():

ВЫБРАТЬ

РАЗНОСТЬДАТ(День, ДатаОплаты, ДатаДокумента) КАК ДнейМеждуОплатойИДокументом