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