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