Как использовать конструкцию ВЫБОР КОГДА в заголовке макета отчета СКД для обработки необязательных параметров

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

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

Проблема обращения к «выключенному» параметру

Рассмотрим ситуацию, когда в схеме компоновки данных определен параметр Поступление с типом ПеречислениеСсылка. В макете создана область «Заголовок», где в ячейке прописано: Поступление: [Поступление]. Пока галочка в настройках отчета стоит, всё работает корректно. Однако, как только пользователь деактивирует параметр, СКД при попытке отрисовать макет генерирует ошибку «Параметр не найден». Это происходит потому, что выражение макета пытается вычислить значение, которого физически нет в текущем наборе данных компоновки.

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

Способ 1. Выражение в параметрах макета

Это самый прямой путь решения проблемы. Вместо того чтобы выводить параметр напрямую, мы пропишем логику в настройках самого макета оформления. Проделаем следующие шаги:

  1. Перейдем на вкладку Макеты в схеме СКД.
  2. Найдем область, отвечающую за заголовок, и выберем ячейку с параметром.
  3. В нижнем окне свойств для параметра макета (например, ПараметрПоступление) в колонке Выражение введем условие.

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


ВЫБОР 
    КОГДА &Поступление = Неопределено ИЛИ &Поступление = ЗНАЧЕНИЕ(Перечисление.Поступление.ПустаяСсылка) 
        ТОГДА "----" 
    ИНАЧЕ Представление(&Поступление) 
КОНЕЦ

Важный нюанс: использование функции Представление() крайне рекомендуется. Это позволяет получить текстовую строку из ссылки (справочника или перечисления) безопасным способом. Если параметр не заполнен, функция вернет пустую строку вместо ошибки обращения к объекту.

Способ 2. Использование универсальной функции ЗначениеЗаполнено()

Проанализируем более современный подход. В последних версиях платформы 1С:Предприятие 8.3 выражения СКД поддерживают функцию ЗначениеЗаполнено(), которая является универсальной для проверки на NULL, Неопределено, пустую ссылку или пустую строку. Это значительно упрощает написание условий.

Рассмотрим пример выражения:


ВЫБОР 
    КОГДА ЗначениеЗаполнено(&Поступление) 
        ТОГДА Представление(&Поступление) 
    ИНАЧЕ "Все значения" 
КОНЕЦ

Такая конструкция корректно отработает как в случае, если параметр выбран, но не заполнен (пустая ссылка), так и в случае, если галочка параметра полностью снята пользователем.

Способ 3. Создание «прослойки» через вычисляемое поле

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

  1. Перейдем на вкладку Вычисляемые поля.
  2. Добавим новое поле, назовем его, например, ЗаголовокПоступление.
  3. В поле «Выражение» впишем нашу логику проверки.
  4. В макете в ячейке заголовка будем использовать не прямой параметр &Поступление, а наше новое поле ЗаголовокПоступление.

Пример выражения для вычисляемого поля:

ЕСТЬNULL(Представление(&Поступление), "По всем поступлениям")

Функция ЕСТЬNULL здесь выступает предохранителем на случай, если система вернет NULL при отсутствии параметра в контексте вычисления.

Настройка свойства «Использовать всегда»

Выясним причину, по которой даже с условием ВЫБОР КОГДА иногда может возникать ошибка. Это связано с жизненным циклом параметров. Если параметр в настройках СКД не имеет флага Использовать всегда, и при этом он не задействован в активных условиях запроса (например, не попал в ГДЕ из-за снятой галочки), СКД может полностью исключить его из обработки.

Рассмотрим, как правильно настроить параметры:

  1. Откроем вкладку Параметры.
  2. Найдем наш параметр Поступление.
  3. Установим флаг Использовать всегда.

Внимание: установка этого флага может привести к тому, что параметр будет всегда передаваться в запрос к базе данных. Чтобы это не испортило фильтрацию данных (когда параметр должен «выключаться»), убедитесь, что в тексте запроса условие с этим параметром заключено в фигурные скобки (необязательное условие):


ВЫБРАТЬ
    Обращения.Ссылка,
    Обращения.Поступление
ИЗ
    Документ.Обращение КАК Обращения
{ГДЕ
    Обращения.Поступление = &Поступление}

В такой связке параметр всегда будет доступен для вычисления в макете (благодаря флагу), но не будет влиять на результат выборки данных, если пользователь не активировал его в настройках отчета.

Использование шаблонов в макете

Если нам нужно собрать заголовок из нескольких частей (статичный текст + динамическое значение), удобнее использовать тип заполнения ячейки Шаблон. Рассмотрим на примере.

В свойстве ячейки «Заполнение» выберем «Шаблон». В тексте ячейки напишем: Выбрано поступление: [ЗначениеДляЗаголовка]. В списке параметров макета для ЗначениеДляЗаголовка укажем выражение, которое мы разобрали выше. Это позволит избежать нагромождения условий прямо в тексте ячейки и сделает макет более читаемым.

Проанализировав все способы, можно сделать вывод, что наиболее стабильным является сочетание флага Использовать всегда для параметра и использование функции ЗначениеЗаполнено() в выражении макета. Это гарантирует, что отчет не упадет с ошибкой, а пользователь получит понятную информацию о примененных фильтрах.

← На главную