#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ОбработчикиСобытий
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
Если ВидФормы = "ФормаЗаписи" Тогда
СтандартнаяОбработка = Ложь;
Если Параметры.Ключ.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов Тогда
ВыбраннаяФорма = "РегистрСведений.ПравилаДляОбменаДанными.Форма.ПравилаКонвертацииОбъектов";
ИначеЕсли Параметры.Ключ.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов Тогда
ВыбраннаяФорма = "РегистрСведений.ПравилаДляОбменаДанными.Форма.ПравилаРегистрацииОбъектов";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Функция ПравилаКонвертацииСовместимыСТекущейВерсией(ИмяПланаОбмена, ОписаниеОшибки, ДанныеОПравилах) Экспорт
Если Не ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ПредупреждатьОНесоответствииВерсийПравилОбмена") Тогда
Возврат Истина;
КонецЕсли;
ИмяКонфигурацииИзПравил = ВРег(ДанныеОПравилах.ИмяКонфигурации);
ИмяКонфигурацииИнформационнойБазы = СтрЗаменить(ВРег(Метаданные.Имя), "БАЗОВАЯ", "");
Если ИмяКонфигурацииИзПравил <> ИмяКонфигурацииИнформационнойБазы Тогда
ОписаниеОшибки = Новый Структура;
ОписаниеОшибки.Вставить("ВидОшибки", "НекорректнаяКонфигурация");
ОписаниеОшибки.Вставить("Картинка", БиблиотекаКартинок.Ошибка32);
ОписаниеОшибки.Вставить("ТекстОшибки",
НСтр("ru = 'Правила не могут быть загружены, так как они предназначены для программы ""%1"".
|Следует использовать правила из конфигурации или загрузить корректный комплект правил из файла.'"));
ОписаниеОшибки.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ОписаниеОшибки.ТекстОшибки,
ДанныеОПравилах.СинонимКонфигурацииВПравилах);
Возврат Ложь;
КонецЕсли;
ВерсияВПравилах = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(ДанныеОПравилах.ВерсияКонфигурации);
ВерсияКонфигурации = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(Метаданные.Версия);
РезультатСравнения = ОбщегоНазначенияКлиентСервер.СравнитьВерсииБезНомераСборки(ВерсияВПравилах, ВерсияКонфигурации);
Если РезультатСравнения <> 0 Тогда
Если РезультатСравнения < 0 Тогда
ТекстОшибки = НСтр("ru = 'Синхронизация данных может работать некорректно, так как загружаемые правила предназначены для предыдущей версии программы ""%1"" (%2).
|Рекомендуется использовать правила из конфигурации или загрузить комплект правил, предназначенный для текущей версии программы (%3).'");
ВидОшибки = "УстаревшиеПравила";
Иначе
ТекстОшибки = НСтр("ru = 'Синхронизация данных может работать некорректно, так как загружаемые правила предназначены для более новой версии программы ""%1"" (%2).
|Рекомендуется обновить версию программы или использовать комплект правил, предназначенный для текущей версии программы (%3).'");
ВидОшибки = "УстаревшаяВерсияКонфигурации";
КонецЕсли;
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки,
Метаданные.Синоним, ВерсияВПравилах, ВерсияКонфигурации);
ОписаниеОшибки = Новый Структура;
ОписаниеОшибки.Вставить("ТекстОшибки", ТекстОшибки);
ОписаниеОшибки.Вставить("ВидОшибки", ВидОшибки);
ОписаниеОшибки.Вставить("Картинка", БиблиотекаКартинок.Предупреждение32);
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ЗагрузитьПоставляемыеПравила(ИмяПланаОбмена, ИмяФайлаПравил) Экспорт
Файл = Новый Файл(ИмяФайлаПравил);
ИмяФайла = Файл.Имя;
ИмяВременногоКаталога = ПолучитьИмяВременногоФайла("");
Если ОбменДаннымиСервер.РаспаковатьZipФайл(ИмяФайлаПравил, ИмяВременногоКаталога) Тогда
СписокРаспакованныхФайлов = НайтиФайлы(ИмяВременногоКаталога, ПолучитьМаскуВсеФайлы(), Истина);
Если СписокРаспакованныхФайлов.Количество() = 0 Тогда
ВызватьИсключение НСтр("ru = 'При распаковке архива не найден файл с правилами.'");
КонецЕсли;
Если СписокРаспакованныхФайлов.Количество() <> 3 Тогда
ВызватьИсключение НСтр("ru = 'Неверный формат комплекта правил. Ожидаемое количество файлов в архиве - три. Ожидаются файлы:
|ExchangeRules.xml - правила конвертации для текущей программы;
|CorrespondentExchangeRules.xml - правила конвертации для программы-корреспондента;
|RegistrationRules.xml - правила регистрации для текущей программы.'");
КонецЕсли;
Для Каждого ПолученныйФайл Из СписокРаспакованныхФайлов Цикл
Если ПолученныйФайл.Имя = "ExchangeRules.xml" Тогда
ДвоичныеДанные = Новый ДвоичныеДанные(ПолученныйФайл.ПолноеИмя);
ИначеЕсли ПолученныйФайл.Имя ="CorrespondentExchangeRules.xml" Тогда
ДвоичныеДанныеКорреспондента = Новый ДвоичныеДанные(ПолученныйФайл.ПолноеИмя);
ИначеЕсли ПолученныйФайл.Имя ="RegistrationRules.xml" Тогда
ДвоичныеДанныеРегистрации = Новый ДвоичныеДанные(ПолученныйФайл.ПолноеИмя);
Иначе
ВызватьИсключение НСтр("ru = 'Имена файлов в архиве не соответствуют ожидаемым. Ожидаются файлы:
|ExchangeRules.xml - правила конвертации для текущей программы;
|CorrespondentExchangeRules.xml - правила конвертации для программы-корреспондента;
|RegistrationRules.xml - правила регистрации для текущей программы.'");
КонецЕсли;
КонецЦикла;
Иначе
ВызватьИсключение НСтр("ru = 'Не удалось распаковать архив с правилами.'");
КонецЕсли;
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоКаталога);
ИнформацияОПравилахКонвертации = "[ИнформацияОПравилахИсточника]
|
|[ИнформацияОПравилахКорреспондента]";
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
КонвертацияОбъектовИнформационныхБаз = НоваяОбработкаКонвертацияОбъектовИнформационныхБаз("Выгрузка", ИмяПланаОбмена);
ОбменДаннымиСервер.УстановитьНастройкиОтладкиВыгрузкиДляПравилОбмена(КонвертацияОбъектовИнформационныхБаз, ИмяПланаОбмена, Ложь);
ПравилаЗачитанные = КонвертацияОбъектовИнформационныхБаз.ПравилаОбмена(ИмяВременногоФайла);
ИнформацияОПравилахИсточника = КонвертацияОбъектовИнформационныхБаз.ИнформацияОПравилах(Ложь);
ИмяВременногоФайлаКорреспондента = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанныеКорреспондента.Записать(ИмяВременногоФайлаКорреспондента);
КонвертацияОбъектовИнформационныхБаз = НоваяОбработкаКонвертацияОбъектовИнформационныхБаз("Загрузка", ИмяПланаОбмена);
ПравилаЗачитанныеКорреспондента = КонвертацияОбъектовИнформационныхБаз.ПравилаОбмена(ИмяВременногоФайлаКорреспондента);
ИнформацияОПравилахКорреспондента = КонвертацияОбъектовИнформационныхБаз.ИнформацияОПравилах(Истина);
ИнформацияОПравилахКонвертации = СтрЗаменить(ИнформацияОПравилахКонвертации, "[ИнформацияОПравилахИсточника]", ИнформацияОПравилахИсточника);
ИнформацияОПравилахКонвертации = СтрЗаменить(ИнформацияОПравилахКонвертации, "[ИнформацияОПравилахКорреспондента]", ИнформацияОПравилахКорреспондента);
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайла);
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайлаКорреспондента);
ЗаписьПравилКонвертации = СоздатьМенеджерЗаписи();
ЗаписьПравилКонвертации.ИмяПланаОбмена = ИмяПланаОбмена;
ЗаписьПравилКонвертации.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов;
ЗаписьПравилКонвертации.ИмяМакетаПравил = "ПравилаОбмена";
ЗаписьПравилКонвертации.ИмяМакетаПравилКорреспондента = "ПравилаОбменаКорреспондента";
ЗаписьПравилКонвертации.ИмяПланаОбменаИзПравил = ИмяПланаОбмена;
ЗаписьПравилКонвертации.ИмяФайлаПравил = ИмяФайла;
ЗаписьПравилКонвертации.ИнформацияОПравилах = ИнформацияОПравилахКонвертации;
ЗаписьПравилКонвертации.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.Файл;
ЗаписьПравилКонвертации.ПравилаXML = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
ЗаписьПравилКонвертации.ПравилаXMLКорреспондента = Новый ХранилищеЗначения(ДвоичныеДанныеКорреспондента, Новый СжатиеДанных());
ЗаписьПравилКонвертации.ПравилаЗачитанные = Новый ХранилищеЗначения(ПравилаЗачитанные);
ЗаписьПравилКонвертации.ПравилаЗачитанныеКорреспондента = Новый ХранилищеЗначения(ПравилаЗачитанныеКорреспондента);
ЗаписьПравилКонвертации.РежимОтладки = Ложь;
ЗаписьПравилКонвертации.ПравилаЗагружены = Истина;
ЗаписьПравилКонвертации.Записать();
ЗагрузитьПравилаРегистрацииОбъектов(ДвоичныеДанныеРегистрации, ИмяФайла, ИмяПланаОбмена);
КонецПроцедуры
Процедура ЗагрузитьПоставляемыеПравилаРегистрацииОбъектов(ИмяПланаОбмена, ИмяФайлаПравил) Экспорт
Файл = Новый Файл(ИмяФайлаПравил);
ИмяФайла = Файл.Имя;
ДвоичныеДанныеРегистрации = Новый ДвоичныеДанные(ИмяФайлаПравил);
ЗагрузитьПравилаРегистрацииОбъектов(ДвоичныеДанныеРегистрации, ИмяФайла, ИмяПланаОбмена);
КонецПроцедуры
Процедура ЗагрузитьПравилаРегистрацииОбъектов(ДвоичныеДанные, ИмяФайла, ИмяПланаОбмена)
ИмяВременногоФайлаРегистрации = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные.Записать(ИмяВременногоФайлаРегистрации);
ЗагрузкаПравилРегистрации = Обработки.ЗагрузкаПравилРегистрацииОбъектов.Создать();
ЗагрузкаПравилРегистрации.ИмяПланаОбменаДляЗагрузки = ИмяПланаОбмена;
ЗагрузкаПравилРегистрации.ЗагрузитьПравила(ИмяВременногоФайлаРегистрации);
ПравилаРегистрацииЗачитанные = ЗагрузкаПравилРегистрации.ПравилаРегистрацииОбъектов;
ИнформацияОПравилахРегистрации = ЗагрузкаПравилРегистрации.ИнформацияОПравилах();
Если ЗагрузкаПравилРегистрации.ФлагОшибки Тогда
ВызватьИсключение НСтр("ru = 'Ошибка при загрузке правил регистрации.'");
КонецЕсли;
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайлаРегистрации);
ЗаписьПравилРегистрации = СоздатьМенеджерЗаписи();
ЗаписьПравилРегистрации.ИмяПланаОбмена = ИмяПланаОбмена;
ЗаписьПравилРегистрации.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов;
ЗаписьПравилРегистрации.ИмяМакетаПравил = "ПравилаРегистрации";
ЗаписьПравилРегистрации.ИмяПланаОбменаИзПравил = ИмяПланаОбмена;
ЗаписьПравилРегистрации.ИмяФайлаПравил = ИмяФайла;
ЗаписьПравилРегистрации.ИнформацияОПравилах = ИнформацияОПравилахРегистрации;
ЗаписьПравилРегистрации.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.Файл;
ЗаписьПравилРегистрации.ПравилаXML = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
ЗаписьПравилРегистрации.ПравилаЗачитанные = Новый ХранилищеЗначения(ПравилаРегистрацииЗачитанные);
ЗаписьПравилРегистрации.ПравилаЗагружены = Истина;
ЗаписьПравилРегистрации.Записать();
КонецПроцедуры
Процедура УдалитьПоставляемыеПравила(ИмяПланаОбмена) Экспорт
Для Каждого ВидПравил Из Перечисления.ВидыПравилДляОбменаДанными Цикл
УдалитьПравила(ИмяПланаОбмена, ВидПравил);
КонецЦикла;
КонецПроцедуры
Процедура УдалитьПоставляемыеПравилаРегистрацииОбъектов(ИмяПланаОбмена) Экспорт
УдалитьПравила(ИмяПланаОбмена, Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов);
КонецПроцедуры
Процедура УдалитьПравила(ИмяПланаОбмена, ВидПравил)
МенеджерЗаписи = СоздатьМенеджерЗаписи();
МенеджерЗаписи.ВидПравил = ВидПравил;
МенеджерЗаписи.ИмяПланаОбмена = ИмяПланаОбмена;
МенеджерЗаписи.Прочитать();
МенеджерЗаписи.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации;
ЕстьОшибки = Ложь;
ЗагрузитьПравила(ЕстьОшибки, МенеджерЗаписи);
Если ЕстьОшибки Тогда
ВызватьИсключение НСтр("ru = 'Ошибка при загрузке правил из конфигурации.'");
Иначе
МенеджерЗаписи.Записать();
КонецЕсли;
КонецПроцедуры
Функция ИспользуютсяТиповыеПравила(ИмяПланаОбмена) Экспорт
ТекстЗапроса = "
|ВЫБРАТЬ
| ПравилаДляОбменаДанными.ПравилаXML КАК ПравилаXML
|ИЗ
| РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными
|ГДЕ
| ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена
| И ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов)
| И ПравилаДляОбменаДанными.ПравилаЗагружены
|";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Ложь;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
ДвоичныеДанныеПравил = Выборка.ПравилаXML.Получить();
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанныеПравил.Записать(ИмяВременногоФайла);
ПравилаОбмена = Новый ЧтениеXML();
ПравилаОбмена.ОткрытьФайл(ИмяВременногоФайла);
ПравилаТиповые = Ложь;
Пока ПравилаОбмена.Прочитать() Цикл
ИмяУзла = ПравилаОбмена.ЛокальноеИмя;
Если ИмяУзла = "ВерсияФормата" Тогда
Пока ПравилаОбмена.ПрочитатьАтрибут() Цикл
Если ПравилаОбмена.ЛокальноеИмя = "Типовые" Тогда
ПравилаТиповые = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Прервать;
КонецЕсли;
КонецЦикла;
ПравилаОбмена.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
Возврат ПравилаТиповые;
КонецФункции
Функция НоваяОбработкаКонвертацияОбъектовИнформационныхБаз(РежимОбмена, ИмяПланаОбмена)
КонвертацияОбъектовИнформационныхБаз = Обработки.КонвертацияОбъектовИнформационныхБаз.Создать();
КонвертацияОбъектовИнформационныхБаз.РежимОбмена = РежимОбмена;
КонвертацияОбъектовИнформационныхБаз.ИмяПланаОбменаВРО = ИмяПланаОбмена;
КонвертацияОбъектовИнформационныхБаз.УстановитьКлючСообщенияЖурналаРегистрации(
ОбменДаннымиСервер.СобытиеЖурналаРегистрацииЗагрузкаПравилДляОбменаДанными());
Возврат КонвертацияОбъектовИнформационныхБаз;
КонецФункции
Процедура ЗагрузитьПравила(Отказ, Запись, АдресВременногоХранилища = "", ИмяФайлаПравил = "", ЭтоАрхив = Ложь) Экспорт
СписокПлановОбмена = ОбменДаннымиПовтИсп.ПланыОбменаБСП();
Если СписокПлановОбмена.Найти(Запись.ИмяПланаОбмена) = Неопределено Тогда
НСтрока = НСтр("ru = 'План обмена %1 не используется для синхронизации данных, правила не обновлены.'");
НСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, Запись.ИмяПланаОбмена);
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
Иначе
ВыполнитьПроверкуЗаполненияПолей(Отказ, Запись);
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
ЭтоПравилаКонвертации = (Запись.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов);
Если Запись.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации Тогда
ДвоичныеДанные = ДвоичныеДанныеИзМакетаКонфигурации(Отказ, Запись.ИмяПланаОбмена, Запись.ИмяМакетаПравил);
Если ЭтоПравилаКонвертации Тогда
Если ПустаяСтрока(Запись.ИмяМакетаПравилКорреспондента) Тогда
Запись.ИмяМакетаПравилКорреспондента = Запись.ИмяМакетаПравил + "Корреспондента";
КонецЕсли;
ДвоичныеДанныеКорреспондента = ДвоичныеДанныеИзМакетаКонфигурации(Отказ, Запись.ИмяПланаОбмена, Запись.ИмяМакетаПравилКорреспондента);
КонецЕсли;
Иначе
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
КонецЕсли;
Если ЭтоАрхив Тогда
ИмяВременногоАрхива = ПолучитьИмяВременногоФайла("zip");
ДвоичныеДанные.Записать(ИмяВременногоАрхива);
ИмяВременногоКаталога = ПолучитьИмяВременногоФайла("");
Если ОбменДаннымиСервер.РаспаковатьZipФайл(ИмяВременногоАрхива, ИмяВременногоКаталога) Тогда
СписокРаспакованныхФайлов = НайтиФайлы(ИмяВременногоКаталога, ПолучитьМаскуВсеФайлы(), Истина);
Если СписокРаспакованныхФайлов.Количество() = 0 Тогда
НСтрока = НСтр("ru = 'При распаковке архива не найден файл с правилами.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
Если ЭтоПравилаКонвертации Тогда
Если СписокРаспакованныхФайлов.Количество() = 2 Тогда
Если СписокРаспакованныхФайлов[0].Имя = "ExchangeRules.xml"
И СписокРаспакованныхФайлов[1].Имя ="CorrespondentExchangeRules.xml" Тогда
ДвоичныеДанные = Новый ДвоичныеДанные(СписокРаспакованныхФайлов[0].ПолноеИмя);
ДвоичныеДанныеКорреспондента = Новый ДвоичныеДанные(СписокРаспакованныхФайлов[1].ПолноеИмя);
ИначеЕсли СписокРаспакованныхФайлов[1].Имя = "ExchangeRules.xml"
И СписокРаспакованныхФайлов[0].Имя ="CorrespondentExchangeRules.xml" Тогда
ДвоичныеДанные = Новый ДвоичныеДанные(СписокРаспакованныхФайлов[1].ПолноеИмя);
ДвоичныеДанныеКорреспондента = Новый ДвоичныеДанные(СписокРаспакованныхФайлов[0].ПолноеИмя);
Иначе
НСтрока = НСтр("ru = 'Имена файлов в архиве не соответствуют ожидаемым. Ожидаются файлы:
|ExchangeRules.xml - правила конвертации для текущей программы;
|CorrespondentExchangeRules.xml - правила конвертации для программы-корреспондента.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
ИначеЕсли СписокРаспакованныхФайлов.Количество() = 1 Тогда
НСтрока = НСтр("ru = 'В архиве найден один файл правил конвертации. Ожидаемое количество файлов в архиве - два. Ожидаются файлы:
|ExchangeRules.xml - правила конвертации для текущей программы;
|CorrespondentExchangeRules.xml - правила конвертации для программы-корреспондента.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
ИначеЕсли СписокРаспакованныхФайлов.Количество() > 1 Тогда
НСтрока = НСтр("ru = 'При распаковке архива найдено несколько файлов. Должен быть только один файл с правилами.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
Иначе
Если СписокРаспакованныхФайлов.Количество() = 1 Тогда
ДвоичныеДанные = Новый ДвоичныеДанные(СписокРаспакованныхФайлов[0].ПолноеИмя);
ИначеЕсли СписокРаспакованныхФайлов.Количество() > 1 Тогда
НСтрока = НСтр("ru = 'При распаковке архива найдено несколько файлов. Должен быть только один файл с правилами.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
КонецЕсли;
Иначе
НСтрока = НСтр("ru = 'Не удалось распаковать архив с правилами.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоКаталога);
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоАрхива);
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Если ЭтоПравилаКонвертации Тогда
КонвертацияОбъектовИнформационныхБаз = НоваяОбработкаКонвертацияОбъектовИнформационныхБаз("Выгрузка", Запись.ИмяПланаОбмена);
ОбменДаннымиСервер.УстановитьНастройкиОтладкиВыгрузкиДляПравилОбмена(КонвертацияОбъектовИнформационныхБаз, Запись.ИмяПланаОбмена, Запись.РежимОтладки);
ПравилаЗачитанные = КонвертацияОбъектовИнформационныхБаз.ПравилаОбмена(ИмяВременногоФайла);
ИнформацияОПравилах = КонвертацияОбъектовИнформационныхБаз.ИнформацияОПравилах(Ложь);
Если КонвертацияОбъектовИнформационныхБаз.ФлагОшибки() Тогда
Отказ = Истина;
КонецЕсли;
ИмяВременногоФайлаКорреспондента = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанныеКорреспондента.Записать(ИмяВременногоФайлаКорреспондента);
КонвертацияОбъектовИнформационныхБаз = НоваяОбработкаКонвертацияОбъектовИнформационныхБаз("Загрузка", Запись.ИмяПланаОбмена);
ПравилаЗачитанныеКорреспондента = КонвертацияОбъектовИнформационныхБаз.ПравилаОбмена(ИмяВременногоФайлаКорреспондента);
УдалитьФайлы(ИмяВременногоФайлаКорреспондента);
ИнформацияОПравилахКорреспондента = КонвертацияОбъектовИнформационныхБаз.ИнформацияОПравилах(Истина);
Если КонвертацияОбъектовИнформационныхБаз.ФлагОшибки() Тогда
Отказ = Истина;
КонецЕсли;
ИнформацияОПравилах = ИнформацияОПравилах + Символы.ПС + Символы.ПС + ИнформацияОПравилахКорреспондента;
Иначе
ЗагрузкаПравилРегистрации = Обработки.ЗагрузкаПравилРегистрацииОбъектов.Создать();
ЗагрузкаПравилРегистрации.ИмяПланаОбменаДляЗагрузки = Запись.ИмяПланаОбмена;
ЗагрузкаПравилРегистрации.ЗагрузитьПравила(ИмяВременногоФайла);
ПравилаЗачитанные = ЗагрузкаПравилРегистрации.ПравилаРегистрацииОбъектов;
ИнформацияОПравилах = ЗагрузкаПравилРегистрации.ИнформацияОПравилах();
Если ЗагрузкаПравилРегистрации.ФлагОшибки Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайла);
Если Не Отказ Тогда
Запись.ПравилаXML = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
Запись.ПравилаЗачитанные = Новый ХранилищеЗначения(ПравилаЗачитанные);
Если ЭтоПравилаКонвертации Тогда
Запись.ПравилаXMLКорреспондента = Новый ХранилищеЗначения(ДвоичныеДанныеКорреспондента, Новый СжатиеДанных());
Запись.ПравилаЗачитанныеКорреспондента = Новый ХранилищеЗначения(ПравилаЗачитанныеКорреспондента);
КонецЕсли;
Запись.ИнформацияОПравилах = ИнформацияОПравилах;
Запись.ИмяФайлаПравил = ИмяФайлаПравил;
Запись.ПравилаЗагружены = Истина;
Запись.ИмяПланаОбменаИзПравил = Запись.ИмяПланаОбмена;
КонецЕсли;
КонецПроцедуры
Процедура ЗагрузитьКомплектПравил(Отказ, ДанныеДляЗаписи, ОписаниеОшибки, АдресВременногоХранилища = "", ИмяФайлаПравил = "") Экспорт
ЗаписьПравилКонвертации = ДанныеДляЗаписи.ЗаписьПравилКонвертации;
ЗаписьПравилРегистрации = ДанныеДляЗаписи.ЗаписьПравилРегистрации;
Если ЗаписьПравилКонвертации.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации Тогда
ДвоичныеДанные = ДвоичныеДанныеИзМакетаКонфигурации(Отказ, ЗаписьПравилКонвертации.ИмяПланаОбмена, ЗаписьПравилКонвертации.ИмяМакетаПравил);
ДвоичныеДанныеКорреспондента = ДвоичныеДанныеИзМакетаКонфигурации(Отказ, ЗаписьПравилКонвертации.ИмяПланаОбмена, ЗаписьПравилКонвертации.ИмяМакетаПравилКорреспондента);
ДвоичныеДанныеРегистрации = ДвоичныеДанныеИзМакетаКонфигурации(Отказ, ЗаписьПравилРегистрации.ИмяПланаОбмена, ЗаписьПравилРегистрации.ИмяМакетаПравил);
Иначе
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
КонецЕсли;
Если ЗаписьПравилКонвертации.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.Файл Тогда
ИмяВременногоАрхива = ПолучитьИмяВременногоФайла("zip");
ДвоичныеДанные.Записать(ИмяВременногоАрхива);
ИмяВременногоКаталога = ПолучитьИмяВременногоФайла("");
Если ОбменДаннымиСервер.РаспаковатьZipФайл(ИмяВременногоАрхива, ИмяВременногоКаталога) Тогда
СписокРаспакованныхФайлов = НайтиФайлы(ИмяВременногоКаталога, ПолучитьМаскуВсеФайлы(), Истина);
Если СписокРаспакованныхФайлов.Количество() = 0 Тогда
НСтрока = НСтр("ru = 'При распаковке архива не найден файл с правилами.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
Если СписокРаспакованныхФайлов.Количество() <> 3 Тогда
НСтрока = НСтр("ru = 'Неверный формат комплекта правил. Ожидаемое количество файлов в архиве - три. Ожидаются файлы:
|ExchangeRules.xml - правила конвертации для текущей программы;
|CorrespondentExchangeRules.xml - правила конвертации для программы-корреспондента;
|RegistrationRules.xml - правила регистрации для текущей программы.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
Для Каждого ПолученныйФайл Из СписокРаспакованныхФайлов Цикл
Если ПолученныйФайл.Имя = "ExchangeRules.xml" Тогда
ДвоичныеДанные = Новый ДвоичныеДанные(ПолученныйФайл.ПолноеИмя);
ИначеЕсли ПолученныйФайл.Имя ="CorrespondentExchangeRules.xml" Тогда
ДвоичныеДанныеКорреспондента = Новый ДвоичныеДанные(ПолученныйФайл.ПолноеИмя);
ИначеЕсли ПолученныйФайл.Имя ="RegistrationRules.xml" Тогда
ДвоичныеДанныеРегистрации = Новый ДвоичныеДанные(ПолученныйФайл.ПолноеИмя);
Иначе
НСтрока = НСтр("ru = 'Имена файлов в архиве не соответствуют ожидаемым. Ожидаются файлы:
|ExchangeRules.xml - правила конвертации для текущей программы;
|CorrespondentExchangeRules.xml - правила конвертации для программы-корреспондента;
|RegistrationRules.xml - правила регистрации для текущей программы.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
НСтрока = НСтр("ru = 'Не удалось распаковать архив с правилами.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоКаталога);
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоАрхива);
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
ИнформацияОПравилахКонвертации = "[ИнформацияОПравилахИсточника]
|
|[ИнформацияОПравилахКорреспондента]";
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
КонвертацияОбъектовИнформационныхБаз = НоваяОбработкаКонвертацияОбъектовИнформационныхБаз("Выгрузка", ЗаписьПравилКонвертации.ИмяПланаОбмена);
ОбменДаннымиСервер.УстановитьНастройкиОтладкиВыгрузкиДляПравилОбмена(КонвертацияОбъектовИнформационныхБаз, ЗаписьПравилКонвертации.ИмяПланаОбмена, ЗаписьПравилКонвертации.РежимОтладки);
Если ЗаписьПравилКонвертации.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.Файл И ОписаниеОшибки = Неопределено
И Не ПравилаКонвертацииСовместимыСТекущейВерсией(ЗаписьПравилКонвертации.ИмяПланаОбмена, ОписаниеОшибки, ИнформацияОПравилахИзФайла(ИмяВременногоФайла)) Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ПравилаЗачитанные = КонвертацияОбъектовИнформационныхБаз.ПравилаОбмена(ИмяВременногоФайла);
ИнформацияОПравилахИсточника = КонвертацияОбъектовИнформационныхБаз.ИнформацияОПравилах(Ложь);
Если КонвертацияОбъектовИнформационныхБаз.ФлагОшибки() Тогда
Отказ = Истина;
КонецЕсли;
ИмяВременногоФайлаКорреспондента = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанныеКорреспондента.Записать(ИмяВременногоФайлаКорреспондента);
КонвертацияОбъектовИнформационныхБаз = НоваяОбработкаКонвертацияОбъектовИнформационныхБаз("Загрузка", ЗаписьПравилКонвертации.ИмяПланаОбмена);
ПравилаЗачитанныеКорреспондента = КонвертацияОбъектовИнформационныхБаз.ПравилаОбмена(ИмяВременногоФайлаКорреспондента);
ИнформацияОПравилахКорреспондента = КонвертацияОбъектовИнформационныхБаз.ИнформацияОПравилах(Истина);
Если КонвертацияОбъектовИнформационныхБаз.ФлагОшибки() Тогда
Отказ = Истина;
КонецЕсли;
ИнформацияОПравилахКонвертации = СтрЗаменить(ИнформацияОПравилахКонвертации, "[ИнформацияОПравилахИсточника]", ИнформацияОПравилахИсточника);
ИнформацияОПравилахКонвертации = СтрЗаменить(ИнформацияОПравилахКонвертации, "[ИнформацияОПравилахКорреспондента]", ИнформацияОПравилахКорреспондента);
ИмяВременногоФайлаРегистрации = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанныеРегистрации.Записать(ИмяВременногоФайлаРегистрации);
ЗагрузкаПравилРегистрации = Обработки.ЗагрузкаПравилРегистрацииОбъектов.Создать();
ЗагрузкаПравилРегистрации.ИмяПланаОбменаДляЗагрузки = ЗаписьПравилРегистрации.ИмяПланаОбмена;
ЗагрузкаПравилРегистрации.ЗагрузитьПравила(ИмяВременногоФайлаРегистрации);
ПравилаРегистрацииЗачитанные = ЗагрузкаПравилРегистрации.ПравилаРегистрацииОбъектов;
ИнформацияОПравилахРегистрации = ЗагрузкаПравилРегистрации.ИнформацияОПравилах();
Если ЗагрузкаПравилРегистрации.ФлагОшибки Тогда
Отказ = Истина;
КонецЕсли;
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайла);
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайлаКорреспондента);
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайлаРегистрации);
Если Не Отказ Тогда
ЗаписьПравилКонвертации.ПравилаXML = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
ЗаписьПравилКонвертации.ПравилаЗачитанные = Новый ХранилищеЗначения(ПравилаЗачитанные);
ЗаписьПравилКонвертации.ПравилаXMLКорреспондента = Новый ХранилищеЗначения(ДвоичныеДанныеКорреспондента, Новый СжатиеДанных());
ЗаписьПравилКонвертации.ПравилаЗачитанныеКорреспондента = Новый ХранилищеЗначения(ПравилаЗачитанныеКорреспондента);
ЗаписьПравилКонвертации.ИнформацияОПравилах = ИнформацияОПравилахКонвертации;
ЗаписьПравилКонвертации.ИмяФайлаПравил = ИмяФайлаПравил;
ЗаписьПравилКонвертации.ПравилаЗагружены = Истина;
ЗаписьПравилКонвертации.ИмяПланаОбменаИзПравил = ЗаписьПравилКонвертации.ИмяПланаОбмена;
ЗаписьПравилРегистрации.ПравилаXML = Новый ХранилищеЗначения(ДвоичныеДанныеРегистрации, Новый СжатиеДанных());
ЗаписьПравилРегистрации.ПравилаЗачитанные = Новый ХранилищеЗначения(ПравилаРегистрацииЗачитанные);
ЗаписьПравилРегистрации.ИнформацияОПравилах = ИнформацияОПравилахРегистрации;
ЗаписьПравилРегистрации.ИмяФайлаПравил = ИмяФайлаПравил;
ЗаписьПравилРегистрации.ПравилаЗагружены = Истина;
ЗаписьПравилРегистрации.ИмяПланаОбменаИзПравил = ЗаписьПравилРегистрации.ИмяПланаОбмена;
КонецЕсли;
КонецПроцедуры
Функция ЗачитанныеПравилаКонвертацииОбъектов(Знач ИмяПланаОбмена, ПолучатьПравилаКорреспондента = Ложь) Экспорт
ПравилаЗачитанные = Неопределено;
ШаблонТекстаЗапроса =
"ВЫБРАТЬ
| &ИмяРеквизита КАК ПравилаЗачитанные
|ИЗ
| РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными
|ГДЕ
| ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена
| И ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов)
| И ПравилаДляОбменаДанными.ПравилаЗагружены";
ИмяРеквизита = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ПравилаДляОбменаДанными.%1",
?(ПолучатьПравилаКорреспондента, "ПравилаЗачитанныеКорреспондента", "ПравилаЗачитанные"));
ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяРеквизита", ИмяРеквизита);
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
ПравилаЗачитанные = Выборка.ПравилаЗачитанные;
КонецЕсли;
Возврат ПравилаЗачитанные;
КонецФункции
Функция ИспользуютсяПравилаИзФайла(ИмяПланаОбмена, ПодробныйРезультат = Ложь) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПравилаДляОбменаДанными.ИмяПланаОбмена КАК ИмяПланаОбмена,
| ПравилаДляОбменаДанными.ВидПравил КАК ВидПравил
|ИЗ
| РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными
|ГДЕ
| ПравилаДляОбменаДанными.ИсточникПравил = ЗНАЧЕНИЕ(Перечисление.ИсточникиПравилДляОбменаДанными.Файл)
| И ПравилаДляОбменаДанными.ПравилаЗагружены
| И ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена");
Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена);
Результат = Запрос.Выполнить();
Если ПодробныйРезультат Тогда
ПравилаИзФайла = Новый Структура("ПравилаРегистрации, ПравилаКонвертации", Ложь, Ложь);
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов Тогда
ПравилаИзФайла.ПравилаКонвертации = Истина;
ИначеЕсли Выборка.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов Тогда
ПравилаИзФайла.ПравилаРегистрации = Истина;
КонецЕсли;
КонецЦикла;
Возврат ПравилаИзФайла;
Иначе
Возврат Не Результат.Пустой();
КонецЕсли;
КонецФункции
Функция ДвоичныеДанныеИзМакетаКонфигурации(Отказ, ИмяПланаОбмена, ИмяМакета)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ПланОбменаМенеджер = ОбменДаннымиПовтИсп.ПолучитьМенеджерПланаОбменаПоИмени(ИмяПланаОбмена);
Попытка
МакетПравил = ПланОбменаМенеджер.ПолучитьМакет(ИмяМакета);
Исключение
СтрокаСообщения = НСтр("ru = 'Ошибка получения макета конфигурации %1 для плана обмена %2'");
СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяМакета, ИмяПланаОбмена);
ОбменДаннымиСервер.СообщитьОбОшибке(СтрокаСообщения, Отказ);
Возврат Неопределено;
КонецПопытки;
МакетПравил.Записать(ИмяВременногоФайла);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайла);
Возврат ДвоичныеДанные;
КонецФункции
Процедура ВыполнитьПроверкуЗаполненияПолей(Отказ, Запись)
Если ПустаяСтрока(Запись.ИмяПланаОбмена) Тогда
НСтрока = НСтр("ru = 'Укажите план обмена.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
ИначеЕсли Запись.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации
И ПустаяСтрока(Запись.ИмяМакетаПравил) Тогда
НСтрока = НСтр("ru = 'Укажите типовые правила.'");
ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ);
КонецЕсли;
КонецПроцедуры
Функция ИнформацияОПравилахИзФайла(ИмяФайлаПравил)
ПравилаОбмена = Новый ЧтениеXML();
ПравилаОбмена.ОткрытьФайл(ИмяФайлаПравил);
ПравилаОбмена.Прочитать();
Если Не ((ПравилаОбмена.ЛокальноеИмя = "ПравилаОбмена") И (ПравилаОбмена.ТипУзла = ТипУзлаXML.НачалоЭлемента)) Тогда
ВызватьИсключение НСтр("ru = 'Ошибка формата правил обмена'");
КонецЕсли;
Пока ПравилаОбмена.Прочитать() Цикл
ИмяУзла = ПравилаОбмена.ЛокальноеИмя;
Если ИмяУзла = "Источник" И ПравилаОбмена.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИнформацияОПравилах = Новый Структура;
ИнформацияОПравилах.Вставить("ВерсияКонфигурации", ПравилаОбмена.ПолучитьАтрибут("ВерсияКонфигурации"));
ИнформацияОПравилах.Вставить("СинонимКонфигурацииВПравилах", ПравилаОбмена.ПолучитьАтрибут("СинонимКонфигурации"));
ПравилаОбмена.Прочитать();
ИнформацияОПравилах.Вставить("ИмяКонфигурации", ПравилаОбмена.Значение);
ИначеЕсли (ИмяУзла = "Источник") И (ПравилаОбмена.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда
ПравилаОбмена.Закрыть();
Возврат ИнформацияОПравилах;
КонецЕсли;
КонецЦикла;
ВызватьИсключение НСтр("ru = 'Ошибка формата правил обмена'");
КонецФункции
Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт
ЗагруженныеПравила = ЗагруженныеПравила();
Пока ЗагруженныеПравила.Следующий() Цикл
ЗапросНаИспользованиеВнешнихРесурсов(ЗапросыРазрешений, ЗагруженныеПравила);
КонецЦикла;
КонецПроцедуры
Функция ПравилаРегистрацииИзФайла(ИмяПланаОбмена) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
|ИЗ
| РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными
|ГДЕ
| ПравилаДляОбменаДанными.ПравилаЗагружены = ИСТИНА
| И ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов)
| И ПравилаДляОбменаДанными.ИсточникПравил = ЗНАЧЕНИЕ(Перечисление.ИсточникиПравилДляОбменаДанными.Файл)
| И ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена");
Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена);
Возврат Не Запрос.Выполнить().Пустой();
КонецФункции
Функция ПравилаКонвертацииИзФайла(ИмяПланаОбмена) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ПравилаДляОбменаДанными.ИмяПланаОбмена КАК ИмяПланаОбмена,
| ПравилаДляОбменаДанными.РежимОтладки КАК РежимОтладки,
| ПравилаДляОбменаДанными.РежимОтладкиВыгрузки КАК РежимОтладкиВыгрузки,
| ПравилаДляОбменаДанными.РежимОтладкиЗагрузки КАК РежимОтладкиЗагрузки,
| ПравилаДляОбменаДанными.РежимПротоколированияОбменаДанными КАК РежимПротоколированияОбменаДанными,
| ПравилаДляОбменаДанными.ИмяФайлаОбработкиДляОтладкиВыгрузки КАК ИмяФайлаОбработкиДляОтладкиВыгрузки,
| ПравилаДляОбменаДанными.ИмяФайлаОбработкиДляОтладкиЗагрузки КАК ИмяФайлаОбработкиДляОтладкиЗагрузки,
| ПравилаДляОбменаДанными.ИмяФайлаПротоколаОбмена КАК ИмяФайлаПротоколаОбмена
|ИЗ
| РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными
|ГДЕ
| ПравилаДляОбменаДанными.ПравилаЗагружены = ИСТИНА
| И ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов)
| И ПравилаДляОбменаДанными.ИсточникПравил = ЗНАЧЕНИЕ(Перечисление.ИсточникиПравилДляОбменаДанными.Файл)
| И ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена");
Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция ЗагруженныеПравила()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПравилаДляОбменаДанными.ИмяПланаОбмена,
| ПравилаДляОбменаДанными.РежимОтладки,
| ПравилаДляОбменаДанными.РежимОтладкиВыгрузки,
| ПравилаДляОбменаДанными.РежимОтладкиЗагрузки,
| ПравилаДляОбменаДанными.РежимПротоколированияОбменаДанными,
| ПравилаДляОбменаДанными.ИмяФайлаОбработкиДляОтладкиВыгрузки,
| ПравилаДляОбменаДанными.ИмяФайлаОбработкиДляОтладкиЗагрузки,
| ПравилаДляОбменаДанными.ИмяФайлаПротоколаОбмена,
| ИСТИНА КАК ЕстьПравилаКонвертации
|ПОМЕСТИТЬ ПравилаКонвертации
|ИЗ
| РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными
|ГДЕ
| ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов)
| И ПравилаДляОбменаДанными.ПравилаЗагружены = ИСТИНА
|;
|
|
|ВЫБРАТЬ
| ПравилаДляОбменаДанными.ИмяПланаОбмена,
| ИСТИНА КАК ПравилаРегистрацииИзФайла
|ПОМЕСТИТЬ ПравилаРегистрации
|ИЗ
| РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными
|ГДЕ
| ПравилаДляОбменаДанными.ПравилаЗагружены = ИСТИНА
| И ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов)
| И ПравилаДляОбменаДанными.ИсточникПравил = ЗНАЧЕНИЕ(Перечисление.ИсточникиПравилДляОбменаДанными.Файл)
|;
|
|
|ВЫБРАТЬ
| ВЫБОР
| КОГДА ПравилаРегистрации.ПравилаРегистрацииИзФайла
| ТОГДА ПравилаРегистрации.ИмяПланаОбмена
| ИНАЧЕ ПравилаКонвертации.ИмяПланаОбмена
| КОНЕЦ КАК ИмяПланаОбмена,
| ПравилаКонвертации.РежимОтладки,
| ПравилаКонвертации.РежимОтладкиВыгрузки,
| ПравилаКонвертации.РежимОтладкиЗагрузки,
| ПравилаКонвертации.РежимПротоколированияОбменаДанными,
| ПравилаКонвертации.ИмяФайлаОбработкиДляОтладкиВыгрузки,
| ПравилаКонвертации.ИмяФайлаОбработкиДляОтладкиЗагрузки,
| ПравилаКонвертации.ИмяФайлаПротоколаОбмена,
| ЕСТЬNULL(ПравилаРегистрации.ПравилаРегистрацииИзФайла, ЛОЖЬ) КАК ПравилаРегистрацииИзФайла,
| ЕСТЬNULL(ПравилаКонвертации.ЕстьПравилаКонвертации, ЛОЖЬ) КАК ЕстьПравилаКонвертации
|ИЗ
| ПравилаКонвертации КАК ПравилаКонвертации
| ПОЛНОЕ СОЕДИНЕНИЕ ПравилаРегистрации КАК ПравилаРегистрации
| ПО ПравилаКонвертации.ИмяПланаОбмена = ПравилаРегистрации.ИмяПланаОбмена";
Возврат Запрос.Выполнить().Выбрать();
КонецФункции
Процедура ЗапросНаИспользованиеВнешнихРесурсов(ЗапросыРазрешений, Запись, ЕстьПравилаКонвертации = Неопределено, ПравилаРегистрацииИзФайла = Неопределено) Экспорт
Разрешения = Новый Массив;
МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
Если ПравилаРегистрацииИзФайла = Неопределено Тогда
ПравилаРегистрацииИзФайла = Запись.ПравилаРегистрацииИзФайла;
КонецЕсли;
Если ЕстьПравилаКонвертации = Неопределено Тогда
ЕстьПравилаКонвертации = Запись.ЕстьПравилаКонвертации;
КонецЕсли;
Если ПравилаРегистрацииИзФайла Тогда
Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима());
КонецЕсли;
Если ЕстьПравилаКонвертации Тогда
Если Не Запись.РежимОтладки Тогда
Иначе
Если Не ПравилаРегистрацииИзФайла Тогда
Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима());
КонецЕсли;
Если Запись.РежимОтладки Тогда
Если Запись.РежимОтладкиВыгрузки Тогда
СтруктураИмениФайла = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(Запись.ИмяФайлаОбработкиДляОтладкиВыгрузки);
Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(
СтруктураИмениФайла.Путь, Истина, Ложь));
КонецЕсли;
Если Запись.РежимОтладкиЗагрузки Тогда
СтруктураИмениФайла = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(Запись.ИмяФайлаОбработкиДляОтладкиВыгрузки);
Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(
СтруктураИмениФайла.Путь, Истина, Ложь));
КонецЕсли;
Если Запись.РежимПротоколированияОбменаДанными Тогда
СтруктураИмениФайла = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(Запись.ИмяФайлаОбработкиДляОтладкиВыгрузки);
Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(
СтруктураИмениФайла.Путь, Истина, Истина));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИдентификаторПланаОбмена = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.ПланыОбмена[Запись.ИмяПланаОбмена]);
МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ЗапросыРазрешений,
МодульРаботаВБезопасномРежимеСлужебный.ЗапросРазрешенийДляВнешнегоМодуля(ИдентификаторПланаОбмена, Разрешения));
КонецПроцедуры
#КонецОбласти
#КонецЕсли