При разработке отчетов на системе компоновки данных (СКД) часто возникает задача предоставить пользователю гибкость в выборе данных. Типичный сценарий: отчет должен формироваться либо за определенный период (по дате документов), либо по конкретному выбранному документу. Если просто прописать все условия в секции ГДЕ через оператор И, то отчет потребует заполнения всех параметров одновременно, что не всегда удобно или логично. В этой статье мы подробно разберем, как правильно настроить запрос и параметры СКД для реализации такого выбора.
Это наиболее профессиональный и эффективный способ реализации необязательных условий в 1С. Рассмотрим, как работает механизм фигурных скобок {}. Когда мы помещаем условие в такие скобки, мы говорим системе компоновки данных: «Если этот параметр или поле отбора заполнены пользователем — включи это условие в итоговый SQL-запрос, если нет — просто игнорируй этот кусок кода».
Проанализируем пример правильного построения запроса в схеме компоновки:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК ДокРеализации,
РеализацияТоваровУслуг.Контрагент КАК Контрагент
ПОМЕСТИТЬ ВТ_Реализации
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Проведен
{ГДЕ
(РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон),
(РеализацияТоваровУслуг.Ссылка = &ДокументРеализации)}
Разберем по шагам, что здесь происходит:
РеализацияТоваровУслуг.Проведен стоит вне скобок. Это означает, что оно будет применяться всегда.{ГДЕ ...} разделены запятыми. Это позволяет СКД анализировать каждое из них независимо.&ДатаНач и &ДатаКон, СКД сформирует запрос только с условием по дате.&ДокументРеализации, система добавит фильтр по ссылке.Важный нюанс: Если вы тестируете такой запрос в обычной «Консоли запросов», он может работать некорректно или выдавать ошибку, так как обычные консоли часто не умеют обрабатывать расширение языка запросов СКД. Проверку нужно проводить либо непосредственно в отчете, либо в специализированной «Консоли системы компоновки данных».
Иногда требуется более сложная логика, которую трудно описать только фигурными скобками. В таких случаях можно использовать прием с проверкой на «пустое значение» или специальный вспомогательный параметр-флаг. Рассмотрим ситуацию, когда нам нужно явно указать системе, какое условие приоритетнее.
Выясним, как составить условие, которое будет игнорироваться при незаполненном параметре:
ГДЕ
РеализацияТоваровУслуг.Проведен
И (&ИспользоватьПериод = ЛОЖЬ ИЛИ РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон)
И (&ДокументРеализации = ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка) ИЛИ РеализацияТоваровУслуг.Ссылка = &ДокументРеализации)
В этом примере:
&ИспользоватьПериод установлен в Ложь, первая часть условия всегда будет истинной, и фильтр по дате не применится.&ДокументРеализации не выбран (равен пустой ссылке), вторая часть условия также станет всегда истинной.Однако стоит помнить о производительности. При использовании конструкций ИЛИ в секции ГДЕ, СУБД (например, MS SQL Server) может построить неоптимальный план выполнения запроса, что приведет к замедлению работы на больших объемах данных. Поэтому Метод 1 с фигурными скобками является предпочтительным.
Зачастую разработчики перегружают текст запроса лишними параметрами, хотя СКД предоставляет мощный механизм отборов «из коробки». Посмотрим на ситуацию с другой стороны: что если вообще не писать условия ГДЕ по дате и ссылке в запросе?
Проведен = ИСТИНА).Дата и Ссылка в доступные поля отбора.В этом случае СКД сама динамически модифицирует текст запроса, добавляя условия в секцию ГДЕ только для тех полей, которые пользователь реально выбрал в интерфейсе. Это наиболее «чистый» способ с точки зрения архитектуры 1С.
Если ваша задача — сделать так, чтобы при выборе документа период автоматически игнорировался (даже если он заполнен), можно воспользоваться вкладкой «Параметры» в конструкторе СКД. Для параметров &ДатаНач и &ДатаКон можно прописать выражения.
Например, для параметра &ДатаНач выражение может выглядеть так:
ВЫБОР КОГДА &ДокументРеализации = ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка) ТОГДА &ДатаНач ИНАЧЕ ДАТАВРЕМЯ(1,1,1) КОНЕЦ
Такой подход позволяет программно управлять значениями параметров до того, как они попадут в запрос, обеспечивая жесткий приоритет одного фильтра над другим. Мы как бы «зануляем» дату, если выбран конкретный документ, что исключает конфликт условий.
Проанализировав все способы, можно сделать следующие выводы:
{ГДЕ ...}. Это обеспечивает и гибкость, и высокую производительность запроса.Используя эти методы, мы можем создавать удобные и быстрые отчеты, которые подстраиваются под текущие нужды пользователя, будь то анализ данных за год или детальная проверка одного конкретного документа реализации.