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

#ONECICD-148

Унификация чтения EDT и конфигуратора
This commit is contained in:
aleksey.koryakin 2019-05-20 17:52:27 +03:00
parent b60278be6f
commit b24a2006a5
6 changed files with 297 additions and 349 deletions

View File

@ -27,6 +27,7 @@
| КартинкаОсновногоРаздела | mainSectionPicture | MainSectionPicture | |
| КомандныйИнтерфейс | commandInterface | CommandInterface | |
| КомандныйИнтерфейсОсновногоРаздела | mainSectionCommandInterface | MainSectionCommandInterface | |
| Комментарий | comment | Comment | МногоязычнаяСтрока |
| КраткаяИнформация | briefInformation | BriefInformation | МногоязычнаяСтрока |
| Логотип | logo | Logo | |
| МодульВнешнегоСоединения | externalConnectionModule | ExternalConnectionModule | |
@ -35,6 +36,7 @@
| МодульУправляемогоПриложения | managedApplicationModule | ManagedApplicationModule | |
| НазначениеРасширенияКонфигурации | configurationExtensionPurpose | ConfigurationExtensionPurpose | |
| НазначенияИспользования | usePurposes | UsePurposes | |
| Наименование | name | Name | |
| ОсновнаяФормаВариантаОтчета | defaultReportVariantForm | DefaultReportVariantForm | |
| ОсновнаяФормаКонстант | defaultConstantsForm | DefaultConstantsForm | |
| ОсновнаяФормаНастроекДинамическогоСписка | defaultDynamicListSettingsForm | DefaultDynamicListSettingsForm | |
@ -60,6 +62,7 @@
| РежимСовместимостиРасширенияКонфигурации | configurationExtensionCompatibilityMode | ConfigurationExtensionCompatibilityMode | |
| РежимУправленияБлокировкойДанных | dataLockControlMode | DataLockControlMode | |
| РодительскиеКонфигурации | parentConfigurations | ParentConfigurations | |
| Синоним | synonym | Synonym | МногоязычнаяСтрока |
| Справка | help | Help | |
| ТребуемыеРазрешенияМобильногоПриложения | requiredMobileApplicationPermissions | RequiredMobileApplicationPermissions | |
| ФрагментКомандногоИнтерфейса | commandInterfaceFragment | CommandInterfaceFragment | |

View File

@ -32,7 +32,7 @@
ЗаполнитьЗначенияСвойств(ОписаниеСвойства, Свойство);
ОписаниеСвойства.Поле = Свойство[РеквизитИмениПоля];
ДанныеОписания.Свойства.Вставить(Свойство.Наименование, ОписаниеСвойства);
ДанныеОписания.Свойства.Вставить(ОписаниеСвойства.Поле, ОписаниеСвойства);
КонецЦикла;

View File

@ -459,7 +459,6 @@
ТипПодсистема = ТипыОбъектовКонфигурации.ИмяТипаПодсистема();
ИмяФайлаОписание = СтруктураКаталогов.ИмяФайлаОписанияОбъекта(ОбъектКонфигурации.Наименование, ОбъектКонфигурации.Тип);
СвойстваОписания = ПрочитатьФайлОписанияОбъекта(ИмяФайлаОписание, ТипПодсистема);
ОбъектКонфигурации.Описание = СвойстваОписания;

View File

@ -4,61 +4,31 @@
//
///////////////////////////////////////////////////////////////////////////////
#Использовать reflector
///////////////////////////////////////////////////////////////////////////////
Перем Рефлектор;
Перем РегулярныеВыражения;
///////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
// Выполняет чтение описания объекта с учетом параметров
//
// Параметры:
// ТекстОписания - Строка - Описание объекта
// ПараметрыЧтения - Структура - Настройки обработки полей
//
// Возвращаемое значение:
// Структура - Данные описания
//
Функция ПолучитьСвойства(ТекстОписания, ПараметрыЧтения) Экспорт
Значения = Новый СписокЗначений();
НайденныеСовпадения = РегулярныеВыражения.СвойстваОписания.НайтиСовпадения(ТекстОписания);
Для Каждого Совпадение Из НайденныеСовпадения Цикл
Имя = Совпадение.Группы[1].Значение;
Значение = Совпадение.Группы[2].Значение;
Значения.Добавить(Имя, Значение);
КонецЦикла;
СвойстваОписания = ОбработатьСырыеДанные(Значения, ПараметрыЧтения);
Возврат СвойстваОписания;
КонецФункции
// Выполняет чтение описания объекта с учетом параметров
//
// Параметры:
// ИмяФайла - Строка - Путь к файлу описания
// ПараметрыЧтения - Структура - Настройки обработки полей
// ПараметрыЧтения - Структура - Описание трансформации данных описания в объект. См. ПараметрыСериализации.ПараметрыСериализации
//
// Возвращаемое значение:
// Структура - Данные описания
//
Функция ПрочитатьСвойстваИзФайла(ИмяФайла, ПараметрыЧтения) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ТекстОписания = Утилиты.ПрочитатьФайл(ИмяФайла);
СырыеДанные = ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения);
Возврат ПолучитьСвойства(ТекстОписания, ПараметрыЧтения);
ЧтениеXML.Закрыть();
СвойстваОписания = ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения);
Возврат СвойстваОписания;
КонецФункции
@ -67,77 +37,64 @@
///////////////////////////////////////////////////////////////////////////////
#Область МетодыЧтения
// Читает строку на разных языках
//
// Параметры:
// Значение - Строка - Данные содержащие строку на разных языках
// ЧтениеXML - ЧтениеXML - Читатель данных
//
// Возвращаемое значение:
// Строка - Данные строки
//
Функция МногоязычнаяСтрока(Знач Значение) Экспорт
Функция МногоязычнаяСтрока(Знач ЧтениеXML) Экспорт
Регулярка = РегулярныеВыражения.МногоязычнаяСтрока;
Совпадения = Регулярка.НайтиСовпадения(Значение);
Если Совпадения.Количество() Тогда
Значение = Совпадения[0].Группы[1].Значение;
Иначе
Значение = "";
КонецЕсли;
Возврат Значение;
Возврат ЧтениеОписанийБазовый.ЗначениеВложенногоТэга(ЧтениеXML, "value");
КонецФункции
// Читает описание типа
//
// Параметры:
// Значение - Строка - Данные содержащие описание типа
// ЧтениеXML - ЧтениеXML - Читатель данных
//
// Возвращаемое значение:
// Строка - Значение типа
//
Функция ПолучитьТип(Знач Значение) Экспорт
Регулярка = РегулярныеВыражения.ПолучитьТип;
Совпадения = Регулярка.НайтиСовпадения(Значение);
Если Совпадения.Количество() Тогда
Значение = Совпадения[0].Группы[1].Значение;
Иначе
Значение = "";
КонецЕсли;
Функция ПолучитьТип(Знач ЧтениеXML) Экспорт
Значение = ЧтениеОписанийБазовый.ЗначениеВложенногоТэга(ЧтениеXML, "types");
Возврат ЧтениеОписанийБазовый.ПреобразоватьТип(Значение);
КонецФункции
Функция ЗначениеБулево(Знач Значение) Экспорт
// Читает логическое значение
//
// Параметры:
// Значение - Строка - Данные содержащие булево
//
// Возвращаемое значение:
// Булево - Значение
//
Функция ЗначениеБулево(Знач ЧтениеXML) Экспорт
Возврат СтрСравнить(Значение, "true") = 0;
ЧтениеXML.Прочитать();
Возврат ЧтениеXML.ИмеетЗначение И СтрСравнить(ЧтениеXML.Значение, "true") = 0;
КонецФункции
// Читает состав подсистемы
//
// Параметры:
// Значение - Строка - Данные содержащие элемент состава
// ЧтениеXML - ЧтениеXML - Читатель данных
//
// Возвращаемое значение:
// Массив - Состав подсистемы
// Строка - Полное имя объекта
//
Функция СоставПодсистемы(Знач Значение) Экспорт
Функция СоставПодсистемы(ЧтениеXML) Экспорт
Возврат Значение;
ЧтениеXML.Прочитать();
Возврат ЧтениеXML.Значение;
КонецФункции
@ -147,88 +104,36 @@
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////
Функция ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения)
Данные = Новый Структура();
ЧтениеXML.Прочитать();
ЧтениеXML.Прочитать();
Данные = ЧтениеОписанийБазовый.ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения, ЭтотОбъект);
Возврат Данные;
КонецФункции
Функция ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения)
СтруктураСырыхДанных = Новый Структура();
Коллекции = Новый Структура();
Для Каждого Свойство Из ПараметрыЧтения.Свойства Цикл
ДанныеОбъекта = ЧтениеОписанийБазовый.ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения);
Если Свойство.Значение.ЭтоКоллекция Тогда
Коллекции.Вставить(Свойство.Значение.Поле);
КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из СырыеДанные Цикл
Если Коллекции.Свойство(Элемент.Значение) Тогда
Если НЕ СтруктураСырыхДанных.Свойство(Элемент.Значение) Тогда
СтруктураСырыхДанных.Вставить(Элемент.Значение, Новый Массив());
КонецЕсли;
СтруктураСырыхДанных[Элемент.Значение].Добавить(Элемент.Представление);
Иначе
СтруктураСырыхДанных.Вставить(Элемент.Значение, Элемент.Представление);
КонецЕсли;
КонецЦикла;
ДанныеОбъекта = ЧтениеОписанийБазовый.ОбработатьСырыеДанные(СтруктураСырыхДанных, ПараметрыЧтения);
ЗначениеВМассиве = Новый Массив(1);
ОписаниеСвойства = Неопределено;
Для Каждого Элемент Из ДанныеОбъекта Цикл
Если НЕ ПараметрыЧтения.Свойства.Свойство(Элемент.Ключ, ОписаниеСвойства) ИЛИ НЕ ЗначениеЗаполнено(ОписаниеСвойства.МетодПреобразования) Тогда
Продолжить;
КонецЕсли;
Значение = Элемент.Значение;
Если ПараметрыЧтения.Свойства[Элемент.Ключ].ЭтоКоллекция Тогда
Для Инд = 0 По Значение.ВГраница() Цикл
ЗначениеВМассиве[0] = Значение[Инд];
Значение[Инд] = Рефлектор.ВызватьМетод(ЭтотОбъект, ОписаниеСвойства.МетодПреобразования, ЗначениеВМассиве);
КонецЦикла;
Иначе
ЗначениеВМассиве[0] = Значение;
Значение = Рефлектор.ВызватьМетод(ЭтотОбъект, ОписаниеСвойства.МетодПреобразования, ЗначениеВМассиве);
КонецЕсли;
ДанныеОбъекта[Элемент.Ключ] = Значение;
КонецЦикла;
Если ПараметрыЧтения.ЕстьПодчиненные Тогда
Для Каждого Элемент Из СырыеДанные Цикл
Если Элемент.Значение <> "languages" И ТипыОбъектовКонфигурации.ОписаниеТипаПоИмени(Элемент.Значение) <> Неопределено Тогда
Если Элемент.Ключ <> "languages" И ТипыОбъектовКонфигурации.ОписаниеТипаПоИмени(Элемент.Ключ) <> Неопределено Тогда
Если СтрНайти(Элемент.Представление, ".") = 0 Тогда
Если СтрНайти(Элемент.Значение, ".") = 0 Тогда
ДанныеОбъекта.Подчиненные.Добавить(Элемент.Значение + "." + Элемент.Представление);
ДанныеОбъекта.Подчиненные.Добавить(Элемент.Ключ + "." + Элемент.Значение);
Иначе
ДанныеОбъекта.Подчиненные.Добавить(Элемент.Представление);
ДанныеОбъекта.Подчиненные.Добавить(Элемент.Значение);
КонецЕсли;
@ -241,11 +146,3 @@
Возврат ДанныеОбъекта;
КонецФункции
Рефлектор = Новый Рефлектор;
РегулярныеВыражения = Новый Структура();
РегулярныеВыражения.Вставить("СвойстваОписания", Новый РегулярноеВыражение("<([a-zA-Z]+)\b[^>]*>([\s\S]*?)<\/\1>"));
РегулярныеВыражения.Вставить("МногоязычнаяСтрока", Новый РегулярноеВыражение("<value>([\s\S]*)<\/value>"));
РегулярныеВыражения.Вставить("ПолучитьТип", Новый РегулярноеВыражение("<types>([\s\S]*)<\/types>"));

View File

@ -4,52 +4,12 @@
//
///////////////////////////////////////////////////////////////////////////////
Перем Рефлектор;
///////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
// Формирует привычное имя типа из XML описания
//
// Параметры:
// ТипИзXML - Строка- Имя типа XML
//
// Возвращаемое значение:
// Строка - Дружелюбное имя
//
Функция ПреобразоватьТип(ТипИзXML) Экспорт
СоответствиеТипов = Новый Соответствие;
СоответствиеТипов.Вставить("xs:boolean", "Булево");
СоответствиеТипов.Вставить("xs:decimal", "Число");
СоответствиеТипов.Вставить("xs:string", "Строка");
СоответствиеТипов.Вставить("xs:dateTime", "Дата");
СоответствиеТипов.Вставить("v8:ValueStorage", "Хранилище Значений");
СоответствиеТипов.Вставить("v8:UUID", "UUID");
СоответствиеТипов.Вставить("v8:Null", "Null");
Если СтрНачинаетсяС(ТипИзXML, "xs") Или СтрНачинаетсяС(ТипИзXML, "v8") Тогда
ПреобразованныйТип = СоответствиеТипов[ТипИзXML];
ИначеЕсли СтрНачинаетсяС(ТипИзXML, "cfg:") Тогда
ТипИзXML = СтрЗаменить(ТипИзXML, "cfg:", "");
ЧастиТипа = СтрРазделить(ТипИзXML, ".");
ТипОбъекта = СтрЗаменить(ЧастиТипа[0], "Ref", "");
ПреобразованныйТип = ТипыОбъектовКонфигурации.ПолучитьИмяТипаНаРусском(ТипОбъекта) + "." + ЧастиТипа[1];
Иначе
ПреобразованныйТип = ТипИзXML;
КонецЕсли;
Возврат ПреобразованныйТип;
КонецФункции
// Возвращает полное наименование объекта конфигурации или модуля
//
// Параметры:
@ -81,29 +41,233 @@
КонецФункции
// Возвращает объект на основании считанных из описания данных
//
// Параметры:
// СырыеДанные - ТаблицаЗначений - Считанные из файла описаний данные
// ПараметрыЧтения - Структура - Описание трансформации данных описания в объект. См. ПараметрыСериализации.ПараметрыСериализации
//
// Возвращаемое значение:
// Структура - Данные объекта
//
Функция ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения) Экспорт
ДанныеОбъекта = СтруктурыОписаний.СоздатьСтруктураОбъекта(ПараметрыЧтения.Тип);
Для Каждого ЭлементПараметр Из ПараметрыЧтения.Свойства Цикл
Для Каждого Запись Из СырыеДанные Цикл
Параметр = ЭлементПараметр.Значение;
Значение = Неопределено;
Параметр = Неопределено;
Если НЕ СырыеДанные.Свойство(Параметр.Поле, Значение) Тогда
Значение = "";
Если НЕ ПараметрыЧтения.Свойства.Свойство(Запись.Ключ, Параметр) Тогда
Продолжить;
КонецЕсли;
ДанныеОбъекта[ЭлементПараметр.Ключ] = Значение;
Если Параметр.ЭтоКоллекция Тогда
ДанныеОбъекта[Параметр.Наименование].Добавить(Запись.Значение);
Иначе
ДанныеОбъекта[Параметр.Наименование] = Запись.Значение;
КонецЕсли;
КонецЦикла;
Возврат ДанныеОбъекта;
КонецФункции
// Выполняет чтение данных описания
//
// Параметры:
// ЧтениеXML - ЧтениеXML - Читатель данных
// ПараметрыЧтения - Структура - Описание трансформации данных описания в объект. См. ПараметрыСериализации.ПараметрыСериализации
// Читатель - Модуль - Модуль реализующий интерфейс преобразования данных
//
// Возвращаемое значение:
// ТаблицаЗначений - Значения свойств описания объекта
//
Функция ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения, Читатель) Экспорт
ПараметрыПреобразования = ПараметрыПреобразованияПриЧтении(ПараметрыЧтения, Читатель);
УровеньКорня = ЧтениеXML.КонтекстПространствИмен.Глубина - 1; // Окончание элемента, которое нам нужно поймать имеет уровень -1 от текущего
ИмяКорня = ЧтениеXML.ЛокальноеИмя;
Значения = Новый ТаблицаЗначений();
Значения.Колонки.Добавить("Ключ");
Значения.Колонки.Добавить("Значение");
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ИмяКорня = ЧтениеXML.ЛокальноеИмя И УровеньКорня = ЧтениеXML.КонтекстПространствИмен.Глубина Тогда
Прервать;
КонецЕсли;
Если УровеньКорня >= ЧтениеXML.КонтекстПространствИмен.Глубина Тогда
ВызватьИсключение "Ошибка чтения свойств. Ошибка алгоритма преобразования";
КонецЕсли;
Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
КлючСвойства = ЧтениеXML.ЛокальноеИмя;
Если ПараметрыПреобразования.Свойство(КлючСвойства) Тогда
Значение = ПреобразоватьЗначение(ЧтениеXML, ПараметрыПреобразования[КлючСвойства], Читатель);
Иначе
ЧтениеXML.Прочитать();
Если ЧтениеXML.ИмеетЗначение Тогда
Значение = ЧтениеXML.Значение;
ЧтениеXML.Прочитать();
Иначе
Пока УровеньКорня + 1 <> ЧтениеXML.КонтекстПространствИмен.Глубина Цикл
ЧтениеXML.Пропустить();
КонецЦикла;
Продолжить;
КонецЕсли;
КонецЕсли;
ЗаписьЗначения = Значения.Добавить();
ЗаписьЗначения.Ключ = КлючСвойства;
ЗаписьЗначения.Значение = Значение;
КонецЦикла;
Возврат Значения;
КонецФункции
// Читает значение вложенного элемента
//
// Параметры:
// ЧтениеXML - ЧтениеXML - Читатель данных
//
// Возвращаемое значение:
// Произвольный - Данные вложенного элемента
//
Функция ЗначениеВложенногоТэга(Знач ЧтениеXML, ИмяТега) Экспорт
Имя = ЧтениеXML.Имя;
Пока ЧтениеXML.Имя <> ИмяТега Цикл
Если ЧтениеXML.Имя = Имя И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Возврат "";
КонецЕсли;
ЧтениеXML.Прочитать();
КонецЦикла;
ЧтениеXML.Прочитать();
Значение = ЧтениеXML.Значение;
ЧтениеXML.Прочитать();
Возврат Значение;
КонецФункции
// Формирует привычное имя типа из XML описания
//
// Параметры:
// ТипИзXML - Строка- Имя типа XML
//
// Возвращаемое значение:
// Строка - Дружелюбное имя
//
Функция ПреобразоватьТип(ТипИзXML) Экспорт
// TODO: Проверить для EDT
СоответствиеТипов = Новый Соответствие;
СоответствиеТипов.Вставить("xs:boolean", "Булево");
СоответствиеТипов.Вставить("xs:decimal", "Число");
СоответствиеТипов.Вставить("xs:string", "Строка");
СоответствиеТипов.Вставить("xs:dateTime", "Дата");
СоответствиеТипов.Вставить("v8:ValueStorage", "Хранилище Значений");
СоответствиеТипов.Вставить("v8:UUID", "UUID");
СоответствиеТипов.Вставить("v8:Null", "Null");
Если СтрНачинаетсяС(ТипИзXML, "xs") Или СтрНачинаетсяС(ТипИзXML, "v8") Тогда
ПреобразованныйТип = СоответствиеТипов[ТипИзXML];
ИначеЕсли СтрНачинаетсяС(ТипИзXML, "cfg:") Тогда
ТипИзXML = СтрЗаменить(ТипИзXML, "cfg:", "");
ЧастиТипа = СтрРазделить(ТипИзXML, ".");
ТипОбъекта = СтрЗаменить(ЧастиТипа[0], "Ref", "");
ПреобразованныйТип = ТипыОбъектовКонфигурации.ПолучитьИмяТипаНаРусском(ТипОбъекта) + "." + ЧастиТипа[1];
Иначе
ПреобразованныйТип = ТипИзXML;
КонецЕсли;
Возврат ПреобразованныйТип;
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////
// Формирует параметры для кастомного преобразования данных.
//
// Параметры:
// ПараметрыЧтения - Структура - Описание трансформации данных описания в объект. См. ПараметрыСериализации.ПараметрыСериализации
// Читатель - Модуль - Модуль реализующий интерфейс преобразования данных
//
// Возвращаемое значение:
// Структура - Параметры преобразования
//
Функция ПараметрыПреобразованияПриЧтении(ПараметрыЧтения, Читатель) Экспорт
ОбработчикиПолей = Новый Структура();
Для Каждого Элемент Из ПараметрыЧтения.Свойства Цикл
Параметр = Элемент.Значение;
Если НЕ ПустаяСтрока(Параметр.МетодПреобразования) И Рефлектор.МетодСуществует(Читатель, Параметр.МетодПреобразования) Тогда
ОбработчикиПолей.Вставить(ВРег(Параметр.Поле), Параметр.МетодПреобразования);
КонецЕсли;
КонецЦикла;
Возврат ОбработчикиПолей;
КонецФункции // ОбработчикиПреобразований
Функция ПреобразоватьЗначение(ЧтениеXML, МетодПреобразования, Читатель)
ЗначениеВМассиве = Новый Массив(1);
ЗначениеВМассиве[0] = ЧтениеXML;
Значение = Рефлектор.ВызватьМетод(Читатель, МетодПреобразования, ЗначениеВМассиве);
Возврат Значение;
КонецФункции
Рефлектор = Новый Рефлектор();

View File

@ -4,45 +4,15 @@
//
///////////////////////////////////////////////////////////////////////////////
#Использовать reflector
///////////////////////////////////////////////////////////////////////////////
Перем Рефлектор;
///////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
// Выполняет чтение описания объекта с учетом параметров
//
// Параметры:
// ТекстОписания - Строка - Описание объекта
// ПараметрыЧтения - Структура - Настройки обработки полей
//
// Возвращаемое значение:
// Структура - Данные описания
//
Функция ПолучитьСвойства(ТекстОписания, ПараметрыЧтения) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстОписания);
СырыеДанные = ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения);
ЧтениеXML.Закрыть();
СвойстваОписания = ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения);
Возврат СвойстваОписания;
КонецФункции
// Выполняет чтение описания объекта с учетом параметров
//
// Параметры:
// ИмяФайла - Строка - Путь к файлу описания
// ПараметрыЧтения - Структура - Настройки обработки полей
// ПараметрыЧтения - Структура - Описание трансформации данных описания в объект. См. ПараметрыСериализации.ПараметрыСериализации
//
// Возвращаемое значение:
// Структура - Данные описания
@ -78,26 +48,7 @@
//
Функция МногоязычнаяСтрока(Знач ЧтениеXML) Экспорт
Имя = ЧтениеXML.Имя;
Пока ЧтениеXML.Имя <> "v8:content" Цикл
Если ЧтениеXML.Имя = Имя И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Возврат "";
КонецЕсли;
ЧтениеXML.Прочитать();
КонецЦикла;
ЧтениеXML.Прочитать();
Значение = ЧтениеXML.Значение;
ЧтениеXML.Прочитать();
Возврат Значение;
Возврат ЧтениеОписанийБазовый.ЗначениеВложенногоТэга(ЧтениеXML, "v8:content");
КонецФункции
@ -111,25 +62,20 @@
//
Функция ПолучитьТип(Знач ЧтениеXML) Экспорт
Пока ЧтениеXML.Имя <> "v8:Type" Цикл
ЧтениеXML.Прочитать();
КонецЦикла;
ЧтениеXML.Прочитать();
Значение = ЧтениеXML.Значение;
Значение = ЧтениеОписанийБазовый.ЗначениеВложенногоТэга(ЧтениеXML, "v8:Type");
Пока ЧтениеXML.Имя <> "Type" Цикл
ЧтениеXML.Прочитать();
КонецЦикла;
Возврат ЧтениеОписанийБазовый.ПреобразоватьТип(Значение);
КонецФункции
// Читает логическое значение
//
// Параметры:
// Значение - Строка - Данные содержащие булево
//
// Возвращаемое значение:
// Булево - Значение
//
Функция ЗначениеБулево(Знач ЧтениеXML) Экспорт
ЧтениеXML.Прочитать();
@ -175,13 +121,13 @@
КонецФункции
// Читает состав подсистемы
// Читает описание подчиненных элементов
//
// Параметры:
// ЧтениеXML - ЧтениеXML - Читатель данных
//
// Возвращаемое значение:
// Массив - Состав подсистемы
// Массив - Описание подчиненных элементов
//
Функция Подчиненные(Знач ЧтениеXML) Экспорт
@ -213,11 +159,17 @@
Функция ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения)
ДанныеОбъекта = ЧтениеОписанийБазовый.ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения);
Если ПараметрыЧтения.ЕстьПодчиненные И СырыеДанные.Свойство("ChildObjects") И ЗначениеЗаполнено(СырыеДанные.ChildObjects) Тогда
ДанныеОбъекта.Вставить("Подчиненные", СырыеДанные.ChildObjects);
Если ПараметрыЧтения.ЕстьПодчиненные Тогда
Подчиненные = СырыеДанные.Найти("ChildObjects", "Ключ");
Если ЗначениеЗаполнено(Подчиненные) Тогда
ДанныеОбъекта.Вставить("Подчиненные", Подчиненные.Значение);
КонецЕсли;
КонецЕсли;
Возврат ДанныеОбъекта;
@ -228,82 +180,17 @@
Данные = Новый Структура();
ОбработчикиПолей = Новый Структура();
Для Каждого Элемент Из ПараметрыЧтения.Свойства Цикл
Параметр = Элемент.Значение;
Если НЕ ПустаяСтрока(Параметр.МетодПреобразования) Тогда
ОбработчикиПолей.Вставить(ВРег(Параметр.Поле), Параметр.МетодПреобразования);
КонецЕсли;
КонецЦикла;
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Properties" Тогда
Уровень = ЧтениеXML.КонтекстПространствИмен.Глубина;
// Настройки
Пока НЕ (ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Properties") Цикл
ЧтениеXML.Прочитать();
КлючСвойства = "";
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Имя = "RequiredMobileApplicationPermissions" Тогда // атрибуты мобильного приложения
Пока НЕ (ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "RequiredMobileApplicationPermissions") Цикл
ЧтениеXML.Прочитать();
КонецЦикла;
Иначе
КлючСвойства = ЧтениеXML.ЛокальноеИмя;
Если ОбработчикиПолей.Свойство(ВРег(КлючСвойства)) Тогда
ЗначениеВМассиве = Новый Массив();
ЗначениеВМассиве.Добавить(ЧтениеXML);
Значение = Рефлектор.ВызватьМетод(ЭтотОбъект, ОбработчикиПолей[КлючСвойства], ЗначениеВМассиве);
Иначе
ЧтениеXML.Прочитать();
Уровень = ЧтениеXML.КонтекстПространствИмен.Глубина;
Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
ЧтениеXML.Прочитать();
КонецЦикла;
Значение = ЧтениеXML.Значение;
Пока Уровень < ЧтениеXML.КонтекстПространствИмен.Глубина Цикл
ЧтениеXML.Прочитать();
КонецЦикла;
КонецЕсли;
Данные.Вставить(КлючСвойства, Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Данные = ЧтениеОписанийБазовый.ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения, ЭтотОбъект);
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "ChildObjects" Тогда
Данные.Вставить("ChildObjects", Подчиненные(ЧтениеXML));
ЗаписьЗначение = Данные.Добавить();
ЗаписьЗначение.Ключ = "ChildObjects";
ЗаписьЗначение.Значение = Подчиненные(ЧтениеXML);
КонецЕсли;
@ -312,5 +199,3 @@
Возврат Данные;
КонецФункции
Рефлектор = Новый Рефлектор();