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

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

Сформировать манифест. Формирует манифест дополнительного отчета или обработки.

// Формирует манифест дополнительного отчета или обработки.
// Для вызова из внешней обработки ПодготовкаДополнительныхОтчетовИОбработокКПубликацииВМоделиСервиса.epf,
// входящей в комплект поставки Менеджера сервиса. 
//
// Параметры:
//  ОбъектОбработки - СправочникОбъект.ДополнительныеОтчетыИОбработки - дополнительная обработка.
//  ОбъектВерсии - СправочникОбъект.ДополнительныеОтчетыИОбработки - дополнительная обработка.
//  ВариантыОтчета - ТаблицаЗначений - колонки:
//    * КлючВарианта - Строка - ключ варианта дополнительного отчета.
//    * Представление - Строка - представление варианта дополнительного отчета.
//    * Назначение - ТаблицаЗначений - колонки:
//       ** РазделИлиГруппа - Строка - для сопоставления с элементом справочника ИдентификаторыОбъектовМетаданных.
//       ** Важный - Булево - Истина, если выводится в группе важных.
//       ** СмТакже - Булево - Истина, если выводится в группе "См. также".
//  РасписанияКоманд - Структура - в ключах идентификаторы команд, а в значениях - расписание.
//  РазрешенияОбработки - Массив - объекты ОбъектXDTO. 
//
// Возвращаемое значение:
//  ОбъектXDTO {http://www.1c.ru/1cFresh/ApplicationExtensions/Manifest/a.b.c.d}ExtensionManifest -
//    манифест дополнительного отчета или обработки.
//
Функция СформироватьМанифест(Знач ОбъектОбработки, Знач ОбъектВерсии, Знач ВариантыОтчета = Неопределено, 
	Знач РасписанияКоманд = Неопределено, Знач РазрешенияОбработки = Неопределено) Экспорт
	
	Попытка
		РежимСовместимостиРазрешений = ОбъектОбработки.РежимСовместимостиРазрешений;
	Исключение
		РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3;
	КонецПопытки;
	
	Если РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3 Тогда
		Пакет = ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.Пакет("1.0.0.1");
	Иначе
		Пакет = ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.Пакет();
	КонецЕсли;
	
	Манифест = ФабрикаXDTO.Создать(
		ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипМанифест(Пакет));
	
	Манифест.Name = ОбъектОбработки.Наименование;
	Манифест.ObjectName = ОбъектВерсии.ИмяОбъекта;
	Манифест.Version = ОбъектВерсии.Версия;
	
	Если РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3 Тогда
		Манифест.SafeMode = ОбъектВерсии.БезопасныйРежим;
	КонецЕсли;
	
	Манифест.Description = ОбъектВерсии.Информация;
	Манифест.FileName = ОбъектВерсии.ИмяФайла;
	Манифест.UseReportVariantsStorage = ОбъектВерсии.ИспользуетХранилищеВариантов;
	
	ВидXDTO = Неопределено;
	СловарьПреобразованияВидовОбработок =
		ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.СловарьВидыДополнительныхОтчетовИОбработок();
	Для Каждого ФрагментСловаря Из СловарьПреобразованияВидовОбработок Цикл
		Если ФрагментСловаря.Значение = ОбъектВерсии.Вид Тогда
			ВидXDTO = ФрагментСловаря.Ключ;
		КонецЕсли;
	КонецЦикла;
	Если Не ЗначениеЗаполнено(ВидXDTO) Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Вид дополнительных отчетов и обработок %1 не поддерживается в модели сервиса.'"),
			ОбъектВерсии.Вид);
	КонецЕсли;
	Манифест.Category = ВидXDTO;
	
	Если ОбъектВерсии.Команды.Количество() > 0 Тогда
		
		Если ОбъектОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка 
			Или	ОбъектОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
			
			// Обработка назначения разделам
			ВыбранныеРазделы = ОбъектВерсии.Разделы.Выгрузить();
			
			Если ОбъектОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда
				ВозможныеРазделы = ДополнительныеОтчетыИОбработки.РазделыДополнительныхОбработок();
			Иначе
				ВозможныеРазделы = ДополнительныеОтчетыИОбработки.РазделыДополнительныхОтчетов();
			КонецЕсли;
			
			ИмяНачальнойСтраницы = ДополнительныеОтчетыИОбработкиКлиентСервер.ИмяНачальнойСтраницы();
			
			НазначениеXDTO = ФабрикаXDTO.Создать(
				ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипНазначениеРазделам(Пакет));
			
			Для Каждого Раздел Из ВозможныеРазделы Цикл
				
				Если Раздел = ИмяНачальнойСтраницы Тогда
					ИмяРаздела = ИмяНачальнойСтраницы;
					ИдентификаторОбъектаМетаданных = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
				Иначе
					ИмяРаздела = Раздел.ПолноеИмя();
					ИдентификаторОбъектаМетаданных = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Раздел);
				КонецЕсли;
				ПредставлениеОбъектаМетаданных = ДополнительныеОтчетыИОбработки.ПредставлениеРаздела(Раздел);
				
				ОбъектНазначенияXDTO = ФабрикаXDTO.Создать(
					ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипОбъектНазначения(Пакет));
				ОбъектНазначенияXDTO.ObjectName = ИмяРаздела;
				ОбъектНазначенияXDTO.ObjectType = "SubSystem";
				ОбъектНазначенияXDTO.Representation = ПредставлениеОбъектаМетаданных;
				ОбъектНазначенияXDTO.Enabled = ВыбранныеРазделы.Найти(ИдентификаторОбъектаМетаданных, "Раздел") <> Неопределено;
				НазначениеXDTO.Objects.Добавить(ОбъектНазначенияXDTO);
				
			КонецЦикла;
			
		Иначе
			
			// Обработка назначения объектам метаданных
			ВыбранныеОбъектыНазначения = ОбъектВерсии.Назначение.Выгрузить();
			
			ВозможныеОбъектыНазначения = Новый Массив();
			ПодключенныеОбъектыМетаданных = ДополнительныеОтчетыИОбработки.ПодключенныеОбъектыМетаданных(ОбъектОбработки.Вид);
			Для Каждого ПодключенныйОбъектМетаданных Из ПодключенныеОбъектыМетаданных Цикл
				ВозможныеОбъектыНазначения.Добавить(ПодключенныйОбъектМетаданных.Метаданные);
			КонецЦикла;
			
			НазначениеXDTO = ФабрикаXDTO.Создать(
				ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипНазначениеСправочникамИДокументам(Пакет));
			
			Для Каждого ОбъектНазначения Из ВозможныеОбъектыНазначения Цикл
				
				ИдентификаторОбъектаМетаданных = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектНазначения);
				
				ОбъектНазначенияXDTO = ФабрикаXDTO.Создать(
					ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипОбъектНазначения(Пакет));
				ОбъектНазначенияXDTO.ObjectName = ОбъектНазначения.ПолноеИмя();
				Если ОбщегоНазначения.ЭтоСправочник(ОбъектНазначения) Тогда
					ОбъектНазначенияXDTO.ObjectType = "Catalog";
				ИначеЕсли ОбщегоНазначения.ЭтоДокумент(ОбъектНазначения) Тогда
					ОбъектНазначенияXDTO.ObjectType = "Document";
				ИначеЕсли ОбщегоНазначения.ЭтоБизнесПроцесс(ОбъектНазначения) Тогда
					ОбъектНазначенияXDTO.ObjectType = "BusinessProcess";
				ИначеЕсли ОбщегоНазначения.ЭтоЗадача(ОбъектНазначения) Тогда
					ОбъектНазначенияXDTO.ObjectType = "Task";
				КонецЕсли;
				ОбъектНазначенияXDTO.Representation = ОбъектНазначения.Представление();
				ОбъектНазначенияXDTO.Enabled = ВыбранныеОбъектыНазначения.Найти(ИдентификаторОбъектаМетаданных, "ОбъектНазначения") <> Неопределено;
				
				НазначениеXDTO.Objects.Добавить(ОбъектНазначенияXDTO);
				
			КонецЦикла;
			
			НазначениеXDTO.UseInListsForms = ОбъектВерсии.ИспользоватьДляФормыСписка;
			НазначениеXDTO.UseInObjectsForms = ОбъектВерсии.ИспользоватьДляФормыОбъекта;
			
		КонецЕсли;
		
		Манифест.Assignment = НазначениеXDTO;
		
		Для Каждого ОписаниеКоманды Из ОбъектВерсии.Команды Цикл
			
			КомандаXDTO = ФабрикаXDTO.Создать(
				ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипКоманда(Пакет));
			КомандаXDTO.Id = ОписаниеКоманды.Идентификатор;
			КомандаXDTO.Representation = ОписаниеКоманды.Представление;
			
			ТипЗапускаXDTO = Неопределено;
			СловарьПреобразованияСпособовВызова =
				ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.СловарьСпособыВызоваДополнительныхОтчетовИОбработок();
			Для Каждого ФрагментСловаря Из СловарьПреобразованияСпособовВызова Цикл
				Если ФрагментСловаря.Значение = ОписаниеКоманды.ВариантЗапуска Тогда
					ТипЗапускаXDTO = ФрагментСловаря.Ключ;
				КонецЕсли;
			КонецЦикла;
			Если Не ЗначениеЗаполнено(ТипЗапускаXDTO) Тогда
				ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Способ запуска дополнительных отчетов и обработок %1 не поддерживается в модели сервиса.'"),
					ОписаниеКоманды.ВариантЗапуска);
			КонецЕсли;
			КомандаXDTO.StartupType = ТипЗапускаXDTO;
			КомандаXDTO.ShowNotification = ОписаниеКоманды.ПоказыватьОповещение;
			КомандаXDTO.Modifier = ОписаниеКоманды.Модификатор;
			
			Если ЗначениеЗаполнено(РасписанияКоманд) Тогда
				РасписаниеКоманды = Неопределено;
				Если РасписанияКоманд.Свойство(ОписаниеКоманды.Идентификатор, РасписаниеКоманды) Тогда
					КомандаXDTO.DefaultSettings = ФабрикаXDTO.Создать(
						ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипНастройкиКоманды(Пакет));
					КомандаXDTO.DefaultSettings.Schedule = СериализаторXDTO.ЗаписатьXDTO(РасписаниеКоманды);
				КонецЕсли;
			КонецЕсли;
			Манифест.Commands.Добавить(КомандаXDTO);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ВариантыОтчета) Тогда
		
		Для Каждого ВариантОтчета Из ВариантыОтчета Цикл
			
			ВариантXDTO = ФабрикаXDTO.Создать(
				ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипВариантОтчета(Пакет));
			ВариантXDTO.VariantKey = ВариантОтчета.КлючВарианта;
			ВариантXDTO.Representation = ВариантОтчета.Представление;
			
			Если ВариантОтчета.Назначение <> Неопределено Тогда
				
				Для Каждого НазначениеВариантаОтчета Из ВариантОтчета.Назначение Цикл
					
					НазначениеXDTO = ФабрикаXDTO.Создать(
						ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипНазначениеВариантаОтчета(Пакет));
					
					НазначениеXDTO.ObjectName = НазначениеВариантаОтчета.ПолноеИмя;
					НазначениеXDTO.Representation = НазначениеВариантаОтчета.Представление;
					НазначениеXDTO.Parent = НазначениеВариантаОтчета.ПолноеИмяРодителя;
					НазначениеXDTO.Enabled = НазначениеВариантаОтчета.Использование;
					
					Если НазначениеВариантаОтчета.Важный Тогда
						НазначениеXDTO.Importance = "High";
					ИначеЕсли НазначениеВариантаОтчета.СмТакже Тогда
						НазначениеXDTO.Importance = "Low";
					Иначе
						НазначениеXDTO.Importance = "Ordinary";
					КонецЕсли;
					
					ВариантXDTO.Assignments.Добавить(НазначениеXDTO);
					
				КонецЦикла;
				
			КонецЕсли;
			
			Манифест.ReportVariants.Добавить(ВариантXDTO);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Если РазрешенияОбработки = Неопределено Тогда
		
		РазрешенияОбработки = ОбъектОбработки.Разрешения;
		
	КонецЕсли;
	
	Для Каждого Разрешение Из РазрешенияОбработки Цикл
		
		Если ТипЗнч(Разрешение) = Тип("ОбъектXDTO") Тогда
			Манифест.Permissions.Добавить(Разрешение);
		Иначе
			
			Если РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3 Тогда
				РазрешениеXDTO = ФабрикаXDTO.Создать(
					ФабрикаXDTO.Тип(
						"http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/1.0.0.1",
						Разрешение.ВидРазрешения));
			Иначе
				РазрешениеXDTO = ФабрикаXDTO.Создать(
					ФабрикаXDTO.Тип(
						"http://www.1c.ru/1cFresh/Application/Permissions/1.0.0.1",
						Разрешение.ВидРазрешения));
			КонецЕсли;
			
			Параметры = Разрешение.Параметры.Получить();
			Если Параметры <> Неопределено Тогда
				Для Каждого Параметр Из Параметры Цикл
					РазрешениеXDTO[Параметр.Ключ] = Параметр.Значение;
				КонецЦикла;
			КонецЕсли;
			Манифест.Permissions.Добавить(РазрешениеXDTO);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Манифест;
	
КонецФункции

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

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

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

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

МанифестНеЗадан (БСП)

МанифестНеВерногоФормата (БСП)

ОтсутствуетСвойствоМанифеста (БСП)

ИмяФайлаМанифеста (БСП)

ПриФормированииМанифестаКонфигурации (БСП)

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