Работа с периодами в конструкторе запросов 1С — одна из самых востребованных задач при формировании отчетов, аналитических выборок и обработке документов. Неправильно указанный интервал может привести к искажению данных, пропуску важных записей или, наоборот, избыточной выдаче. Эта статья поможет разобраться, как грамотно задавать временные рамки — от простых статических дат до динамических интервалов с использованием параметров и функций платформы.
Мы рассмотрим не только базовые приемы ввода дат через графический интерфейс конструктора, но и продвинутые техники: работу с началом/концом периода, использование виртуальных таблиц, особенности учета рабочих дней и даже нюансы работы с временными зонами. Особое внимание уделим типичным ошибкам, которые допускают даже опытные пользователи при указании периодов в сложных запросах.
Статья будет полезна как бухгалтерам, которые самостоятельно формируют отчеты в 1С:Бухгалтерии или 1С:ЗУП, так и программистам, пишущим запросы в конфигураторе. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3, но majority принципов применимы и к более ранним редакциям.
1. Основные способы указания периода в конструкторе запросов
Конструктор запросов 1С предлагает несколько способов задания временных интервалов — от ручного ввода до использования встроенных функций. Выбор метода зависит от задачи: нужна ли вам фиксированная дата, динамический период (например, "текущий месяц") или сложный интервал с учетом рабочих дней.
Самые распространенные варианты:
- 📅 Статические даты — фиксированные значения в формате
ДД.ММ.ГГГГ, которые прописываются напрямую в условии отбора. Подходит для разовых отчетов с четкими временными рамками. - 🔄 Динамические периоды — использование функций вроде
НачалоДня(),КонецМесяца()или параметров запроса. Актуально для регулярных отчетов, где даты меняются. - 📊 Виртуальные таблицы — автоматические периоды, заданные в свойствах таблиц (например,
ОстаткиИОбороты.Остаткис параметромПериод). Упрощают работу с регистрами накопления. - ⚙️ Параметры запроса — когда период передается извне (например, из формы отчета). Гибкий способ для интерактивных решений.
На практике чаще всего комбинируют несколько подходов. Например, в отчете по продажам можно зафиксировать начало периода как 1 января текущего года, а конец сделать динамическим — текущая дата. Это позволит анализировать данные "с начала года по сегодня".
2. Работа с фиксированными датами: синтаксис и примеры
Фиксированные даты — самый простой способ ограничить выборку по времени. В конструкторе запросов их можно указать:
- 📝 Через графический интерфейс — в поле "Период" или "Условие" выбрать оператор (
=,>,<) и ввести дату в форматеДД.ММ.ГГГГ. - 💻 В текстовом режиме — напрямую прописать условие вида
Дата >= '01.01.2026'.
Примеры корректного синтаксиса для разных сценариев:
// Выборка документов за конкретный день
ГДЕ Дата = '15.05.2026'
// Диапазон дат (включительно)
ГДЕ Дата МЕЖДУ '01.01.2026' И '31.01.2026'
// Все документы ДО определенной даты (не включая её)
ГДЕ Дата < '01.02.2026'
// Документы старше 30 дней от текущей даты
ГДЕ Дата < ТекущаяДата() - 30
Важный нюанс: при ручном вводе дат через интерфейс конструктора 1С автоматически добавляет функцию НачалоДня(). Это означает, что условие Дата = '15.05.2026' на самом деле преобразуется в:
ГДЕ Дата = НачалоДня('15.05.2026')
Если вам нужно учитывать время (например, для документов с точностью до секунды), это условие не подойдет — придется писать запрос вручную.
Чтобы быстро вставить текущую дату в конструкторе, нажмите Ctrl+; (точка с запятой) — система подставит сегодняшнее число в формате ДД.ММ.ГГГГ.
3. Динамические периоды: функции платформы 1С
Для регулярных отчетов (ежемесячных, еженедельных) удобнее использовать динамические периоды, которые автоматически подстраиваются под текущую дату. Платформа 1С:Предприятие предоставляет набор встроенных функций для работы с временными интервалами:
| Функция | Описание | Пример использования |
|---|---|---|
ТекущаяДата() |
Возвращает текущую дату (без времени) | ГДЕ Дата = ТекущаяДата() |
НачалоДня() |
Обнуляет время (00:00:00) | ГДЕ Дата >= НачалоДня(ТекущаяДата()) |
КонецДня() |
Устанавливает время в 23:59:59 | ГДЕ Дата <= КонецДня(ТекущаяДата()) |
НачалоМесяца() |
Первый день текущего месяца | ГДЕ Дата >= НачалоМесяца(ТекущаяДата()) |
ДобавитьМесяц() |
Сдвигает дату на заданное количество месяцев | ГДЕ Дата >= НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), -1)) (предыдущий месяц) |
Комбинация этих функций позволяет гибко настраивать периоды. Например, чтобы получить данные за последние 7 рабочих дней (исключая выходные), можно использовать такой запрос:
ГДЕ Дата >= РабочиеДни.НайтиДата(
ТекущаяДата() - 7,
Ложь,
Календарь.РабочийКалендарьОрганизации()
)
И Дата <= ТекущаяДата()
Важно: функции вроде РабочиеДни.НайтиДата() требуют подключения соответствующих объектов метаданных (например, справочника Календари). Без них запрос выдаст ошибку.
Как учесть праздничные дни в запросе?
Для корректного расчета рабочих дней необходимо:
1. В конфигураторе проверить наличие справочника Календари и объекта РабочиеДни.
2. В запросе указать конкретный календарь (обычно это Календарь.РабочийКалендарьОрганизации()).
3. Использовать методы РабочиеДни.НайтиДата() или РабочиеДни.КоличествоРабочихДней() с учетом региональных особенностей.
Если в вашей конфигурации нет стандартного календаря, его можно создать вручную или доработать типовой механизм.
4. Использование параметров для гибких периодов
Параметры запроса позволяют передавать периоды извне — например, из формы отчета или обработки. Это удобно, когда один и тот же запрос нужно запускать с разными временными рамками без правки кода. Чтобы добавить параметр:
- В конструкторе запросов перейдите на закладку
Параметры. - Создайте новый параметр с типом
Дата. - В условии отбора ссылайтесь на параметр по имени, например:
ГДЕ Дата МЕЖДУ &НачалоПериода И &КонецПериода.
Пример запроса с параметрами для отчета по продажам:
ВЫБРАТЬ
Документ.Контрагент КАК Контрагент,
СУММА(Документ.СуммаДокумента) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Документ.Контрагент
Преимущества такого подхода:
- 🔄 Многоразовость — один запрос используется для разных периодов.
- 📅 Интерактивность — пользователь может выбирать даты в календаре формы.
- ⚡ Производительность — параметры оптимизируются сервером 1С лучше, чем динамически формируемый SQL.
⚠️ Внимание: При передаче параметров дат из формы убедитесь, что значения не пустые. Иначе запрос вернет ошибку"Неопределено". Всегда добавляйте проверку:ЕСЛИ &НачалоПериода = Неопределено ТОГДА&НачалоПериода = НачалоМесяца(ТекущаяДата());
КОНЕЦЕСЛИ;
5. Работа с виртуальными таблицами и регистрами
Виртуальные таблицы (например, ОстаткиИОбороты, Обороты) часто требуют указания периода в своих параметрах. Это отличается от обычных условий отбора в секции ГДЕ. Рассмотрим ключевые моменты:
Для виртуальной таблицы РегистрНакопления.ОстаткиИОбороты период задается так:
ВЫБРАТЬ
ОстаткиИОбороты.Номенклатура КАК Номенклатура,
ОстаткиИОбороты.КоличествоОстаток КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
&Период,
,
Номенклатура В (&СписокНоменклатуры)
) КАК ОстаткиИОбороты
Особенности работы с виртуальными таблицами:
- 📌 Период обязателен — без него таблица не вернет данных.
- 🔍 Точность до секунды — если указать
НачалоДня(), в выборку попадут движения строго с этой даты. - 📊 Многопериодность — некоторые таблицы (например,
Обороты) позволяют передавать массив дат.
Типичная ошибка — передача в виртуальную таблицу некорректного типа данных. Например, если параметр &Период объявлен как строка, а не дата, запрос завершится с ошибкой. Всегда проверяйте типы!
Параметр периода объявлен с типом Дата
В виртуальной таблице указан корректный регистр (например, РегистрНакопления.ТоварыНаСкладах)
Период не равен Неопределено или пустой дате
При необходимости добавлены дополнительные отборы (по организациям, складам и т.п.)
-->
6. Типичные ошибки и как их избежать
Даже опытные пользователи 1С иногда допускают ошибки при работе с периодами. Вот самые распространенные ловушки и способы их обхода:
| Ошибка | Причина | Решение |
|---|---|---|
| Запрос возвращает пустой результат | Неверный формат даты (например, '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С индексы автоматически создаются для полей с типом
Датав регистрах). - Для аналитических задач применяйте виртуальные таблицы вместо ручных соединений.
- Разбивайте сложные запросы на несколько простых с промежуточными результатами.
Если запрос все равно тормозит, проверьте его план выполнения через ОбъяснитьЗапрос().