УстановитьПоставляемуюОбработкуВОбластьДанных (БСП)

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

Установить поставляемую обработку область данных. Выполняет установку поставляемой дополнительной обработки в текущую область данных.

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

КонецПроцедуры

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

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

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

УстановитьПоставляемуюОбработкуПриПолучении (БСП)

ОтозватьПоставляемуюДополнительнуюОбработку (БСП)

ПриОбработкеОбластиДанных (БСП)

УдалитьПоставляемуюОбработкуИзОбластиДанных (БСП)

УстановитьПоставляемоеРасширениеПриПолучении (БСП)

УстановитьПоставляемоеРасширениеВОбластьДанных (БСП)

ОбластиТребующиеОбработки (БСП)

УстановитьРежимПодключенияДополнительногоОтчетаИлиОбработкиВОбластиДанных (БСП)

ОтозватьПоставляемоеРасширение (БСП)

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