Как скрыть верхние уровни иерархии в СКД?
День добрый.
Подскажите, как в отчете на СКД можно не выводить определенные уровни иерархии?
Например: при выводе в отчет на скд номенклатуры с иерархией выводить только элементы и 3-го уровня и ниже. Тем более что в условиях запроса другие элементы и не попадают. На скрине ниже нужно средствами СКД (или как-то ещё) скрыть группу "Материалы производственные"
Пробовал играться с системным полем "Уровень" и отбором на уровне выводимой иерархией. В итоге - убрать нижние уровни иерархии (условие отбора "Уровень < чегототам") можно, верхние - не получилось.
Подскажите, как в отчете на СКД можно не выводить определенные уровни иерархии?
Например: при выводе в отчет на скд номенклатуры с иерархией выводить только элементы и 3-го уровня и ниже. Тем более что в условиях запроса другие элементы и не попадают. На скрине ниже нужно средствами СКД (или как-то ещё) скрыть группу "Материалы производственные"
Пробовал играться с системным полем "Уровень" и отбором на уровне выводимой иерархией. В итоге - убрать нижние уровни иерархии (условие отбора "Уровень < чегототам") можно, верхние - не получилось.
По теме из базы знаний
Найденные решения
(14) Уменьшил градус костыльности и сделал на основе уровней.
1. В настройки группировки по материалам добавил условное оформление которое заменяет текст в поле Материал на метку "!!УдалитьСтрокуПриВыводе!!" для уровней группировки меньше или равно 2.
В коде делаю проверку по метке и не вывожу строку с меткой.
1. В настройки группировки по материалам добавил условное оформление которое заменяет текст в поле Материал на метку "!!УдалитьСтрокуПриВыводе!!" для уровней группировки меньше или равно 2.
В коде делаю проверку по метке и не вывожу строку с меткой.
// Выводит результат СКД с установкой вертикальной автофиксации.
// Параметры:
// Таб - ТабличныеДокумент, ПолеТабличногоДокумента - куда выводим отчет;
// ПроцессорКомпоновкиДанных - ПроцессорКомпоновкиДанных;
// ЭлементыРасшировки - ЭлементыРасшифровкиКомпоновкиДанных;
// МассивИгнорируемыхПолей - Массив, *Неопределено - массив имен игнорируемых полей;
// РазрешитьПрерывание - Булево, *Истина.
//
Процедура ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(Таб, ПроцессорКомпоновкиДанных, ЭлементыРасшировки,
Знач МассивИгнорируемыхПолей = Неопределено, РазрешитьПрерывание = Истина) Экспорт
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Таб);
ПроцессорВывода.НачатьВывод();
ФиксацияВыполнена = Ложь;
Если МассивИгнорируемыхПолей = Неопределено Тогда
МассивИгнорируемыхПолей = Новый Массив;
КонецЕсли;
Пока Истина Цикл
ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
Прервать;
КонецЕсли;
// Автофиксация
Если Не ФиксацияВыполнена Тогда
Для Каждого ЗначениеПараметра Из ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров Цикл
Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
ЗначенияПолейРасшифровки = ЭлементыРасшировки[ЗначениеПараметра.Значение].ПолучитьПоля();
Для Каждого ЗначениеПоляРасшифровки Из ЗначенияПолейРасшифровки Цикл
Если МассивИгнорируемыхПолей.Найти(ЗначениеПоляРасшифровки.Поле) = Неопределено Тогда
Таб.ФиксацияСверху = Таб.ВысотаТаблицы;
ФиксацияВыполнена = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ФиксацияВыполнена Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Поиск метки и удаление из вывода.
Параметр1=ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров.Найти("П1");
Если Параметр1<>Неопределено и Параметр1.Значение="!!УдалитьСтрокуПриВыводе!!" Тогда
Продолжить;//не выводим
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
Если РазрешитьПрерывание Тогда
ОбработкаПрерыванияПользователя();
КонецЕсли;
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры // ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
на макете можно выводить что угодно как угодно, а в СКД можно только глобально или выводить иерархию или выводить без иерархии, если не нужна верхняя группа может надо править запрос и выбирать
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
(13) Сделал дюже костыльно:
В принципе работает, но внутренний перфекционист недоволен. Как в этом коде уровень иерархии выцепить?
// Выводит результат СКД с установкой вертикальной автофиксации.
// Параметры:
// Таб - ТабличныеДокумент, ПолеТабличногоДокумента - куда выводим отчет;
// ПроцессорКомпоновкиДанных - ПроцессорКомпоновкиДанных;
// ЭлементыРасшировки - ЭлементыРасшифровкиКомпоновкиДанных;
// МассивИгнорируемыхПолей - Массив, *Неопределено - массив имен игнорируемых полей;
// РазрешитьПрерывание - Булево, *Истина.
//
Процедура ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(Таб, ПроцессорКомпоновкиДанных, ЭлементыРасшировки,
Знач МассивИгнорируемыхПолей = Неопределено, РазрешитьПрерывание = Истина) Экспорт
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Таб);
ПроцессорВывода.НачатьВывод();
ФиксацияВыполнена = Ложь;
Если МассивИгнорируемыхПолей = Неопределено Тогда
МассивИгнорируемыхПолей = Новый Массив;
КонецЕсли;
Пока Истина Цикл
ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
Прервать;
КонецЕсли;
// Автофиксация
Если Не ФиксацияВыполнена Тогда
Для Каждого ЗначениеПараметра Из ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров Цикл
Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
ЗначенияПолейРасшифровки = ЭлементыРасшировки[ЗначениеПараметра.Значение].ПолучитьПоля();
Для Каждого ЗначениеПоляРасшифровки Из ЗначенияПолейРасшифровки Цикл
Если МассивИгнорируемыхПолей.Найти(ЗначениеПоляРасшифровки.Поле) = Неопределено Тогда
Таб.ФиксацияСверху = Таб.ВысотаТаблицы;
ФиксацияВыполнена = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ФиксацияВыполнена Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Поиск материалов производственных и удаление из вывода. говнокод
Параметр1=ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров.Найти("П1");
Если Параметр1<>Неопределено и Параметр1.Значение="Материалы производственные" Тогда
Продолжить;//не выводим
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
Если РазрешитьПрерывание Тогда
ОбработкаПрерыванияПользователя();
КонецЕсли;
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры // ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок
ПоказатьВ принципе работает, но внутренний перфекционист недоволен. Как в этом коде уровень иерархии выцепить?
(14) Уменьшил градус костыльности и сделал на основе уровней.
1. В настройки группировки по материалам добавил условное оформление которое заменяет текст в поле Материал на метку "!!УдалитьСтрокуПриВыводе!!" для уровней группировки меньше или равно 2.
В коде делаю проверку по метке и не вывожу строку с меткой.
1. В настройки группировки по материалам добавил условное оформление которое заменяет текст в поле Материал на метку "!!УдалитьСтрокуПриВыводе!!" для уровней группировки меньше или равно 2.
В коде делаю проверку по метке и не вывожу строку с меткой.
// Выводит результат СКД с установкой вертикальной автофиксации.
// Параметры:
// Таб - ТабличныеДокумент, ПолеТабличногоДокумента - куда выводим отчет;
// ПроцессорКомпоновкиДанных - ПроцессорКомпоновкиДанных;
// ЭлементыРасшировки - ЭлементыРасшифровкиКомпоновкиДанных;
// МассивИгнорируемыхПолей - Массив, *Неопределено - массив имен игнорируемых полей;
// РазрешитьПрерывание - Булево, *Истина.
//
Процедура ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(Таб, ПроцессорКомпоновкиДанных, ЭлементыРасшировки,
Знач МассивИгнорируемыхПолей = Неопределено, РазрешитьПрерывание = Истина) Экспорт
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Таб);
ПроцессорВывода.НачатьВывод();
ФиксацияВыполнена = Ложь;
Если МассивИгнорируемыхПолей = Неопределено Тогда
МассивИгнорируемыхПолей = Новый Массив;
КонецЕсли;
Пока Истина Цикл
ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
Прервать;
КонецЕсли;
// Автофиксация
Если Не ФиксацияВыполнена Тогда
Для Каждого ЗначениеПараметра Из ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров Цикл
Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
ЗначенияПолейРасшифровки = ЭлементыРасшировки[ЗначениеПараметра.Значение].ПолучитьПоля();
Для Каждого ЗначениеПоляРасшифровки Из ЗначенияПолейРасшифровки Цикл
Если МассивИгнорируемыхПолей.Найти(ЗначениеПоляРасшифровки.Поле) = Неопределено Тогда
Таб.ФиксацияСверху = Таб.ВысотаТаблицы;
ФиксацияВыполнена = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ФиксацияВыполнена Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Поиск метки и удаление из вывода.
Параметр1=ЭлементРезультатаКомпоновкиДанных.ЗначенияПараметров.Найти("П1");
Если Параметр1<>Неопределено и Параметр1.Значение="!!УдалитьСтрокуПриВыводе!!" Тогда
Продолжить;//не выводим
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
Если РазрешитьПрерывание Тогда
ОбработкаПрерыванияПользователя();
КонецЕсли;
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры // ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок
Показать
для такой хитрой задачи есть хитрый способ
1. В схему СКД добавляем параметр "НеВыводитьВерхниеУровни"
2. Можно его сделать доступным и включить в пользовательские настройки
3. Дальше хитрость - в условном оформлении отчета или условном оформлении группировок добавляем элемент оформления где условием будет что-то вроде
НеВыводитьВерхниеУровни = Истина и Уровень > 3.
Условие в рамках задачи очевидно и логично, а как же оно поможет решить задачу?
А задачу оно решит тем, что в этом элементе оформления мы укажем высота 0,04 или 0,01 что-то около этих значений.
Визуально это выглядит так, что нет строки или колонки для случая колонок и игры с шириной.
Мне такая хитрость позволяла строить сложные выводы, используя лишь конструктор.
ЗЫ: И строки и колонки есть в результирующем табличном документе и их можно увидеть раздвигая насильно, но если этого не делать, то их как бы нет.
1. В схему СКД добавляем параметр "НеВыводитьВерхниеУровни"
2. Можно его сделать доступным и включить в пользовательские настройки
3. Дальше хитрость - в условном оформлении отчета или условном оформлении группировок добавляем элемент оформления где условием будет что-то вроде
НеВыводитьВерхниеУровни = Истина и Уровень > 3.
Условие в рамках задачи очевидно и логично, а как же оно поможет решить задачу?
А задачу оно решит тем, что в этом элементе оформления мы укажем высота 0,04 или 0,01 что-то около этих значений.
Визуально это выглядит так, что нет строки или колонки для случая колонок и игры с шириной.
Мне такая хитрость позволяла строить сложные выводы, используя лишь конструктор.
ЗЫ: И строки и колонки есть в результирующем табличном документе и их можно увидеть раздвигая насильно, но если этого не делать, то их как бы нет.
Была задача не выводить первую группу. Но она там была одна и я решил так.
Алгоритм можно доработать на анализ уровня элемента.
ПроцессорВывода.НачатьВывод();
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока ЭлементРезультата <> Неопределено Цикл
Если ЭлементРезультата.Макет = "Макет11" Тогда
Если ЭлементРезультата.ЗначенияПараметров.П1.Значение = "Тут название группы" Тогда
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Продолжить;
КонецЕсли;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Алгоритм можно доработать на анализ уровня элемента.
ПроцессорВывода.НачатьВывод();
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока ЭлементРезультата <> Неопределено Цикл
Если ЭлементРезультата.Макет = "Макет11" Тогда
Если ЭлементРезультата.ЗначенияПараметров.П1.Значение = "Тут название группы" Тогда
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Продолжить;
КонецЕсли;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот