Как реализовать условный вывод данных и работу с иерархией в СКД

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

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

Реализация условного вывода в полях отчета

Первый вопрос, который мы разберем: как сделать так, чтобы значение в поле выводилось только при выполнении определенного условия? Существует два основных подхода: Условное оформление и Вычисляемые поля. Выясним причину выбора каждого из них.

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

Для корректного управления самими данными лучше использовать Вычисляемые поля. Разберем по шагам, как написать выражение для такого поля:

  1. Перейдем на закладку «Вычисляемые поля» в схеме компоновки данных.
  2. Добавим новое поле (например, ОбъектСписания).
  3. В колонке «Выражение» напишем конструкцию ВЫБОР КОГДА....

Пример выражения:


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

В данном случае мы проверяем конкретный счет, и если он совпадает с искомым, выводим НоменклатурнаяГруппа, в противном случае — пустую строку. Обратите внимание на использование функции ЗНАЧЕНИЕ() — это наиболее правильный способ обращения к предопределенным элементам в СКД.

Работа с иерархией справочников через «гирлянду» условий

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

Рассмотрим пример логики проверки до третьего уровня вложенности:


ВЫБОР 
    КОГДА Родитель = &НужнаяГруппа ТОГДА "Попал"
    КОГДА Родитель.Родитель = &НужнаяГруппа ТОГДА "Попал"
    КОГДА Родитель.Родитель.Родитель = &НужнаяГруппа ТОГДА "Попал"
    ИНАЧЕ "Не попал"
КОНЕЦ

Такой подход допустим, если максимальная глубина вложенности заранее известна и невелика. Однако помните, что избыточное количество обращений через точку (Родитель.Родитель.Родитель...) может негативно сказаться на производительности отчета, так как каждое такое обращение — это неявное соединение таблиц в запросе к базе данных.

Поиск элементов по коду и использование параметров

Иногда возникает соблазн использовать методы типа НайтиПоКоду() прямо в выражениях СКД. Важно понимать: в языке выражений СКД нельзя напрямую вызывать методы объектов. Попытка написать Справочники.ОсновныеСредства.НайтиПоКоду("00001") приведет к ошибке.

Разберем, как правильно реализовать отбор конкретных элементов, если их список ограничен (например, те самые 8 объектов из обсуждения):

  1. Создадим в СКД параметр, например, СписокОбъектов.
  2. Установим у него флаг «Доступен список значений».
  3. В модуле отчета (обычно в процедуре ПриКомпоновкеРезультата) программно заполним этот параметр нужными ссылками.

Пример программного заполнения списка в модуле:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    Список8Объектов = Новый СписокЗначений;
    Объект1 = Справочники.ОсновныеСредства.НайтиПоКоду("000000614");
    Если ЗначениеЗаполнено(Объект1) Тогда
        Список8Объектов.Добавить(Объект1);
    КонецЕсли;
    
    // Устанавливаем параметр в настройках компоновки
    ПараметрСхемы = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("СписокОбъектов");
    Если ПараметрСхемы <> Неопределено Тогда
        ПараметрСхемы.Значение = Список8Объектов;
        ПараметрСхемы.Использование = Истина;
    КонецЕсли;
    
КонецПроцедуры

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


ВЫБОР 
    КОГДА ОсновноеСредство В (&СписокОбъектов) 
    ТОГДА "Облагается" 
    ИНАЧЕ "Не облагается" 
КОНЕЦ

Важное замечание по именованию: никогда не начинайте имя параметра с цифры (например, &8объектов). Это недопустимо в языке 1С и приведет к ошибке «Параметр не найден». Используйте понятные имена: &СписокОбъектов или &ОбъектыДляПроверки.

Использование функций общих модулей для сложной логики

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

Для этого должны быть соблюдены условия:

Синтаксис вызова в вычисляемом поле будет следующим: ИмяОбщегоМодуля.ИмяФункции(Поле1, Поле2). Например, вы можете передать ссылку на объект в функцию, которая выполнит сложный поиск или расчет и вернет готовый результат.

Подведем итоги

Мы проанализировали основные способы кастомизации данных в СКД. Для простых условий идеально подходят Вычисляемые поля. Если нужно отобрать конкретный список элементов, лучше использовать Параметры со списком значений, заполняемые программно. А для работы с иерархией на уровне условий — проверку через родителей или специализированные функции общих модулей. Использование этих методов позволит вам создавать профессиональные и быстродействующие отчеты.

← На главную