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