+ обработка
This commit is contained in:
249
ОбъединениеXML/Forms/Форма/Ext/Form/Module.bsl
Normal file
249
ОбъединениеXML/Forms/Форма/Ext/Form/Module.bsl
Normal file
@@ -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(Документ_А);
|
||||
Возврат Результат;
|
||||
КонецФункции
|
||||
Reference in New Issue
Block a user