Как в отчете СКД реализовать выбор между периодом и конкретным документом?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1. Использование расширения языка запросов (Фигурные скобки)

Это наиболее профессиональный и эффективный способ реализации необязательных условий в 1С. Рассмотрим, как работает механизм фигурных скобок {}. Когда мы помещаем условие в такие скобки, мы говорим системе компоновки данных: «Если этот параметр или поле отбора заполнены пользователем — включи это условие в итоговый SQL-запрос, если нет — просто игнорируй этот кусок кода».

Проанализируем пример правильного построения запроса в схеме компоновки:


ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка КАК ДокРеализации,
    РеализацияТоваровУслуг.Контрагент КАК Контрагент
ПОМЕСТИТЬ ВТ_Реализации
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
    РеализацияТоваровУслуг.Проведен
    {ГДЕ
    (РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон),
    (РеализацияТоваровУслуг.Ссылка = &ДокументРеализации)}

Разберем по шагам, что здесь происходит:

  1. Условие РеализацияТоваровУслуг.Проведен стоит вне скобок. Это означает, что оно будет применяться всегда.
  2. Условия внутри {ГДЕ ...} разделены запятыми. Это позволяет СКД анализировать каждое из них независимо.
  3. Если пользователь заполнит только &ДатаНач и &ДатаКон, СКД сформирует запрос только с условием по дате.
  4. Если же будет выбран &ДокументРеализации, система добавит фильтр по ссылке.

Важный нюанс: Если вы тестируете такой запрос в обычной «Консоли запросов», он может работать некорректно или выдавать ошибку, так как обычные консоли часто не умеют обрабатывать расширение языка запросов СКД. Проверку нужно проводить либо непосредственно в отчете, либо в специализированной «Консоли системы компоновки данных».

Метод 2. Универсальное логическое условие (для сложных случаев)

Иногда требуется более сложная логика, которую трудно описать только фигурными скобками. В таких случаях можно использовать прием с проверкой на «пустое значение» или специальный вспомогательный параметр-флаг. Рассмотрим ситуацию, когда нам нужно явно указать системе, какое условие приоритетнее.

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


ГДЕ
    РеализацияТоваровУслуг.Проведен
    И (&ИспользоватьПериод = ЛОЖЬ ИЛИ РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон)
    И (&ДокументРеализации = ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка) ИЛИ РеализацияТоваровУслуг.Ссылка = &ДокументРеализации)

В этом примере:

Однако стоит помнить о производительности. При использовании конструкций ИЛИ в секции ГДЕ, СУБД (например, MS SQL Server) может построить неоптимальный план выполнения запроса, что приведет к замедлению работы на больших объемах данных. Поэтому Метод 1 с фигурными скобками является предпочтительным.

Метод 3. Использование стандартных отборов СКД

Зачастую разработчики перегружают текст запроса лишними параметрами, хотя СКД предоставляет мощный механизм отборов «из коробки». Посмотрим на ситуацию с другой стороны: что если вообще не писать условия ГДЕ по дате и ссылке в запросе?

  1. В тексте запроса оставляем только базовую выборку и обязательные фильтры (например, Проведен = ИСТИНА).
  2. На вкладке «Настройки» компоновки данных переходим в раздел «Отбор».
  3. Добавляем поля Дата и Ссылка в доступные поля отбора.
  4. Выносим эти отборы в пользовательские настройки (включаем «звездочку»).

В этом случае СКД сама динамически модифицирует текст запроса, добавляя условия в секцию ГДЕ только для тех полей, которые пользователь реально выбрал в интерфейсе. Это наиболее «чистый» способ с точки зрения архитектуры 1С.

Метод 4. Настройка выражений в параметрах

Если ваша задача — сделать так, чтобы при выборе документа период автоматически игнорировался (даже если он заполнен), можно воспользоваться вкладкой «Параметры» в конструкторе СКД. Для параметров &ДатаНач и &ДатаКон можно прописать выражения.

Например, для параметра &ДатаНач выражение может выглядеть так:

ВЫБОР КОГДА &ДокументРеализации = ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка) ТОГДА &ДатаНач ИНАЧЕ ДАТАВРЕМЯ(1,1,1) КОНЕЦ

Такой подход позволяет программно управлять значениями параметров до того, как они попадут в запрос, обеспечивая жесткий приоритет одного фильтра над другим. Мы как бы «зануляем» дату, если выбран конкретный документ, что исключает конфликт условий.

Резюме и рекомендации

Проанализировав все способы, можно сделать следующие выводы:

Используя эти методы, мы можем создавать удобные и быстрые отчеты, которые подстраиваются под текущие нужды пользователя, будь то анализ данных за год или детальная проверка одного конкретного документа реализации.

← На главную