diff --git a/ОбъединениеXML.xml b/ОбъединениеXML.xml new file mode 100644 index 0000000..ff1ed79 --- /dev/null +++ b/ОбъединениеXML.xml @@ -0,0 +1,144 @@ + + + + + + c3831ec8-d8d5-4f93-8a22-f9bfae07327f + 63b57fa8-6b44-4789-a8f6-efd63f0f3651 + + + 9af80e9c-d587-48f4-89ad-882e52cafdf6 + 90d0e187-ef3f-42ab-811a-3aee2453999f + + + + ОбъединениеXML + + + ru + Объединение XML + + + + ExternalDataProcessor.ОбъединениеXML.Form.Форма + + + + + + ИмяФайла_А + + + ru + Имя файла - Приемник + + + + + xs:string + + 256 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ИмяФайла_Б + + + ru + Имя файла - Источник + + + + + xs:string + + 256 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ИмяФайла_Результат + + + ru + Имя файла - результат + + + + + xs:string + + 256 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + +
Форма
+
+
+
\ No newline at end of file diff --git a/ОбъединениеXML/Forms/Форма.xml b/ОбъединениеXML/Forms/Форма.xml new file mode 100644 index 0000000..9e9e500 --- /dev/null +++ b/ОбъединениеXML/Forms/Форма.xml @@ -0,0 +1,22 @@ + + +
+ + Форма + + + ru + Форма + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/ОбъединениеXML/Forms/Форма/Ext/Form.xml b/ОбъединениеXML/Forms/Форма/Ext/Form.xml new file mode 100644 index 0000000..bf06b5f --- /dev/null +++ b/ОбъединениеXML/Forms/Форма/Ext/Form.xml @@ -0,0 +1,240 @@ + +
+ Use + UseList + + + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Параметры</v8:content> + </v8:item> + + + + ru + Параметры + + + + + + Объект.ИмяФайла_А + EnterOnInput + true + true + + + + ИмяФайла_АНачалоВыбора + ИмяФайла_АОткрытие + + + + Объект.ИмяФайла_Б + EnterOnInput + true + true + + + + ИмяФайла_БНачалоВыбора + ИмяФайла_БОткрытие + + + + ВыражениеПоискаКонтейнера + + + ru + Выражение XPath используемое для нахождения контейнера, дочерние элементы которого будут скопированны + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Просмотр узлов</v8:content> + </v8:item> + + + + ru + Просмотр узлов + + + + + + ТекПуть + true + true + + + + ТекПутьОткрытие + + + + Tree + false + false + true + true + true + ДеревоФайла + + + + + + ДеревоФайла + SearchStringRepresentation + + + + + + + ДеревоФайла + ViewStatusRepresentation + + + + + + + ДеревоФайла + SearchControl + + + + + + ДеревоФайлаПриАктивизацииСтроки + + + + ДеревоФайла.ИмяУзла + true + EnterOnInput + + + + +
+
+
+
+
+
+ + + + cfg:ExternalDataProcessorObject.ОбъединениеXML + + true + + Объект.ИмяФайла_А + Объект.ИмяФайла_Б + Объект.ИмяФайла_Результат + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дерево файла</v8:content> + </v8:item> + + + v8:ValueTree + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя узла</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тек путь</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выражение поиска контейнера</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + ВыражениеПоискаКонтейнера + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Объединить</v8:content> + </v8:item> + + + + ru + Объединить + + + Объединить + + +
\ No newline at end of file diff --git a/ОбъединениеXML/Forms/Форма/Ext/Form/Module.bsl b/ОбъединениеXML/Forms/Форма/Ext/Form/Module.bsl new file mode 100644 index 0000000..00f60c9 --- /dev/null +++ b/ОбъединениеXML/Forms/Форма/Ext/Form/Module.bsl @@ -0,0 +1,249 @@ +&НаСервере +Функция ПолучитьДокументDOM(АдресВХ) + Результат = Неопределено; + + Если ЭтоАдресВременногоХранилища(АдресВХ) Тогда + ДанныеФайла = ПолучитьИзВременногоХранилища(АдресВХ); + Поток = ДанныеФайла.ОткрытьПотокДляЧтения(); + + ЧтениеXML = Новый ЧтениеXML; + ПостроительDOM = Новый ПостроительDOM; + ЧтениеXML.ОткрытьПоток(Поток); + Результат = ПостроительDOM.Прочитать(ЧтениеXML); + ЧтениеXML.Закрыть(); + Поток.Закрыть(); + КонецЕсли; + + Возврат Результат; +КонецФункции + +&НаСервере +Функция ПолучитьДанныеXML(ДокументDOM) + Результат = Неопределено; + Поток = Новый ПотокВПамяти; + ЗаписьXML = Новый ЗаписьXML; + ЗаписьDOM = Новый ЗаписьDOM; + Парам_XML = Новый ПараметрыЗаписиXML("UTF-8", "1.0"); + ЗаписьXML.ОткрытьПоток(Поток, Парам_XML); + ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML); + ЗаписьXML.Закрыть(); + + Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные(); + Результат = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор); + + Данные = Неопределено; + + Возврат Результат; +КонецФункции + +&НаСервере +Функция НайтиКонтейнер(ДокументDOM, Выражение) + Результат = Неопределено; + + Разыменователь = Новый РазыменовательПространствИменDOM(ДокументDOM); + + ПоискУзла = ДокументDOM.ВычислитьВыражениеXPath(Выражение, ДокументDOM.ЭлементДокумента, Разыменователь); + Результат = ПоискУзла.ПолучитьСледующий(); + + Возврат Результат; +КонецФункции + + +&НаКлиенте +Процедура ИмяФайла_АНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ВыборФайла("ИмяФайла_А", "Приемник"); +КонецПроцедуры + +&НаКлиенте +Процедура ИмяФайла_БНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ВыборФайла("ИмяФайла_Б", "Источник"); +КонецПроцедуры + +&НаКлиенте +Процедура ИмяФайла_АОткрытие(Элемент, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ПросмотрФайла(Объект.ИмяФайла_А, "ИмяФайла_А"); +КонецПроцедуры + +&НаКлиенте +Процедура ИмяФайла_БОткрытие(Элемент, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ПросмотрФайла(Объект.ИмяФайла_Б, "ИмяФайла_Б"); +КонецПроцедуры + +&НаКлиенте +Процедура ТекПутьОткрытие(Элемент, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ВыражениеПоискаКонтейнера = ТекПуть; + + Элементы.Группа1.ТекущаяСтраница = Элементы.ГрПараметры; +КонецПроцедуры + + +&НаКлиенте +Процедура ВыборФайла(ИмяРеквизита, Описание="", Сохранение=Ложь) + Файл = Новый Файл(Объект[ИмяРеквизита]); + + Режим = ?(Сохранение, РежимДиалогаВыбораФайла.Сохранение, РежимДиалогаВыбораФайла.Открытие); + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.Каталог = Файл.Путь; + ДиалогОткрытияФайла.ПолноеИмяФайла = Файл.Имя; + ДиалогОткрытияФайла.Фильтр = "Все файлы|*.*|Файлы XML (*.xml)|*.xml"; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = СтрШаблон("Выберите файл %1", Описание); + + ДополнительныеПараметры = Новый Структура("ИмяРеквизита", ИмяРеквизита); + + ДиалогОткрытияФайла.Показать(Новый ОписаниеОповещения("ВыборФайла_Завершение", ЭтаФорма, ДополнительныеПараметры)); +КонецПроцедуры + +&НаКлиенте +Процедура ВыборФайла_Завершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт + Если НЕ (Неопределено = ВыбранныеФайлы) Тогда + Объект[ДополнительныеПараметры.ИмяРеквизита] = ВыбранныеФайлы[0]; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПросмотрФайла(ИмяФайла, ИмяРеквизита) + Если ПустаяСтрока(СокрЛП(ИмяФайла)) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Имя файла не заполнено",,ИмяРеквизита,"Объект."+ИмяРеквизита); + Возврат; + КонецЕсли; + + ДополнительныеПараметры = Новый Структура("ИмяРеквизита", ИмяРеквизита); + + НачатьПомещениеФайла(Новый ОписаниеОповещения("ПросмотрФайла_ПослеПомещения", ЭтаФорма, ДополнительныеПараметры), , ИмяФайла, Ложь, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ПросмотрФайла_ПослеПомещения(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + ИмяРеквизита = ДополнительныеПараметры.ИмяРеквизита; + + Если НЕ Результат Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не получилось",,ИмяРеквизита,"Объект."+ИмяРеквизита); + Возврат; + КонецЕсли; + + ПросмотрФайла_НаСервере(Адрес); + + Элементы.Группа1.ТекущаяСтраница = Элементы.ПросмотрУзлов; +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьДерево_ПоDOM(ТекСтрДерево, ЭлементDOM) + ТекСтрДерево.ИмяУзла = ЭлементDOM.ИмяУзла; + + Для Каждого Дочерний Из ЭлементDOM.ДочерниеУзлы Цикл + НовСтр = ТекСтрДерево.Строки.Добавить(); + ЗаполнитьДерево_ПоDOM(НовСтр, Дочерний); + КонецЦикла; +КонецПроцедуры + +&НаСервере +Процедура ПросмотрФайла_НаСервере(АдресВХ) + ДокументDOM = ПолучитьДокументDOM(АдресВХ); + УдалитьИзВременногоХранилища(АдресВХ); + + Д = РеквизитФормыВЗначение("ДеревоФайла"); + + Д.Строки.Очистить(); + Корень = Д.Строки.Добавить(); + + ЗаполнитьДерево_ПоDOM(Корень, ДокументDOM.ЭлементДокумента); + + ДокументDOM = Неопределено; + + ЗначениеВРеквизитФормы(Д, "ДеревоФайла"); +КонецПроцедуры + +&НаКлиенте +Процедура ДеревоФайлаПриАктивизацииСтроки(Элемент) + Ид = Элемент.ТекущаяСтрока; + + Если Неопределено = Ид Тогда Возврат КонецЕсли; + + ОбновитьТекПуть(Ид); +КонецПроцедуры + +&НаСервере +Функция ПолучитьПуть(дфЭлементДерева) + Результат = ""; + + Если Неопределено = дфЭлементДерева Тогда Возврат Результат КонецЕсли; + + Родитель = дфЭлементДерева.ПолучитьРодителя(); + + Разделитель = "/"; + + Возврат ПолучитьПуть(Родитель) + Разделитель + дфЭлементДерева.ИмяУзла; +КонецФункции + +&НаСервере +Процедура ОбновитьТекПуть(ИдСтр) + Стр = ДеревоФайла.НайтиПоИдентификатору(ИдСтр); + + ТекПуть = ПолучитьПуть(Стр); +КонецПроцедуры + +&НаКлиенте +Процедура Объединить(Команда) + ДополнительныеПараметры = Новый Структура; + + НачатьПомещениеФайла(Новый ОписаниеОповещения("Объединить_ПослеПомещения_А", ЭтаФорма, ДополнительныеПараметры), , Объект.ИмяФайла_А, Ложь, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура Объединить_ПослеПомещения_А(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + Если НЕ Результат Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не получилось",,"ИмяФайла_А","Объект.ИмяФайла_А"); + Возврат; + КонецЕсли; + + ДополнительныеПараметры.Вставить("Адрес_А", Адрес); + НачатьПомещениеФайла(Новый ОписаниеОповещения("Объединить_ПослеПомещения_Б", ЭтаФорма, ДополнительныеПараметры), , Объект.ИмяФайла_Б, Ложь, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьИмяФайла_Результата(ИмяФайла_Исходный) + Файл = Новый Файл(ИмяФайла_Исходный); + Возврат СтрШаблон("Результат%1", Файл.Расширение); +КонецФункции + +&НаКлиенте +Процедура Объединить_ПослеПомещения_Б(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + Если НЕ Результат Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не получилось",,"ИмяФайла_Б","Объект.ИмяФайла_Б"); + Возврат; + КонецЕсли; + + ДополнительныеПараметры.Вставить("Адрес_Б", Адрес); + + Адрес_Результат = Объединить_НаСервере(ДополнительныеПараметры); + Если ЭтоАдресВременногоХранилища(Адрес_Результат) Тогда + ПолучитьФайл(Адрес_Результат, ПолучитьИмяФайла_Результата(Объект.ИмяФайла_А), Истина); + УдалитьИзВременногоХранилища(Адрес_Результат); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция Объединить_НаСервере(ДополнительныеПараметры) + Результат = Неопределено; + Документ_А = ПолучитьДокументDOM(ДополнительныеПараметры.Адрес_А); + Документ_Б = ПолучитьДокументDOM(ДополнительныеПараметры.Адрес_Б); + УдалитьИзВременногоХранилища(ДополнительныеПараметры.Адрес_А); + УдалитьИзВременногоХранилища(ДополнительныеПараметры.Адрес_Б); + + Контейнер_Источник = НайтиКонтейнер(Документ_Б, ВыражениеПоискаКонтейнера); + Контейнер_Приемник = НайтиКонтейнер(Документ_А, ВыражениеПоискаКонтейнера); + + Для Каждого ДочернийУзел Из Контейнер_Источник.ДочерниеУзлы Цикл + НовыйУзел = Документ_А.ИмпортироватьУзел(ДочернийУзел, Истина); + Контейнер_Приемник.ДобавитьДочерний(НовыйУзел); + КонецЦикла; + + Результат = ПолучитьДанныеXML(Документ_А); + Возврат Результат; +КонецФункции \ No newline at end of file