При разработке и доработке отчетов на базе объекта Универсальный отчет (работающего на основе объекта ПостроительОтчета в обычных формах) разработчики часто сталкиваются с необходимостью отсекать строки с незаполненными реквизитами. Попытка решить эту задачу с помощью условного оформления нередко приводит к ошибке «Недопустимое значение параметра» при вызове метода Отбор.Добавить(), либо к пониманию того, что оформление не скрывает строку целиком.
Разберем подробно, почему возникает данная ошибка, в чем заключаются архитектурные ограничения условного оформления в ПостроительОтчета и какими способами можно исключить пустые строки из отчета.
Рассмотрим пример программного кода, в котором при настройке условного оформления возникает исключение:
УФ = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление;
УФ.Очистить();
ЭлемУслОформл = УФ.Добавить("ДоговорХранения", "ДоговорХранения");
ЭлемУслОформл.Использование = Истина;
ЭлемОбласти = ЭлемУслОформл.Область.Добавить("ДоговорХранения");
// Ошибка возникает на следующей строке:
ЭлементОтбора = ЭлемУслОформл.Отбор.Добавить("ДоговорХранения");
ЭлементОтбора.Значение = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
ЭлементОтбора.ВидСравнения = ВидСравнения.НеРавно;
ЭлементОтбора.Использование = Истина;
Выясним причину падения метода Отбор.Добавить("ДоговорХранения"). В объекте ПостроительОтчета коллекция отбора (как общего, так и внутри условного оформления) работает исключительно с полями, которые зарегистрированы в коллекции ПостроительОтчета.ДоступныеПоля, причем для них должно быть разрешено использование в отборе (свойство Отбор = Истина).
Ошибка «Недопустимое значение параметра» возникает в следующих ситуациях:
ДоговорХранения отсутствует в списке доступных полей построителя.Договор или ДоговорХраненияСсылка).{ГДЕ ...}.Проанализируем возможности объекта ЭлементУсловногоОформления в ПостроительОтчета. В отличие от Системы компоновки данных (СКД), где оформление может управлять видимостью элементов, в построителе отчета условное оформление предназначено только для визуального выделения данных:
ЦветТекста) и фона (ЦветФона).Шрифт).Формат) и замена текста (Текст).Механизм условного оформления построителя отчета не умеет скрывать или удалять строки из результирующего отчета. Для исключения строк необходимо использовать другие подходы.
Самый правильный способ убрать ненужные строки — применить фильтрацию на этапе выборки данных построителем. Для этого отбор накладывается на сам отчет, а не на оформление.
Если используется стандартный модуль универсального отчета, применим метод добавления отбора:
УниверсальныйОтчет.ДобавитьОтбор("ДоговорХранения", Истина, ВидСравнения.Заполнено);
Если требуется настроить отбор напрямую через построитель отчета, напишем следующий код:
ЭлементОтбора = УниверсальныйОтчет.ПостроительОтчета.Отбор.Найти("ДоговорХранения");
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = УниверсальныйОтчет.ПостроительОтчета.Отбор.Добавить("ДоговорХранения");
КонецЕсли;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ВидСравнения = ВидСравнения.Заполнено;
Если строки без договоров хранения не должны попадать в отчет ни при каких условиях, внесем изменения в текст запроса:
ЛЕВОЕ СОЕДИНЕНИЕ, заменим его на ВНУТРЕННЕЕ СОЕДИНЕНИЕ.ГДЕ:
ГДЕ
ДоговорХранения ЕСТЬ НЕ NULL
И ДоговорХранения <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)
{ГДЕ
ДоговорХранения.* КАК ДоговорХранения}
Если отчет строится со сложной структурой группировок, где отбор на уровне построителя может нарушить вывод вышестоящих итогов, применим скрытие строк в результирующем ТабличныйДокумент после его формирования.
Посмотрим на пример постобработки:
ТабДок = Новый ТабличныйДокумент;
УниверсальныйОтчет.СформироватьОтчет(ТабДок);
// Обходим строки сформированного документа
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
// Получаем область строки для проверки содержимого
ОбластьСтроки = ТабДок.Область(НомерСтроки, 1, НомерСтроки, ТабДок.ШиринаТаблицы);
// Проверяем условие заполненности и при необходимости скрываем строку
// ТабДок.Область(НомерСтроки, 0).Видимость = Ложь;
КонецЦикла;
Таким образом, для скрытия пустых записей в Универсальном отчете следует использовать штатные отборы построителя или корректировать текст запроса, так как механизм условного оформления для данной задачи не предназначен.