СформироватьОтчет (БСП)

Автор: 1С
ОбщийМодуль.ВариантыОтчетов
БСП

Сформировать отчет. Формирует отчет с указанными параметрами.

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

СформироватьОтчет (БСП)

ИмпортФайловСформироватьОтчет (БСП)

СформироватьИнформациюОбОтчетеПоПолномуИмени (БСП)

СформироватьОтчетВФоне (БСП)

СформироватьМанифест (БСП)

СформироватьЗаявлениеДляПодписания (БСП)

СформироватьСообщениеИОтправить (БСП)

СформироватьСообщениеВФоне (БСП)

СформироватьПечатныеФормы (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз