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 @@
+
+
+
+
\ 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 @@
+
+
\ 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