Отчет пустой? Делаем проверку для СКД

29 декабря 2015

Отчет "Комбинации чисел" с проверкой на заполненность

Пример отчета из статьи с проверкой на заполненность.

О чем речь

Решая задачи, в которых нужно выполнять формирование отчета программно, бывает необходимым проверить наличие результата в отчете. То есть, узнать пустой он или нет. Сегодня мы рассмотрим небольшой пример реализации такой проверки при программном формировании отчета на системе компоновки данных (СКД). Далее Вы можете видеть результат:

Проверка отчета на заполненность

Отчет формирует все возможные комбинации 6 цифр, диапазон который указывается в шапке. При оказании диапазона от 1 до 3 отчет показывает сформированные комбинации, если же указать диапазон от 1 до 0, то отчет будет пустым, т.к. такой диапазон ошибочный. При этом в шапке отчета изменяется значение поля "Отчет пустой".

Реализация проверки

Как уже говорилось выше, отчет построен на базе СКД. В модуле объекта отчета используется событие "ПриКомпоновкеРезультата", в котором программно формируется результат отчета. Листинг события приведен ниже:

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

	// Установим реквизит отчета, чтобы флаг пустой отчет или нет был виден на форме
	НастройкиОтчета.ДополнительныеСвойства.Свойство("ОтчетПустой", ЭтотОбъект.ОтчетПустой);
	
КонецПроцедуры

На листинге даны комментарии практически к каждому шагу программного формирования отчета. Нас больше всего интересует часть кода в конце процедуры, где проверяется заполненность отчета. Здесь, при поэлементном выводе отчета, проверяется заполненность значений параметров элемента компоновки. Если хотя бы 1 элемент заполнен, то отчет не считается пустым. Значения компоновки - это те значения, которые будут выведены в табличный документ для текущего элемента компоновки (строка таблицы отчета, группировка и др.).

Добавлять в отчет реквизит "ОтчетПустой" не обязательно. Здесь это сделано лишь для примера.

Пример использования

Сделаем регламентное задание, которое будет запускать формирование отчета, и, если он не пустой, отправлять результат по почте. Обработчик регламентного задания будет выглядеть примерно так:

Процедура РассылкаОтчета()
	
	ТабДок = Новый ТабличныйДокумент;
	ОтчетДляРассылки = Отчеты.ПроверкаОтчетаНаЗаполненность.Создать();
	ОтчетДляРассылки.СкомпоноватьРезультат(ТабДок);
	
	ОтчетПустой = Истина;
	Если ОтчетДляРассылки.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Свойство("ОтчетПустой", ОтчетПустой)
		И ОтчетПустой = Ложь Тогда
		ОтвправитьТабличныйДокументПоПочте(ТабДок);	
	КонецЕсли;	
	
КонецПроцедуры

Здесь мы сначала компонуем результат, а после проверяем параметр "ОтчетПустой" в настройках компоновщика. Если отчет не пустой, то отправляем сформированный табличный документ на электронную почту.

Листинг процедуры отправки на электронную почту выкладывать не вижу смысла. Проблем с отправкой быть не должно.

Это конец

На этом все, надеюсь, материал окажется Вам полезным.

Должен признаться, что подобный метод проверки отчетов на заполненность в свое время подглядел в конфигурации 1С:Документооборот, поэтому некоторый плагиат в статье конечно есть =) Но я думаю разработчики из фирмы "1С" не обидятся.

Близится конец 2015 года! Поздравляю всех с наступающим Новым Годом! 

Желаю успехов во всех делах и нескончаемой энергии в будущем году!

  СКД

comments powered by Disqus