Как скрыть пустые строки в Универсальном отчете и исправить ошибку условного оформления в 1С?

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

При разработке и доработке отчетов на базе объекта Универсальный отчет (работающего на основе объекта ПостроительОтчета в обычных формах) разработчики часто сталкиваются с необходимостью отсекать строки с незаполненными реквизитами. Попытка решить эту задачу с помощью условного оформления нередко приводит к ошибке «Недопустимое значение параметра» при вызове метода Отбор.Добавить(), либо к пониманию того, что оформление не скрывает строку целиком.

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

Анализ ошибки «Недопустимое значение параметра»

Рассмотрим пример программного кода, в котором при настройке условного оформления возникает исключение:


УФ = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление;
УФ.Очистить();
ЭлемУслОформл = УФ.Добавить("ДоговорХранения", "ДоговорХранения");
ЭлемУслОформл.Использование = Истина;
ЭлемОбласти = ЭлемУслОформл.Область.Добавить("ДоговорХранения");

// Ошибка возникает на следующей строке:
ЭлементОтбора = ЭлемУслОформл.Отбор.Добавить("ДоговорХранения");
ЭлементОтбора.Значение = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
ЭлементОтбора.ВидСравнения = ВидСравнения.НеРавно;
ЭлементОтбора.Использование = Истина;

Выясним причину падения метода Отбор.Добавить("ДоговорХранения"). В объекте ПостроительОтчета коллекция отбора (как общего, так и внутри условного оформления) работает исключительно с полями, которые зарегистрированы в коллекции ПостроительОтчета.ДоступныеПоля, причем для них должно быть разрешено использование в отборе (свойство Отбор = Истина).

Ошибка «Недопустимое значение параметра» возникает в следующих ситуациях:

  1. Поле с именем ДоговорХранения отсутствует в списке доступных полей построителя.
  2. Имя поля передано с ошибкой регистра или не совпадает с псевдонимом/путем к данным (например, в запросе поле названо Договор или ДоговорХраненияСсылка).
  3. В тексте запроса построителя не описано расширение для отбора в секции {ГДЕ ...}.

Ограничения условного оформления в Построителе отчета

Проанализируем возможности объекта ЭлементУсловногоОформления в ПостроительОтчета. В отличие от Системы компоновки данных (СКД), где оформление может управлять видимостью элементов, в построителе отчета условное оформление предназначено только для визуального выделения данных:

  1. Управление цветом текста (ЦветТекста) и фона (ЦветФона).
  2. Изменение параметров шрифта (Шрифт).
  3. Форматирование значений (Формат) и замена текста (Текст).
  4. Настройка выравнивания и отступов.

Механизм условного оформления построителя отчета не умеет скрывать или удалять строки из результирующего отчета. Для исключения строк необходимо использовать другие подходы.

Способ 1. Использование механизма отборов отчета

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

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


УниверсальныйОтчет.ДобавитьОтбор("ДоговорХранения", Истина, ВидСравнения.Заполнено);

Если требуется настроить отбор напрямую через построитель отчета, напишем следующий код:


ЭлементОтбора = УниверсальныйОтчет.ПостроительОтчета.Отбор.Найти("ДоговорХранения");
Если ЭлементОтбора = Неопределено Тогда
    ЭлементОтбора = УниверсальныйОтчет.ПостроительОтчета.Отбор.Добавить("ДоговорХранения");
КонецЕсли;

ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ВидСравнения = ВидСравнения.Заполнено;

Способ 2. Корректировка исходного запроса отчета

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

  1. Если выборка договора происходит через ЛЕВОЕ СОЕДИНЕНИЕ, заменим его на ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
  2. Если соединение должно оставаться левым, добавим фильтрацию в секцию ГДЕ:
    
    ГДЕ
        ДоговорХранения ЕСТЬ НЕ NULL
        И ДоговорХранения <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)
    
  3. Для того чтобы поле гарантированно было доступно в отборах универсального отчета, опишем его в блоке расширения языка запросов для построителя:
    
    {ГДЕ
        ДоговорХранения.* КАК ДоговорХранения}
    

Способ 3. Постобработка результирующего табличного документа

Если отчет строится со сложной структурой группировок, где отбор на уровне построителя может нарушить вывод вышестоящих итогов, применим скрытие строк в результирующем ТабличныйДокумент после его формирования.

Посмотрим на пример постобработки:


ТабДок = Новый ТабличныйДокумент;
УниверсальныйОтчет.СформироватьОтчет(ТабДок);

// Обходим строки сформированного документа
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
    // Получаем область строки для проверки содержимого
    ОбластьСтроки = ТабДок.Область(НомерСтроки, 1, НомерСтроки, ТабДок.ШиринаТаблицы);
    
    // Проверяем условие заполненности и при необходимости скрываем строку
    // ТабДок.Область(НомерСтроки, 0).Видимость = Ложь;
КонецЦикла;

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

← На главную