1
0
mirror of https://github.com/bia-technologies/bsl-parser.git synced 2024-11-24 08:12:17 +02:00

#ARCH-2530

Модулья работы с XML
Доработки для rabbi
This commit is contained in:
aleksey.koryakin 2019-05-31 15:22:59 +03:00
parent ba00974c19
commit 6b34832c1f
5 changed files with 285 additions and 58 deletions

View File

@ -68,7 +68,7 @@
КонецЦикла;
Описание = ГенераторОписанийОбщий.ЗакрытьЗапись(ЗаписьConfiguration);
Описание = ОбработкаXML.ЗакрытьЗапись(ЗаписьConfiguration);
Утилиты.ЗаписатьФайл(СтруктураКаталоговПриемник.ИмяФайлаОписанияКонфигурации(), Описание);
@ -156,6 +156,144 @@
КонецФункции
Процедура ПеренестиОбъектВРасширениеСПодчиненными(Объект, Атрибуты = Истина, ТабличныеЧасти = Ложь, Формы = Ложь, Команды = Ложь)
Чтение = Новый ЧтениеXML();
Чтение.ОткрытьФайл(Объект.ПутьКФайлу);
Запись = ПеренестиОбъектВРасширение(Объект, Истина);
Исключения = Новый Структура();
Исключения.Вставить("standardAttributes", Истина);
Исключения.Вставить("attributes", НЕ Атрибуты);
Исключения.Вставить("forms", НЕ Формы);
Исключения.Вставить("commands", НЕ Команды);
Исключения.Вставить("tabularSections", НЕ ТабличныеЧасти);
СтекИмен = Новый Соответствие();
СтекИмен = Новый Соответствие();
Уровень = -1;
УровеньЗаписи = 0;
Пропустить = Ложь;
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Исключения.Свойство(Чтение.ЛокальноеИмя, Пропустить) И Пропустить Тогда
Чтение.Пропустить();
Продолжить;
КонецЕсли;
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Уровень = Уровень + 1;
СтекИмен.Вставить(Уровень, Чтение.Имя);
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Уровень = Уровень - 1;
Если Уровень < УровеньЗаписи Тогда
Запись.ЗаписатьКонецЭлемента();
УровеньЗаписи = Уровень;
КонецЕсли;
КонецЕсли;
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Уровень <> 1 И СтрСравнить(Чтение.ЛокальноеИмя, "name") = 0 Тогда
Для Инд = УровеньЗаписи + 1 По Уровень Цикл
Запись.ЗаписатьНачалоЭлемента(СтекИмен[Инд]);
КонецЦикла;
// Перейдем к значению
Чтение.Прочитать();
Запись.ЗаписатьТекст(Чтение.Значение);
Запись.ЗаписатьКонецЭлемента();
// Выйдем из тэга name
Чтение.Прочитать();
ОбработкаXML.ЗаписатьЗначениеXML(Запись, "objectBelonging", "Adopted");
Если ОбработкаXML.ПерейтиКСледующемуЭлементу(Чтение, "type") Тогда
ОбработкаXML.СкопироватьДанныеXML(Чтение, Запись);
Иначе
Запись.ЗаписатьКонецЭлемента();
КонецЕсли;
Уровень = Уровень - 1;
УровеньЗаписи = Уровень;
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Запись.Закрыть();
КонецПроцедуры
Функция СкопироватьОбъект(Объект) Экспорт
НовыйОбъект = ДобавитьОбъект(Объект.Наименование, Объект.Тип);
КопироватьФайл(Объект.ПутьКФайлу, НовыйОбъект.ПутьКФайлу);
Возврат НовыйОбъект;
КонецФункции
Функция ДобавитьВнешнуюОбработку(КаталогВнешнейОбработки) Экспорт
ИмяОбработки = (Новый Файл(КаталогВнешнейОбработки)).Имя;
Обработка = ДобавитьОбъект(ИмяОбработки, ТипыОбъектовКонфигурации.НормализоватьИмя("Обработка"));
Для Каждого Файл Из НайтиФайлы(КаталогВнешнейОбработки, "*", Истина) Цикл
Если НЕ Файл.ЭтоФайл() Тогда
Продолжить;
КонецЕсли;
ОтносительныйПуть = СтрЗаменить(Файл.ПолноеИмя, КаталогВнешнейОбработки, "");
ПутьНовогоФайла = ДобавитьФайлОбъекта(Обработка, ОтносительныйПуть, Файл.ПолноеИмя);
Если Файл.Расширение = ".mdo" ИЛИ Файл.Расширение = ".form" Тогда
Текст = Утилиты.ПрочитатьФайл(ПутьНовогоФайла);
Текст = СтрЗаменить(Текст, "ExternalDataProcessor", "DataProcessor");
Утилиты.ЗаписатьФайл(ПутьНовогоФайла, Текст);
ИначеЕсли СтрСравнить(Файл.Расширение, ".bsl") Тогда
Текст = Утилиты.ПрочитатьФайл(ПутьНовогоФайла);
Текст = СтрЗаменить(Текст, "ВнешнаяОбработка", "Обработка");
Утилиты.ЗаписатьФайл(ПутьНовогоФайла, Текст);
КонецЕсли;
КонецЦикла;
Возврат Обработка;
КонецФункции
// Добавляет в расширение существующий файл, как общий модуль
//
// Параметры:
@ -270,7 +408,7 @@
Иначе
ГенераторОписанийОбщий.ЗакрытьЗапись(Запись);
ОбработкаXML.ЗакрытьЗапись(Запись);
КонецЕсли;

View File

@ -91,7 +91,7 @@
ИмяТипа = НРег(Лев(ИмяТипа, 1)) + Сред(ИмяТипа, 2);
ИмяОбъекта = СтрШаблон("%1.%2", ОбъектКонфигурации.Тип, ОбъектКонфигурации.Наименование);
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(ПараметрыГенерации.ЗаписьConfiguration, ИмяТипа, ИмяОбъекта);
ОбработкаXML.ЗаписатьЗначениеXML(ПараметрыГенерации.ЗаписьConfiguration, ИмяТипа, ИмяОбъекта);
КонецПроцедуры
@ -128,8 +128,8 @@
Процедура МногоязычнаяСтрока(Запись, Значение) Экспорт
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, "key", "ru");
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, "value", Значение);
ОбработкаXML.ЗаписатьЗначениеXML(Запись, "key", "ru");
ОбработкаXML.ЗаписатьЗначениеXML(Запись, "value", Значение);
КонецПроцедуры
@ -145,7 +145,7 @@
ЧастиИмени = СтрРазделить(ПолноеИмяЭлемента, ".");
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, ЧастиИмени[0], ПолноеИмяЭлемента);
ОбработкаXML.ЗаписатьЗначениеXML(Запись, ЧастиИмени[0], ПолноеИмяЭлемента);
КонецЦикла;
@ -212,6 +212,6 @@
//
Функция ЗакрытьЗапись(Запись)
Возврат ГенераторОписанийОбщий.ЗакрытьЗапись(Запись);
Возврат ОбработкаXML.ЗакрытьЗапись(Запись);
КонецФункции

View File

@ -53,8 +53,8 @@
Для Каждого uid из ГенераторОписанийОбщий.ПолучитьUIDДляГенерацииРасширения() Цикл
ЗаписьConfiguration.ЗаписатьНачалоЭлемента("xr:ContainedObject");
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(ЗаписьConfiguration, "xr:ClassId", uid);
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(ЗаписьConfiguration, "xr:ObjectId", Строка(Новый УникальныйИдентификатор()));
ОбработкаXML.ЗаписатьЗначениеXML(ЗаписьConfiguration, "xr:ClassId", uid);
ОбработкаXML.ЗаписатьЗначениеXML(ЗаписьConfiguration, "xr:ObjectId", Строка(Новый УникальныйИдентификатор()));
ЗаписьConfiguration.ЗаписатьКонецЭлемента(); // xr:ContainedObject
КонецЦикла;
@ -97,7 +97,7 @@
//
Процедура ЗарегистрироватьОбъектВКонфигурации(ОбъектКонфигурации, ПараметрыГенерации) Экспорт
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(ПараметрыГенерации.ЗаписьConfiguration, ОбъектКонфигурации.Тип, ОбъектКонфигурации.Наименование);
ОбработкаXML.ЗаписатьЗначениеXML(ПараметрыГенерации.ЗаписьConfiguration, ОбъектКонфигурации.Тип, ОбъектКонфигурации.Наименование);
КонецПроцедуры
@ -122,7 +122,7 @@
Если ТипОбъекта = ТипыОбъектовКонфигурации.ИмяТипаПланОбмена() Тогда
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, "xr:ThisNode", Строка(Новый УникальныйИдентификатор()));
ОбработкаXML.ЗаписатьЗначениеXML(Запись, "xr:ThisNode", Строка(Новый УникальныйИдентификатор()));
КонецЕсли;
@ -132,8 +132,8 @@
// TODO Есть типы исключения у которых имя формируется по-другому
Запись.ЗаписатьАтрибут("name", СтрШаблон("%1%2.%3", ТипОбъекта, Тип, ИмяОбъекта));
Запись.ЗаписатьАтрибут("category", Тип);
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, "xr:TypeId", Строка(Новый УникальныйИдентификатор()));
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, "xr:ValueId", Строка(Новый УникальныйИдентификатор()));
ОбработкаXML.ЗаписатьЗначениеXML(Запись, "xr:TypeId", Строка(Новый УникальныйИдентификатор()));
ОбработкаXML.ЗаписатьЗначениеXML(Запись, "xr:ValueId", Строка(Новый УникальныйИдентификатор()));
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
@ -151,8 +151,8 @@
Процедура МногоязычнаяСтрока(Запись, Значение) Экспорт
Запись.ЗаписатьНачалоЭлемента("v8:item");
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, "v8:lang", "ru");
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, "v8:content", Значение);
ОбработкаXML.ЗаписатьЗначениеXML(Запись, "v8:lang", "ru");
ОбработкаXML.ЗаписатьЗначениеXML(Запись, "v8:content", Значение);
Запись.ЗаписатьКонецЭлемента();
КонецПроцедуры
@ -175,7 +175,7 @@
ЧастиИмени = СтрРазделить(ПолноеИмяЭлемента, ".");
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, ЧастиИмени[0], ЧастиИмени[1]);
ОбработкаXML.ЗаписатьЗначениеXML(Запись, ЧастиИмени[0], ЧастиИмени[1]);
КонецЦикла;
@ -189,7 +189,7 @@
ЧастиИмени = СтрРазделить(ПолноеИмяЭлемента, ".");
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, ЧастиИмени[0], ЧастиИмени[1]);
ОбработкаXML.ЗаписатьЗначениеXML(Запись, ЧастиИмени[0], ЧастиИмени[1]);
КонецЦикла;
@ -264,7 +264,7 @@
//
Функция ЗакрытьЗапись(Запись)
Возврат ГенераторОписанийОбщий.ЗакрытьЗапись(Запись);
Возврат ОбработкаXML.ЗакрытьЗапись(Запись);
КонецФункции

View File

@ -61,7 +61,7 @@
Если ПустаяСтрока(ОписаниеСвойства.МетодПреобразования) Тогда
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, ОписаниеСвойства.Поле, Значение);
ОбработкаXML.ЗаписатьЗначениеXML(Запись, ОписаниеСвойства.Поле, Значение);
Иначе
@ -79,45 +79,6 @@
КонецФункции
#Область РаботаСXML
// Закрывает запись описания объекта и всех открытых тэгов
//
// Параметры:
// Запись - ЗаписьXML - запись описания объекта
//
// Возвращаемое значение:
// Строка - XML описание объекта
//
Функция ЗакрытьЗапись(Запись) Экспорт
Для Инд = 1 По Запись.КонтекстПространствИмен.Глубина Цикл
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Возврат Запись.Закрыть();
КонецФункции
// Записывает произвольное значение в XML поток
//
// Параметры:
// Запись - ЗаписьXML - Поток записи XML
// Имя - Строка - Имя реквизита, тэг
// Значение - Произвольный - Записываемое значение
//
Процедура ЗаписатьЗначениеXML(Запись, Имя, Значение) Экспорт
Запись.ЗаписатьНачалоЭлемента(Имя);
Запись.ЗаписатьТекст(XMLСтрока(Значение));
Запись.ЗаписатьКонецЭлемента();
КонецПроцедуры
#КонецОбласти
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,128 @@
///////////////////////////////////////////////////////////////////////////////
//
// Модуль содержит полезные методы для работы с XML
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
Функция ПерейтиКСледующемуЭлементу(Чтение, ИмяЭлемента) Экспорт
Уровень = 0;
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Уровень = Уровень + 1;
Если Уровень = 1 И Чтение.Имя = ИмяЭлемента Тогда
Возврат Истина;
КонецЕсли
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Уровень = Уровень - 1;
Если Уровень = -1 Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура СкопироватьДанныеXML(Чтение, Запись, КопироватьВсеЭлементыУровня = Ложь) Экспорт
Уровень = 0;
УровеньВыхода = ?(КопироватьВсеЭлементыУровня, -1, 0);
Пока Истина Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Уровень = Уровень + 1;
Запись.ЗаписатьНачалоЭлемента(Чтение.Имя);
Пока Чтение.ПрочитатьАтрибут() Цикл
Запись.ЗаписатьАтрибут(Чтение.Имя, Чтение.Значение);
КонецЦикла;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Уровень = Уровень - 1;
Если Уровень = УровеньВыхода Тогда
Прервать;
КонецЕсли;
Запись.ЗаписатьКонецЭлемента();
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
Запись.ЗаписатьТекст(Чтение.Значение);
КонецЕсли;
Чтение.Прочитать();
КонецЦикла;
КонецПроцедуры
// Записывает произвольное значение в XML поток
//
// Параметры:
// Запись - ЗаписьXML - Поток записи XML
// Имя - Строка - Имя реквизита, тэг
// Значение - Произвольный - Записываемое значение
//
Процедура ЗаписатьЗначениеXML(Запись, Имя, Значение) Экспорт
Запись.ЗаписатьНачалоЭлемента(Имя);
Запись.ЗаписатьТекст(XMLСтрока(Значение));
Запись.ЗаписатьКонецЭлемента();
КонецПроцедуры
// Закрывает запись описания объекта и всех открытых тэгов
//
// Параметры:
// Запись - ЗаписьXML - запись описания объекта
//
// Возвращаемое значение:
// Строка - XML описание объекта
//
Функция ЗакрытьЗапись(Запись) Экспорт
Для Инд = 1 По Запись.КонтекстПространствИмен.Глубина Цикл
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Возврат Запись.Закрыть();
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////