Как скрыть верхние уровни иерархии в СКД?

1. SuhoffGV 10.08.17 14:29 Сейчас в теме
День добрый.

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


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


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

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

КонецПроцедуры // ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок
Показать
SV6; dimk@a; Alex_mar; marku; +4 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user623969_dusa 10.08.17 14:35 Сейчас в теме
То есть группировка по верхним уровням есть но ее не показывать, хитро
в чем смысл такого действия?
3. SuhoffGV 10.08.17 14:40 Сейчас в теме
(2)В отбор попадает только номенклатура из подгрупп группы "Материалы производственные" и ниже. Т.е. вывод группы "Материалы производственные" не имеет смысла и только добавляет лишнюю строку раздувая отчет. Ну и "клиент так хочет" )
4. user623969_dusa 10.08.17 14:46 Сейчас в теме
нарисовать макет
(3)

надо понимать что без группировки верхнего уровня это другой отчет - главное чтобы потом эти польззователи не заплакали и не попросили все обратно))
5. SuhoffGV 10.08.17 14:51 Сейчас в теме
Можно подробней про макет? Как он тут поможет?

(4) Не "другой". Отчет узкоспециализирован, кроме выбора периода пользователю ничего не будет там нужно и доступно. Попросят другой отчет - напишем другой, по отдельному прайсу )
6. user623969_dusa 10.08.17 15:48 Сейчас в теме
на макете можно выводить что угодно как угодно, а в СКД можно только глобально или выводить иерархию или выводить без иерархии, если не нужна верхняя группа может надо править запрос и выбирать
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
7. SuhoffGV 10.08.17 15:50 Сейчас в теме
(6)
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
Это в запросе уже есть. СКД "достраивает" иерархию сама.
8. Nelli_A86 10.08.17 15:53 Сейчас в теме
А группировки в настройках отчета у вас сейчас как выглядят?
9. SuhoffGV 10.08.17 16:03 Сейчас в теме
10. Skill 10.08.17 16:48 Сейчас в теме
Попробуйте Материал.Родитель выбирать в отдельное поле и по нему потом в запросе убрать ненужные значения и потом использовать ее в группировке без иерархии, но это кривовато все.
11. Skill 10.08.17 16:51 Сейчас в теме
По хорошему это надо делать при выводе результата и обрабатывать отдельно вывод, проверяя уровень и в зависимости от него выводить или нет группировку.
12. SuhoffGV 10.08.17 17:05 Сейчас в теме
(11) думаю об этом. надеюсь что есть вариант проще.
13. Skill 10.08.17 17:07 Сейчас в теме
(12)
проще в (10), но не правильней.
14. SuhoffGV 10.08.17 17:41 Сейчас в теме
(13) Сделал дюже костыльно:

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

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


В принципе работает, но внутренний перфекционист недоволен. Как в этом коде уровень иерархии выцепить?
15. SuhoffGV 10.08.17 18:08 Сейчас в теме
(14) Уменьшил градус костыльности и сделал на основе уровней.
1. В настройки группировки по материалам добавил условное оформление которое заменяет текст в поле Материал на метку "!!УдалитьСтрокуПриВыводе!!" для уровней группировки меньше или равно 2.


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

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

КонецПроцедуры // ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок
Показать
SV6; dimk@a; Alex_mar; marku; +4 Ответить
16. VmvLer 10.08.17 18:17 Сейчас в теме
для такой хитрой задачи есть хитрый способ

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

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

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

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

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

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

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

ЗЫ: И строки и колонки есть в результирующем табличном документе и их можно увидеть раздвигая насильно, но если этого не делать, то их как бы нет.
JIeoIIoJIbD; marku; SuhoffGV; +3 Ответить
17. SuhoffGV 10.08.17 18:36 Сейчас в теме
(16)

— Видишь суслика?..
— Нет...
— И я не вижу... А он есть!
— Понятно...

"ДМБ"
18. пользователь 10.08.17 22:14
Сообщение было скрыто модератором.
...
19. cheshirshik 64 06.07.20 11:47 Сейчас в теме
Может быть срабатывало на старых версиях платформы, а на новой не работает. Срабатывает только при установке числа 1, но тогда мы получаем некрасивую гребенку.
20. Rif_md 6 15.09.23 15:47 Сейчас в теме
Была задача не выводить первую группу. Но она там была одна и я решил так.
Алгоритм можно доработать на анализ уровня элемента.

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот