Работа с датами в запросах 1С — одна из самых частых задач при разработке отчётов, обработок и интеграций. Неправильно указанный формат может привести к ошибкам выполнения, некорректной фильтрации данных или даже падению системы. Эта статья поможет разобраться, как грамотно оформлять даты в различных сценариях: от простых условий ГДЕ до сложных конструкций с параметрами и динамическими интервалами.
Особенность языка запросов 1С:Предприятие заключается в том, что он использует собственный синтаксис для работы с датами, отличный от SQL-стандартов. Здесь нет кавычек или функций вроде TO_DATE() — вместо этого применяются специальные литералы и функции платформы. Мы рассмотрим все актуальные способы записи дат, включая нюансы для разных версий платформы (8.3.20+), а также типичные ошибки, которые допускают даже опытные разработчики.
Важно понимать, что формат даты в запросе зависит не только от синтаксиса, но и от контекста использования: это может быть статическое значение, параметр запроса, результат вычисления или данные из виртуальной таблицы. Каждый случай требует своего подхода — и именно этим мы займёмся далее.
Базовый синтаксис дат в запросах 1С
Самый простой способ указать дату в запросе — использовать литерал даты, который в 1С записывается в квадратных скобках с ключевым словом ДАТАВРЕМЯ или ДАТА. Примеры:
ВЫБРАТЬ
ДатаДокумента КАК Период
ИЗ
Документ.ПоступлениеТоваров
ГДЕ
ДатаДокумента = ДАТАВРЕМЯ(2026, 05, 15)
Ключевые правила:
- 📅 ДАТАВРЕМЯ() — указывает дату и время (по умолчанию время
00:00:00). Аргументы: год, месяц, день, часы, минуты, секунды. - 🗓️ ДАТА() — только дата без времени. Аналогичен
ДАТАВРЕМЯ(год, месяц, день, 0, 0, 0). - ⏰ ВРЕМЯ() — только время (редко используется в фильтрах по датам).
Обратите внимание: месяцы в функциях указываются числами от 1 до 12, а не названиями. Например, ДАТА(2026, 5, 15) — это 15 мая 2026 года, а не 5-е число 12-го месяца!
Работа с параметрами дат
В реальных задачах даты редко бывают статичными. Чаще всего они передаются в запрос через параметры, что делает отчёты и обработки гибкими. Например, чтобы фильтровать документы за выбранный пользователем период, используют конструкцию:
ВЫБРАТЬ
Номенклатура.Наименование,
СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Здесь &НачалоПериода и &КонецПериода — это параметры, которые передаются в запрос из кода 1С. Важно помнить:
- 🔹 Параметры в запросе всегда начинаются с
&. - 📌 Тип параметра должен соответствовать типу поля в базе (для дат —
Тип("Дата")). - ⚠️ Если параметр не задан, запрос завершится ошибкой "Неопределённое значение параметра".
Чтобы избежать ошибок с пустыми параметрами, всегда проверяйте их заполненность перед выполнением запроса: ЕСТЬ NULL(&НачалоПериода, ДАТА(1,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))И КОНЕЦДНЯ(ДОБАВИТЬДЕНЬ(ТЕКУЩАЯДАТА(), -1))
Почему запрос не находит документы за сегодня, если я использую ДАТАВРЕМЯ(Год, Месяц, День)?
Скорее всего, вы не учли время. Функция
ДАТАВРЕМЯ()без указания времени подставляет00:00:00, поэтому документы, созданные позже полуночи, не попадут в выборку. Используйте диапазон:ГДЕ ДатаДокумента МЕЖДУ ДАТАВРЕМЯ(2026, 5, 15)И ДАТАВРЕМЯ(2026, 5, 15, 23, 59, 59)
Как в запросе получить разницу между двумя датами в днях?
Используйте функцию
РАЗНОСТЬДАТ():ВЫБРАТЬРАЗНОСТЬДАТ(День, ДатаОплаты, ДатаДокумента) КАК ДнейМеждуОплатойИДокументом