+ обработка

This commit is contained in:
2018-09-25 15:51:06 +03:00
parent 81e79d3dd8
commit 4ebcc20ca4
4 changed files with 655 additions and 0 deletions

View 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(Документ_А);
Возврат Результат;
КонецФункции