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:
parent
b60278be6f
commit
b24a2006a5
@ -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 | |
|
||||
|
@ -32,7 +32,7 @@
|
||||
ЗаполнитьЗначенияСвойств(ОписаниеСвойства, Свойство);
|
||||
|
||||
ОписаниеСвойства.Поле = Свойство[РеквизитИмениПоля];
|
||||
ДанныеОписания.Свойства.Вставить(Свойство.Наименование, ОписаниеСвойства);
|
||||
ДанныеОписания.Свойства.Вставить(ОписаниеСвойства.Поле, ОписаниеСвойства);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
|
@ -459,7 +459,6 @@
|
||||
ТипПодсистема = ТипыОбъектовКонфигурации.ИмяТипаПодсистема();
|
||||
ИмяФайлаОписание = СтруктураКаталогов.ИмяФайлаОписанияОбъекта(ОбъектКонфигурации.Наименование, ОбъектКонфигурации.Тип);
|
||||
|
||||
|
||||
СвойстваОписания = ПрочитатьФайлОписанияОбъекта(ИмяФайлаОписание, ТипПодсистема);
|
||||
|
||||
ОбъектКонфигурации.Описание = СвойстваОписания;
|
||||
|
@ -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>"));
|
@ -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;
|
||||
|
||||
Значение = Рефлектор.ВызватьМетод(Читатель, МетодПреобразования, ЗначениеВМассиве);
|
||||
|
||||
Возврат Значение;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Рефлектор = Новый Рефлектор();
|
||||
|
@ -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 @@
|
||||
Возврат Данные;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Рефлектор = Новый Рефлектор();
|
Loading…
Reference in New Issue
Block a user