ПредопределенныеВариантыОтчетов (БСП)

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

Предопределенные варианты отчетов. Для отчета по внедрению.

////////////////////////////////////////////////////////////////////////////////
// Для отчета по внедрению.

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

	КонецЦикла;
	
	Возврат Результат;
КонецФункции

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

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

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

СброситьНастройкиВариантаОтчета (БСП)

ОбновитьИндексПоискаПредопределенныхВариантовОтчетов (БСП)

ЗаполнитьПредставленияПредопределенныхВариантовОтчетов (БСП)

УдалитьВариантОтчета (БСП)

УдалитьПользовательскийВариантОтчета (БСП)

ПриУдаленииПользовательскихВариантовОтчета (БСП)

ТаблицаВариантовОтчетов (БСП)

ОтключенныеВариантыОтчетов (БСП)

ВариантОтчета (БСП)

TurboConf - расширение Конфигуратора 1С