Удаление ненужных уровней иерархии. БСП

Клиенту понадобилось, чтобы в отчете выводился только верхний первый и следующий за ним второй уровень иерархии номенклатуры.

Решил через удаление в готовом отчете ненужных уровней. Результат выглядит так:

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

После удаления нужно выравнивать элементы (не группы) номенклатуры по общему уровню, иначе появляются лесенки в отчете.

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

Расширение общего модуля ВариантыОтчетов:

&Вместо("СформироватьОтчет")
Функция дор_СформироватьОтчет(Знач Параметры, Знач ПроверятьЗаполнение, Знач ПолучатьФлажокПустой)
	
	Результат = ПродолжитьВызов(Параметры, ПроверятьЗаполнение, ПолучатьФлажокПустой);
	
	Если дор_ИмяВарианта(Параметры) = "Валовая прибыль предприятия ОСНОВНОЙ" И
		дор_ЕстьТабличныйДокументИРасшифровка(Результат) Тогда
		дор_Сервер.ОформитьИерархию(Результат.ТабличныйДокумент, Результат.Расшифровка, 3, WebЦвета.БледноЗеленый);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция дор_ИмяВарианта(Параметры)
	//При запуске из рассылки
	Попытка
		Возврат Строка(Параметры.Подключение.Отчет);
	Исключение
	КонецПопытки;
	//При запуске из формы
	Попытка
		Возврат Строка(Параметры.СсылкаВарианта);
	Исключение
	КонецПопытки;
КонецФункции

Функция дор_ЕстьТабличныйДокументИРасшифровка(Результат)
	Попытка
		Возврат Результат.ТабличныйДокумент <> Неопределено И Результат.Расшифровка <> Неопределено;
	Исключение
		Возврат ложь;
	КонецПопытки;
КонецФункции

Функции модуля дор_Сервер:

Процедура ОформитьИерархию(ТабДок, ДанныеРасшфровки, УдалятьСУровня, ЦветПервогоУровня = Неопределено) Экспорт
	
	ТЗРасшифровки = ПолучитьТаблицуРасшифровок(ТабДок, ДанныеРасшфровки);
	ТЗРасшифровки.Сортировать("Стр Убыв");
	
	Для Каждого Строка ИЗ ТЗРасшифровки Цикл
		Номенклатура = Строка.Номенклатура;
		Если Номенклатура = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Уровень = Номенклатура.Уровень();
		Если Уровень >= УдалятьСУровня И Номенклатура.ЭтоГруппа Тогда
			ОбластьСтрока = ТабДок.Область("R" + XMLСтрока(Строка.Стр));
			ТабДок.УдалитьОбласть(ОбластьСтрока, ТипСмещенияТабличногоДокумента.ПоВертикали);
		ИначеЕсли ЦветПервогоУровня <> Неопределено И Уровень = 1 Тогда
			 ТабДок.Область(Строка.Стр, 1, Строка.Стр, ТабДок.ШиринаТаблицы).ЦветФона = ЦветПервогоУровня;
		 ИначеЕсли НЕ Номенклатура.ЭтоГруппа Тогда
			Область = ТабДок.Область(Строка.Стр, Строка.Кол);
			Область.Отступ = УдалятьСУровня;
		КонецЕсли;
		
	КонецЦикла;
	

КонецПроцедуры

Функция ПолучитьТаблицуРасшифровок(ТабДок, ДанныеРасшифровки) Экспорт
	
	//Перем ДанныеРасшифровки;
	
	

	
	ТЗРасшифровки = Новый ТаблицаЗначений();
	ТЗРасшифровки.Колонки.Добавить("Расшифровка");
	ТЗРасшифровки.Колонки.Добавить("Стр");
	ТЗРасшифровки.Колонки.Добавить("Кол");
	
	ТЗРасшифровки.Колонки.Добавить("Номенклатура");
	ТЗРасшифровки.Колонки.Добавить("Характеристика");
	
	//Попытка
	//	ДанныеРасшифровки = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
	//Исключение
	//	Возврат ТЗРасшифровки; //Пустая таблица
	//КонецПопытки;
	
	Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл
		Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
			ТекОбл = ТабДок.Область(Стр, Кол);
			Если ТекОбл.Расшифровка = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			Если Стр > 1 И ТабДок.Область(Стр - 1, Кол).Расшифровка = ТекОбл.Расшифровка Тогда
				Продолжить;
			КонецЕсли;
			Если Кол > 1 И ТабДок.Область(Стр, Кол - 1).Расшифровка = ТекОбл.Расшифровка Тогда
				Продолжить;
			КонецЕсли;
			НСтр = ТЗРасшифровки.Добавить();
			НСтр.Стр = Стр;
			НСтр.Кол = Кол;
			НСтр.Расшифровка = ТекОбл.Расшифровка;
			
			ИнформацияОРасшифровке(Нстр, ДанныеРасшифровки, НСтр.Расшифровка);
		КонецЦикла
	КонецЦикла;

	
	Возврат ТЗРасшифровки;
	
КонецФункции 

Процедура ИнформацияОРасшифровке(Строка, ДанныеРасшифровки, Расшифровка) Экспорт
	
	ЭлементРасшифровки = ДанныеРасшифровки.Элементы.Получить(Расшифровка);
	
	Если ТипЗнч(ЭлементРасшифровки) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
		Возврат;
	КонецЕсли;
	
	Поля = ЭлементРасшифровки.ПолучитьПоля();
	Для Каждого Поле ИЗ Поля Цикл
		Если ТипЗнч(Поле.Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
			Строка.Номенклатура = Поле.Значение;
		ИначеЕсли ТипЗнч(Поле.Значение) = Тип("СправочникСсылка.ХарактеристикиНоменклатуры") Тогда
			Строка.Характеристика = Поле.Значение;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Среда: УТ 11.4.13.46

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *