При сохранении настроек подключения внешней системы. Сохраняет настройки подключения для обмена с внешней системой через 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
///////////////////////////////////////////////////////////////////////////////////////////////////////
ПриПолученииНастроекПодключенияВнешнейСистемы (БСП)
ВсеНастройкиТранспортаОбменаСВнешнимиСистемами (БСП)
ПередНастройкойПараметровПодключения (БСП)
ПолучитьВерсииИнтерфейсаЧерезВнешнееСоединение (БСП)
ПриСохраненииПрочихНастроекПользователя (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)