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:
parent
ba00974c19
commit
6b34832c1f
@ -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.ЗакрытьЗапись(Запись);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
|
@ -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.ЗакрытьЗапись(Запись);
|
||||
|
||||
КонецФункции
|
||||
|
@ -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.ЗакрытьЗапись(Запись);
|
||||
|
||||
КонецФункции
|
||||
|
||||
|
@ -61,7 +61,7 @@
|
||||
|
||||
Если ПустаяСтрока(ОписаниеСвойства.МетодПреобразования) Тогда
|
||||
|
||||
ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, ОписаниеСвойства.Поле, Значение);
|
||||
ОбработкаXML.ЗаписатьЗначениеXML(Запись, ОписаниеСвойства.Поле, Значение);
|
||||
|
||||
Иначе
|
||||
|
||||
@ -79,45 +79,6 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
#Область РаботаСXML
|
||||
|
||||
// Закрывает запись описания объекта и всех открытых тэгов
|
||||
//
|
||||
// Параметры:
|
||||
// Запись - ЗаписьXML - запись описания объекта
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - XML описание объекта
|
||||
//
|
||||
Функция ЗакрытьЗапись(Запись) Экспорт
|
||||
|
||||
Для Инд = 1 По Запись.КонтекстПространствИмен.Глубина Цикл
|
||||
|
||||
Запись.ЗаписатьКонецЭлемента();
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Запись.Закрыть();
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Записывает произвольное значение в XML поток
|
||||
//
|
||||
// Параметры:
|
||||
// Запись - ЗаписьXML - Поток записи XML
|
||||
// Имя - Строка - Имя реквизита, тэг
|
||||
// Значение - Произвольный - Записываемое значение
|
||||
//
|
||||
Процедура ЗаписатьЗначениеXML(Запись, Имя, Значение) Экспорт
|
||||
|
||||
Запись.ЗаписатьНачалоЭлемента(Имя);
|
||||
Запись.ЗаписатьТекст(XMLСтрока(Значение));
|
||||
Запись.ЗаписатьКонецЭлемента();
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
128
src/Общее/Модули/ОбработкаXML.os
Normal file
128
src/Общее/Модули/ОбработкаXML.os
Normal 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 По Запись.КонтекстПространствИмен.Глубина Цикл
|
||||
|
||||
Запись.ЗаписатьКонецЭлемента();
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Запись.Закрыть();
|
||||
|
||||
КонецФункции
|
||||
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
|
||||
///////////////////////////////////////////////////////////////////////////////
|
Loading…
Reference in New Issue
Block a user