Как настроить необязательные параметры виртуальной таблицы в СКД, чтобы отчет не выдавал ошибку?

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

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

Разберем по шагам, почему возникает эта ошибка, как устроен синтаксис расширения языка запросов СКД и как правильно реализовать независимую фильтрацию данных.

Выясним причину возникновения ошибки

Проанализируем ситуацию, которая происходит в запросе. Когда в окне редактирования параметров виртуальной таблицы или на вкладке Компоновка данных прописывается выражение вида:

Организация = &Организация И Проект = &Проект

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

Попытка написать конструкцию вида {Организация = &Организация} И {Проект = &Проект} непосредственно в параметрах виртуальной таблицы также приводит к синтаксической ошибке, поскольку логические связки между необязательными элементами расширения СКД описываются по специальным правилам.

Способ 1. Синтаксис расширения СКД с разделением условий через запятую

Рассмотрим правильный синтаксис расширения языка запросов для параметров виртуальной таблицы. Чтобы система компоновки данных обрабатывала каждое условие независимо, их необходимо поместить в общие фигурные скобки и разделить запятой. При этом каждое логическое выражение рекомендуется заключать в круглые скобки:

{(Организация = &Организация), (Проект = &Проект)}

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

{(Организация В (&Организация)), (Проект В (&Проект))}

Посмотрим на алгоритм работы этой конструкции:

  1. Если пользователь задал только Проект, СКД динамически сформирует текст условий виртуальной таблицы исключительно с проектом, а условие по организации полностью исключит из итогового текста SQL-запроса.
  2. Если пользователь задал оба значения, СКД автоматически соединит эти выражения через логическое И.
  3. Если ни один параметр не заполнен и флаги использования сняты, блок условий будет полностью опущен, и виртуальная таблица прочитает данные без дополнительных фильтров.

Способ 2. Использование стандартных отборов СКД вместо жестких параметров

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

Если автозаполнение в запросе отключено или требуется жестко ограничить доступные для фильтрации поля внутри виртуальной таблицы, на вкладке Компоновка данных в поле параметров виртуальной таблицы объявляются доступные поля отбора:

{(Организация).*, (Проект).*}

Разберем преимущества этого подхода:

  1. Гибкость для пользователя: в пользовательских настройках на вкладке «Отбор» можно применять любые виды сравнения: «Равно», «В списке», «В группе», «Заполнено» и другие.
  2. Отсутствие дублирования: нет необходимости создавать и настраивать отдельные параметры на вкладке «Параметры» схемы компоновки данных.
  3. Оптимальная производительность: итоговый запрос к СУБД формируется с фильтрацией на уровне виртуальной таблицы регистра, исключая лишнее чтение записей.

Важные нюансы и настройки параметров схемы

Чтобы опциональные параметры работали корректно и отчет не выдавал неожиданных ошибок при формировании, проверим следующие настройки схемы компоновки данных:

  1. Свойство «Использование» на вкладке «Параметры»: если параметру назначено свойство Авто, в пользовательском интерфейсе отображается флаг активности. Важно помнить: если параметр не обрамлен в фигурные скобки расширения СКД в тексте запроса, снятие этого флага пользователем приведет к падению отчета.
  2. Флаг «Запрещать незаполненные значения»: для необязательных параметров данный флаг должен быть обязательно снят. Если он активен, система заблокирует формирование отчета, требуя явного ввода данных.
  3. Поведение Конструктора запросов: визуальный конструктор 1С при повторном открытии и сохранении запроса может некорректно объединять фигурные скобки или изменять расстановку запятых в секциях расширения СКД. Сложные конструкции рекомендуется проверять и корректировать в текстовом режиме редактора запроса.
← На главную