СКД: вывод некоторых группировок свернутыми

Задача: Есть внешний отчет для 1С Бухгалтерия для Украины 1.2 по задолженности контрагентов с 3-мя группировками: контрагент, договор и документ. Необходимо группировку по договорам по которым нет задолженности выводить в свернутом виде.

В сети по поводу группировок попадется совет использовать метод ПоказатьУровеньГруппировокСтрок(<Уровень>), который нам не подходит. Он сворачивает все группировки определенного уровня, а нам необходимо сворачивать по условию.

После обдумывания задачи имеем следующий алгоритм:

1. Создаем макеты группировок

Добавлять в них что-либо не обязательно.

Создаем макеты группировок

2. Обрабатываем макет компоновки 

При выводе отчета скомпонованный макет компоновки передаем в процедуру ПередВыводомОтчета и получаем из нее макеты группировок с помощью метода СтандартныеОтчеты.ПолучитьМакетГруппировкиПоПолюГруппировки. Полученные макеты помещаем в реквизит внешнего отчета (тут структура ДанныеОтчета).

Процедура ПередВыводомОтчета(МакетКомпоновки) Экспорт
	ДанныеОтчета = Новый Структура;
	МакетГруппировкиДоговор = СтандартныеОтчеты.ПолучитьМакетГруппировкиПоПолюГруппировки(МакетКомпоновки, "Договор");
	МакетГруппировкиДокумент = СтандартныеОтчеты.ПолучитьМакетГруппировкиПоПолюГруппировки(МакетКомпоновки, "Документ");
	МакетГруппировкиКонтрагент = СтандартныеОтчеты.ПолучитьМакетГруппировкиПоПолюГруппировки(МакетКомпоновки, "Контрагент");

	
	МассивИменМакетовГруппировкиДоговор = Новый Массив;
	Для Каждого МакетГруппировки Из МакетГруппировкиДоговор Цикл
		МассивИменМакетовГруппировкиДоговор.Добавить(МакетГруппировки.Имя);
	КонецЦикла;
		
	ДанныеОтчета.Вставить("МакетДоговор"          , МассивИменМакетовГруппировкиДоговор);
	
	МассивИменМакетовГруппировкиДокумент = Новый Массив;
	Для Каждого МакетГруппировки Из МакетГруппировкиДокумент Цикл
		МассивИменМакетовГруппировкиДокумент.Добавить(МакетГруппировки.Имя);
	КонецЦикла;
		
	ДанныеОтчета.Вставить("МакетДокумент"          , МассивИменМакетовГруппировкиДокумент);
	
	МассивИменМакетовГруппировкиКонтрагент = Новый Массив;
	Для Каждого МакетГруппировки Из МакетГруппировкиКонтрагент Цикл
		МассивИменМакетовГруппировкиКонтрагент.Добавить(МакетГруппировки.Имя);
	КонецЦикла;
		
	ДанныеОтчета.Вставить("МакетКонтрагент"          , МассивИменМакетовГруппировкиКонтрагент);	
КонецПроцедуры

3. Модифицируем стандартную процедуру ВывестиОтчет

Передаем поле табличного документа Результат в метод ПередВыводомЭлементаРезультата


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

4. Процедура ПередВыводомЭлементаРезультата

С помощью сохранненых макетов в ДанныеОтчета определяем какую именно группировку мы выводим и в зависимости от этого используем метод табличного поля НачатьГруппуСтрок(,Ложь) и ЗакончитьГруппуСтрок() . Определение долга по договору происходит через поиск параметра с выражением "Сумма(ЗадолженностьПоСрокам.ОстатокДолга)".

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

 


Похожие материалы

Комментарии