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

Мы рассмотрим не только базовые приемы ввода дат через графический интерфейс конструктора, но и продвинутые техники: работу с началом/концом периода, использование виртуальных таблиц, особенности учета рабочих дней и даже нюансы работы с временными зонами. Особое внимание уделим типичным ошибкам, которые допускают даже опытные пользователи при указании периодов в сложных запросах.

Статья будет полезна как бухгалтерам, которые самостоятельно формируют отчеты в 1С:Бухгалтерии или 1С:ЗУП, так и программистам, пишущим запросы в конфигураторе. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3, но majority принципов применимы и к более ранним редакциям.

1. Основные способы указания периода в конструкторе запросов

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

Самые распространенные варианты:

  • 📅 Статические даты — фиксированные значения в формате ДД.ММ.ГГГГ, которые прописываются напрямую в условии отбора. Подходит для разовых отчетов с четкими временными рамками.
  • 🔄 Динамические периоды — использование функций вроде НачалоДня(), КонецМесяца() или параметров запроса. Актуально для регулярных отчетов, где даты меняются.
  • 📊 Виртуальные таблицы — автоматические периоды, заданные в свойствах таблиц (например, ОстаткиИОбороты.Остатки с параметром Период). Упрощают работу с регистрами накопления.
  • ⚙️ Параметры запроса — когда период передается извне (например, из формы отчета). Гибкий способ для интерактивных решений.

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

📊 Какой способ указания периода вы используете чаще?
Статические даты
Динамические функции (НачалоМесяца и т.п.)
Параметры запроса
Виртуальные таблицы

2. Работа с фиксированными датами: синтаксис и примеры

Фиксированные даты — самый простой способ ограничить выборку по времени. В конструкторе запросов их можно указать:

  • 📝 Через графический интерфейс — в поле "Период" или "Условие" выбрать оператор (=, >, <) и ввести дату в формате ДД.ММ.ГГГГ.
  • 💻 В текстовом режиме — напрямую прописать условие вида Дата >= '01.01.2026'.

Примеры корректного синтаксиса для разных сценариев:


// Выборка документов за конкретный день

ГДЕ Дата = '15.05.2026'

// Диапазон дат (включительно)

ГДЕ Дата МЕЖДУ '01.01.2026' И '31.01.2026'

// Все документы ДО определенной даты (не включая её)

ГДЕ Дата < '01.02.2026'

// Документы старше 30 дней от текущей даты

ГДЕ Дата < ТекущаяДата() - 30

Важный нюанс: при ручном вводе дат через интерфейс конструктора автоматически добавляет функцию НачалоДня(). Это означает, что условие Дата = '15.05.2026' на самом деле преобразуется в:

ГДЕ Дата = НачалоДня('15.05.2026')

Если вам нужно учитывать время (например, для документов с точностью до секунды), это условие не подойдет — придется писать запрос вручную.

💡

Чтобы быстро вставить текущую дату в конструкторе, нажмите Ctrl+; (точка с запятой) — система подставит сегодняшнее число в формате ДД.ММ.ГГГГ.

3. Динамические периоды: функции платформы 1С

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

Функция Описание Пример использования
ТекущаяДата() Возвращает текущую дату (без времени) ГДЕ Дата = ТекущаяДата()
НачалоДня() Обнуляет время (00:00:00) ГДЕ Дата >= НачалоДня(ТекущаяДата())
КонецДня() Устанавливает время в 23:59:59 ГДЕ Дата <= КонецДня(ТекущаяДата())
НачалоМесяца() Первый день текущего месяца ГДЕ Дата >= НачалоМесяца(ТекущаяДата())
ДобавитьМесяц() Сдвигает дату на заданное количество месяцев ГДЕ Дата >= НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), -1)) (предыдущий месяц)

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

ГДЕ Дата >= РабочиеДни.НайтиДата(

ТекущаяДата() - 7,

Ложь,

Календарь.РабочийКалендарьОрганизации()

)

И Дата <= ТекущаяДата()

Важно: функции вроде РабочиеДни.НайтиДата() требуют подключения соответствующих объектов метаданных (например, справочника Календари). Без них запрос выдаст ошибку.

Как учесть праздничные дни в запросе?

Для корректного расчета рабочих дней необходимо:

1. В конфигураторе проверить наличие справочника Календари и объекта РабочиеДни.

2. В запросе указать конкретный календарь (обычно это Календарь.РабочийКалендарьОрганизации()).

3. Использовать методы РабочиеДни.НайтиДата() или РабочиеДни.КоличествоРабочихДней() с учетом региональных особенностей.

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

4. Использование параметров для гибких периодов

Параметры запроса позволяют передавать периоды извне — например, из формы отчета или обработки. Это удобно, когда один и тот же запрос нужно запускать с разными временными рамками без правки кода. Чтобы добавить параметр:

  1. В конструкторе запросов перейдите на закладку Параметры.
  2. Создайте новый параметр с типом Дата.
  3. В условии отбора ссылайтесь на параметр по имени, например: ГДЕ Дата МЕЖДУ &НачалоПериода И &КонецПериода.

Пример запроса с параметрами для отчета по продажам:

ВЫБРАТЬ

Документ.Контрагент КАК Контрагент,

СУММА(Документ.СуммаДокумента) КАК Сумма

ИЗ

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

ГДЕ

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

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

Документ.Контрагент

Преимущества такого подхода:

  • 🔄 Многоразовость — один запрос используется для разных периодов.
  • 📅 Интерактивность — пользователь может выбирать даты в календаре формы.
  • Производительность — параметры оптимизируются сервером лучше, чем динамически формируемый SQL.
⚠️ Внимание: При передаче параметров дат из формы убедитесь, что значения не пустые. Иначе запрос вернет ошибку "Неопределено". Всегда добавляйте проверку:
ЕСЛИ &НачалоПериода = Неопределено ТОГДА

&НачалоПериода = НачалоМесяца(ТекущаяДата());

КОНЕЦЕСЛИ;

5. Работа с виртуальными таблицами и регистрами

Виртуальные таблицы (например, ОстаткиИОбороты, Обороты) часто требуют указания периода в своих параметрах. Это отличается от обычных условий отбора в секции ГДЕ. Рассмотрим ключевые моменты:

Для виртуальной таблицы РегистрНакопления.ОстаткиИОбороты период задается так:

ВЫБРАТЬ

ОстаткиИОбороты.Номенклатура КАК Номенклатура,

ОстаткиИОбороты.КоличествоОстаток КАК Остаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(

&Период,

,

Номенклатура В (&СписокНоменклатуры)

) КАК ОстаткиИОбороты

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

  • 📌 Период обязателен — без него таблица не вернет данных.
  • 🔍 Точность до секунды — если указать НачалоДня(), в выборку попадут движения строго с этой даты.
  • 📊 Многопериодность — некоторые таблицы (например, Обороты) позволяют передавать массив дат.

Типичная ошибка — передача в виртуальную таблицу некорректного типа данных. Например, если параметр &Период объявлен как строка, а не дата, запрос завершится с ошибкой. Всегда проверяйте типы!

Параметр периода объявлен с типом Дата

В виртуальной таблице указан корректный регистр (например, РегистрНакопления.ТоварыНаСкладах)

Период не равен Неопределено или пустой дате

При необходимости добавлены дополнительные отборы (по организациям, складам и т.п.)

-->

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

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

Ошибка Причина Решение
Запрос возвращает пустой результат Неверный формат даты (например, '2026-05-15' вместо '15.05.2026') Использовать формат ДД.ММ.ГГГГ или функции вроде Дата(2026, 5, 15)
Исключены граничные даты Условие Дата > '01.01.2026' вместо Дата >= '01.01.2026' Внимательно проверять операторы сравнения
Ошибка "Тип не совпадает" Сравнение даты со строкой (например, Дата = "15.05.2026") Всегда использовать кавычки ' ' для дат или функции Дата()
Медленное выполнение запроса Слишком широкий период или отсутствие индексов Ограничивать период и проверять план выполнения запроса

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

ГДЕ Дата >= НачалоДня(ТекущаяДатаСеанса())

Функция ТекущаяДатаСеанса() возвращает дату с учетом временной зоны пользователя.

⚠️ Внимание: При работе с распределенными информационными базами (РИБ) или облачными сервисами 1С:Fresh учтите, что даты могут синхронизироваться с задержкой. Для критических отчетов всегда сверяйтесь с логами репликации.

7. Продвинутые техники: сложные периоды и аналитика

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

1. Сравнение периодов ("этот месяц vs прошлый месяц")

Используйте конструкцию с ОБЪЕДИНИТЬ или подзапросы:

ВЫБРАТЬ

"Текущий месяц" КАК Период,

СУММА(Сумма) КАК Сумма

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

ГДЕ Дата МЕЖДУ НачалоМесяца(ТекущаяДата()) И ТекущаяДата()

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

"Прошлый месяц" КАК Период,

СУММА(Сумма) КАК Сумма

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

ГДЕ Дата МЕЖДУ НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), -1))

И КонецМесяца(ДобавитьМесяц(ТекущаяДата(), -1))

2. Скользящие интервалы ("последние 30 дней на каждую дату")

Для таких задач подойдет оконная функция ВЫРАЗИТЬ:

ВЫБРАТЬ

Дата,

СУММА(Сумма) КАК СуммаЗаДень,

ВЫРАЗИТЬ(СУММА(Сумма) ПЕРЕД (Дата МЕЖДУ Дата - 30 И Дата)) КАК СуммаЗа30Дней

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

ГРУППИРОВАТЬ ПО Дата

3. Периоды с учетом рабочего времени

Если нужно учитывать только рабочие часы (например, с 9:00 до 18:00), комбинируйте проверку даты и времени:

ГДЕ (Дата >= НачалоДня(ТекущаяДата()) + 9*3600)

И (Дата <= НачалоДня(ТекущаяДата()) + 18*3600)

Для сложной аналитики также полезно использовать временные ряды. В 1С:Предприятие 8.3.20+ появилась поддержка генерации последовательностей дат прямо в запросе:

ВЫБРАТЬ

Календарь.ДниПериода(&Начало, &Конец) КАК Дата

💡

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

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

Как указать период "с начала года по сегодня"?

Используйте комбинацию функций НачалоГода() и ТекущаяДата():

ГДЕ Дата МЕЖДУ НачалоГода(ТекущаяДата()) И ТекущаяДата()

Если нужно включить сегодняшний день полностью (до 23:59:59), замените ТекущаяДата() на КонецДня(ТекущаяДата()).

Почему запрос игнорирует мое условие по дате?

Чаще всего это происходит из-за:

  • Неправильного формата даты (например, "15.05.2026" вместо '15.05.2026').
  • Отсутствия функции НачалоДня() при сравнении с датой без времени.
  • Ошибок в логике (например, Дата > '31.01.2026' И Дата < '01.01.2026' — такое условие всегда ложно).

Проверьте запрос в текстовом режиме конструктора — там видны все подставленные значения.

Как передать период из формы в запрос?

Объявите параметры в запросе (например, &Начало и &Конец типа Дата), а в форме свяжите их с элементами управления ПолеКалендаря:

// В модуле формы

Процедура СформироватьОтчет(Команда)

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

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

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

КонецПроцедуры

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

Да, для этого используйте:

  • Подзапросы — когда нужно получить агрегированные данные за каждый период отдельно.
  • Оконные функции (например, ВЫРАЗИТЬ) — для расчета скользящих средних или сравнения с предыдущим периодом.
  • Конструкцию ОБЪЕДИНИТЬ — чтобы собрать данные из нескольких временных срезов в одну таблицу.

Пример сравнения текущего и прошлого месяца смотрите в разделе "Продвинутые техники".

Как оптимизировать запрос с большим периодом?

Для ускорения работы:

  1. Сужайте период до минимально необходимого (например, вместо "за все время" берите "за последний год").
  2. Используйте индексированные поля в условиях (в индексы автоматически создаются для полей с типом Дата в регистрах).
  3. Для аналитических задач применяйте виртуальные таблицы вместо ручных соединений.
  4. Разбивайте сложные запросы на несколько простых с промежуточными результатами.

Если запрос все равно тормозит, проверьте его план выполнения через ОбъяснитьЗапрос().