diff --git a/src/ГенераторОписаний/Классы/ГенераторРасширений.os b/src/ГенераторОписаний/Классы/ГенераторРасширений.os index da6dc11..5e7e4ef 100644 --- a/src/ГенераторОписаний/Классы/ГенераторРасширений.os +++ b/src/ГенераторОписаний/Классы/ГенераторРасширений.os @@ -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.ЗакрытьЗапись(Запись); КонецЕсли; diff --git a/src/ГенераторОписаний/Модули/ГенераторОписанийEDT.os b/src/ГенераторОписаний/Модули/ГенераторОписанийEDT.os index 9827ba0..58daaa0 100644 --- a/src/ГенераторОписаний/Модули/ГенераторОписанийEDT.os +++ b/src/ГенераторОписаний/Модули/ГенераторОписанийEDT.os @@ -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.ЗакрытьЗапись(Запись); КонецФункции diff --git a/src/ГенераторОписаний/Модули/ГенераторОписанийКонфигуратор.os b/src/ГенераторОписаний/Модули/ГенераторОписанийКонфигуратор.os index 5cfc1b4..bec2e04 100644 --- a/src/ГенераторОписаний/Модули/ГенераторОписанийКонфигуратор.os +++ b/src/ГенераторОписаний/Модули/ГенераторОписанийКонфигуратор.os @@ -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.ЗакрытьЗапись(Запись); КонецФункции diff --git a/src/ГенераторОписаний/Модули/ГенераторОписанийОбщий.os b/src/ГенераторОписаний/Модули/ГенераторОписанийОбщий.os index 9794c1b..dda4cd8 100644 --- a/src/ГенераторОписаний/Модули/ГенераторОписанийОбщий.os +++ b/src/ГенераторОписаний/Модули/ГенераторОписанийОбщий.os @@ -61,7 +61,7 @@ Если ПустаяСтрока(ОписаниеСвойства.МетодПреобразования) Тогда - ГенераторОписанийОбщий.ЗаписатьЗначениеXML(Запись, ОписаниеСвойства.Поле, Значение); + ОбработкаXML.ЗаписатьЗначениеXML(Запись, ОписаниеСвойства.Поле, Значение); Иначе @@ -79,45 +79,6 @@ КонецФункции -#Область РаботаСXML - -// Закрывает запись описания объекта и всех открытых тэгов -// -// Параметры: -// Запись - ЗаписьXML - запись описания объекта -// -// Возвращаемое значение: -// Строка - XML описание объекта -// -Функция ЗакрытьЗапись(Запись) Экспорт - - Для Инд = 1 По Запись.КонтекстПространствИмен.Глубина Цикл - - Запись.ЗаписатьКонецЭлемента(); - - КонецЦикла; - - Возврат Запись.Закрыть(); - -КонецФункции - -// Записывает произвольное значение в XML поток -// -// Параметры: -// Запись - ЗаписьXML - Поток записи XML -// Имя - Строка - Имя реквизита, тэг -// Значение - Произвольный - Записываемое значение -// -Процедура ЗаписатьЗначениеXML(Запись, Имя, Значение) Экспорт - - Запись.ЗаписатьНачалоЭлемента(Имя); - Запись.ЗаписатьТекст(XMLСтрока(Значение)); - Запись.ЗаписатьКонецЭлемента(); - -КонецПроцедуры - -#КонецОбласти - /////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ /////////////////////////////////////////////////////////////////////////////// diff --git a/src/Общее/Модули/ОбработкаXML.os b/src/Общее/Модули/ОбработкаXML.os new file mode 100644 index 0000000..fbdf83a --- /dev/null +++ b/src/Общее/Модули/ОбработкаXML.os @@ -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 По Запись.КонтекстПространствИмен.Глубина Цикл + + Запись.ЗаписатьКонецЭлемента(); + + КонецЦикла; + + Возврат Запись.Закрыть(); + +КонецФункции + + + + +/////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +///////////////////////////////////////////////////////////////////////////////