ПриСохраненииНастроекПодключенияВнешнейСистемы (БСП)

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

При сохранении настроек подключения внешней системы. Сохраняет настройки подключения для обмена с внешней системой через EnterpriseData.

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

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

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

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

ПриПолученииНастроекПодключенияВнешнейСистемы (БСП)

ВсеНастройкиТранспортаОбменаСВнешнимиСистемами (БСП)

ПередНастройкойПараметровПодключения (БСП)

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

ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение (БСП)

ПриСохраненииПрочихНастроекПользователя (БСП)

ПриНачалеСохраненияНастроекСинхронизации (БСП)

ПриПодключенииВнешнейОбработки (БСП)

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