День добрый.

Подскажите, как в отчете на СКД можно не выводить определенные уровни иерархии?
Например: при выводе в отчет на скд номенклатуры с иерархией выводить только элементы и 3-го уровня и ниже. Тем более что в условиях запроса другие элементы и не попадают. На скрине ниже нужно средствами СКД (или как-то ещё) скрыть группу "Материалы производственные"

Пробовал играться с системным полем "Уровень" и отбором на уровне выводимой иерархией. В итоге - убрать нижние уровни иерархии (условие отбора "Уровень < чегототам") можно, верхние - не получилось.
---
Уменьшил градус костыльности и сделал на основе уровней.
1. В настройки группировки по материалам добавил условное оформление которое заменяет текст в поле Материал на метку "!!УдалитьСтрокуПриВыводе!!" для уровней группировки меньше или равно 2.

В коде делаю проверку по метке и не вывожу строку с меткой.

```1c
    // Выводит результат СКД с установкой вертикальной автофиксации.
    // Параметры:
    // Таб - ТабличныеДокумент, ПолеТабличногоДокумента - куда выводим отчет;
    // ПроцессорКомпоновкиДанных - ПроцессорКомпоновкиДанных;
    // ЭлементыРасшировки - ЭлементыРасшифровкиКомпоновкиДанных;
    // МассивИгнорируемыхПолей - Массив, *Неопределено - массив имен игнорируемых полей;
    // РазрешитьПрерывание - Булево, *Истина.
    //
    Процедура ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(Таб, ПроцессорКомпоновкиДанных, ЭлементыРасшировки,
    Знач МассивИгнорируемыхПолей = Неопределено, РазрешитьПрерывание = Истина) Экспорт

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Таб);
    ПроцессорВывода.НачатьВывод();
    ФиксацияВыполнена = Ложь;
    Если МассивИгнорируемыхПолей = Неопределено Тогда
    МассивИгнорируемыхПолей = Новый Массив;
    КонецЕсли;
    Пока Истина Цикл
    ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
    Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
    Прервать;
    КонецЕсли;

    // Автофиксация
    Если Не ФиксацияВыполнена Тогда
    Для Каждого ЗначениеПараметра Из ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров Цикл
    Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
    ЗначенияПолейРасшифровки = ЭлементыРасшировки[ЗначениеПараметра.Значение].ПолучитьПоля();
    Для Каждого ЗначениеПоляРасшифровки Из ЗначенияПолейРасшифровки Цикл
    Если МассивИгнорируемыхПолей.Найти(ЗначениеПоляРасшифровки.Поле) = Неопределено Тогда
    Таб.ФиксацияСверху = Таб.ВысотаТаблицы;
    ФиксацияВыполнена = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если ФиксацияВыполнена Тогда
    Прервать;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    //Поиск метки и удаление из вывода.
    Параметр1=ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров.Найти("П1");
    Если Параметр1<>Неопределено и Параметр1.Значение="!!УдалитьСтрокуПриВыводе!!" Тогда
    Продолжить;//не выводим
    КонецЕсли;

    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
    Если РазрешитьПрерывание Тогда
    ОбработкаПрерыванияПользователя();
    КонецЕсли;
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();

    КонецПроцедуры // ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок
```
---
То есть группировка по верхним уровням есть но ее не показывать, хитро
в чем смысл такого действия?
---
В отбор попадает только номенклатура из подгрупп группы "Материалы производственные" и ниже. Т.е. вывод группы "Материалы производственные" не имеет смысла и только добавляет лишнюю строку раздувая отчет. Ну и "клиент так хочет" )
---
нарисовать макет
(3)

надо понимать что без группировки верхнего уровня это другой отчет - главное чтобы потом эти польззователи не заплакали и не попросили все обратно))
---
Можно подробней про макет? Как он тут поможет?

(4) Не "другой". Отчет узкоспециализирован, кроме выбора периода пользователю ничего не будет там нужно и доступно. Попросят другой отчет - напишем другой, по отдельному прайсу )
---
на макете можно выводить что угодно как угодно, а в СКД можно только глобально или выводить иерархию или выводить без иерархии, если не нужна верхняя группа может надо править запрос и выбирать
ГДЕ
    Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
---
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа) Это в запросе уже есть. СКД "достраивает" иерархию сама.
---
А группировки в настройках отчета у вас сейчас как выглядят?
---
Так
---
Попробуйте Материал.Родитель выбирать в отдельное поле и по нему потом в запросе убрать ненужные значения и потом использовать ее в группировке без иерархии, но это кривовато все.
---
По хорошему это надо делать при выводе результата и обрабатывать отдельно вывод, проверяя уровень и в зависимости от него выводить или нет группировку.
---
думаю об этом. надеюсь что есть вариант проще.
---
проще в (10), но не правильней.
---
Сделал дюже костыльно:

```1c
    // Выводит результат СКД с установкой вертикальной автофиксации.
    // Параметры:
    // Таб - ТабличныеДокумент, ПолеТабличногоДокумента - куда выводим отчет;
    // ПроцессорКомпоновкиДанных - ПроцессорКомпоновкиДанных;
    // ЭлементыРасшировки - ЭлементыРасшифровкиКомпоновкиДанных;
    // МассивИгнорируемыхПолей - Массив, *Неопределено - массив имен игнорируемых полей;
    // РазрешитьПрерывание - Булево, *Истина.
    //
    Процедура ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(Таб, ПроцессорКомпоновкиДанных, ЭлементыРасшировки,
    Знач МассивИгнорируемыхПолей = Неопределено, РазрешитьПрерывание = Истина) Экспорт

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Таб);
    ПроцессорВывода.НачатьВывод();
    ФиксацияВыполнена = Ложь;
    Если МассивИгнорируемыхПолей = Неопределено Тогда
    МассивИгнорируемыхПолей = Новый Массив;
    КонецЕсли;
    Пока Истина Цикл
    ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
    Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
    Прервать;
    КонецЕсли;

    // Автофиксация
    Если Не ФиксацияВыполнена Тогда
    Для Каждого ЗначениеПараметра Из ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров Цикл
    Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
    ЗначенияПолейРасшифровки = ЭлементыРасшировки[ЗначениеПараметра.Значение].ПолучитьПоля();
    Для Каждого ЗначениеПоляРасшифровки Из ЗначенияПолейРасшифровки Цикл
    Если МассивИгнорируемыхПолей.Найти(ЗначениеПоляРасшифровки.Поле) = Неопределено Тогда
    Таб.ФиксацияСверху = Таб.ВысотаТаблицы;
    ФиксацияВыполнена = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если ФиксацияВыполнена Тогда
    Прервать;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    //Поиск материалов производственных и удаление из вывода. говнокод
    Параметр1=ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров.Найти("П1");
    Если Параметр1<>Неопределено и Параметр1.Значение="Материалы производственные" Тогда
    Продолжить;//не выводим
    КонецЕсли;

    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
    Если РазрешитьПрерывание Тогда
    ОбработкаПрерыванияПользователя();
    КонецЕсли;
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();

    КонецПроцедуры // ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок
```

В принципе работает, но внутренний перфекционист недоволен. Как в этом коде уровень иерархии выцепить?
---
Уменьшил градус костыльности и сделал на основе уровней.
1. В настройки группировки по материалам добавил условное оформление которое заменяет текст в поле Материал на метку "!!УдалитьСтрокуПриВыводе!!" для уровней группировки меньше или равно 2.

В коде делаю проверку по метке и не вывожу строку с меткой.

```1c
    // Выводит результат СКД с установкой вертикальной автофиксации.
    // Параметры:
    // Таб - ТабличныеДокумент, ПолеТабличногоДокумента - куда выводим отчет;
    // ПроцессорКомпоновкиДанных - ПроцессорКомпоновкиДанных;
    // ЭлементыРасшировки - ЭлементыРасшифровкиКомпоновкиДанных;
    // МассивИгнорируемыхПолей - Массив, *Неопределено - массив имен игнорируемых полей;
    // РазрешитьПрерывание - Булево, *Истина.
    //
    Процедура ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(Таб, ПроцессорКомпоновкиДанных, ЭлементыРасшировки,
    Знач МассивИгнорируемыхПолей = Неопределено, РазрешитьПрерывание = Истина) Экспорт

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Таб);
    ПроцессорВывода.НачатьВывод();
    ФиксацияВыполнена = Ложь;
    Если МассивИгнорируемыхПолей = Неопределено Тогда
    МассивИгнорируемыхПолей = Новый Массив;
    КонецЕсли;
    Пока Истина Цикл
    ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
    Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
    Прервать;
    КонецЕсли;

    // Автофиксация
    Если Не ФиксацияВыполнена Тогда
    Для Каждого ЗначениеПараметра Из ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров Цикл
    Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
    ЗначенияПолейРасшифровки = ЭлементыРасшировки[ЗначениеПараметра.Значение].ПолучитьПоля();
    Для Каждого ЗначениеПоляРасшифровки Из ЗначенияПолейРасшифровки Цикл
    Если МассивИгнорируемыхПолей.Найти(ЗначениеПоляРасшифровки.Поле) = Неопределено Тогда
    Таб.ФиксацияСверху = Таб.ВысотаТаблицы;
    ФиксацияВыполнена = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если ФиксацияВыполнена Тогда
    Прервать;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    //Поиск метки и удаление из вывода.
    Параметр1=ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров.Найти("П1");
    Если Параметр1<>Неопределено и Параметр1.Значение="!!УдалитьСтрокуПриВыводе!!" Тогда
    Продолжить;//не выводим
    КонецЕсли;

    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
    Если РазрешитьПрерывание Тогда
    ОбработкаПрерыванияПользователя();
    КонецЕсли;
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();

    КонецПроцедуры // ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок
```
---
для такой хитрой задачи есть хитрый способ

1. В схему СКД добавляем параметр "НеВыводитьВерхниеУровни"

2. Можно его сделать доступным и включить в пользовательские настройки

3. Дальше хитрость - в условном оформлении отчета или условном оформлении группировок добавляем элемент оформления где условием будет что-то вроде
НеВыводитьВерхниеУровни = Истина и Уровень > 3.

Условие в рамках задачи очевидно и логично, а как же оно поможет решить задачу?

А задачу оно решит тем, что в этом элементе оформления мы укажем высота 0,04 или 0,01 что-то около этих значений.

Визуально это выглядит так, что нет строки или колонки для случая колонок и игры с шириной.

Мне такая хитрость позволяла строить сложные выводы, используя лишь конструктор.

ЗЫ: И строки и колонки есть в результирующем табличном документе и их можно увидеть раздвигая насильно, но если этого не делать, то их как бы нет.
---
— Видишь суслика?..
 — Нет...
— И я не вижу... А он есть!
— Понятно...

"ДМБ"
---
Сообщение было скрыто модератором.
---
Может быть срабатывало на старых версиях платформы, а на новой не работает. Срабатывает только при установке числа 1, но тогда мы получаем некрасивую гребенку.
---
Была задача не выводить первую группу. Но она там была одна и я решил так.
Алгоритм можно доработать на анализ уровня элемента.

ПроцессорВывода.НачатьВывод();
  ЭлементРезультата = ПроцессорКомпоновки.Следующий();
  Пока ЭлементРезультата <> Неопределено Цикл
   Если ЭлементРезультата.Макет = "Макет11" Тогда
    Если ЭлементРезультата.ЗначенияПараметров.П1.Значение = "Тут название группы" Тогда
     ЭлементРезультата = ПроцессорКомпоновки.Следующий();
     Продолжить;
    КонецЕсли;
   КонецЕсли;
   ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
   ЭлементРезультата = ПроцессорКомпоновки.Следующий();
  КонецЦикла;
  ПроцессорВывода.ЗакончитьВывод();
---
Скрыть группу можно иначе: