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

#ONECICD-148

Рефакторинг чтения из файлов описаний
This commit is contained in:
aleksey.koryakin 2019-05-14 09:58:56 +03:00
parent 78e9620464
commit 3dbb7412fd
3 changed files with 71 additions and 113 deletions

View File

@ -24,9 +24,9 @@
// Возвращаемое значение:
// Структура - Данные описания
//
Функция ПолучитьСвойства(ТекстОписания, ПараметрыЧтения = Неопределено) Экспорт
Функция ПолучитьСвойства(ТекстОписания, ПараметрыЧтения) Экспорт
СвойстваОписания = Новый Структура();
Значения = Новый СписокЗначений();
НайденныеСовпадения = РегулярныеВыражения.СвойстваОписания.НайтиСовпадения(ТекстОписания);
@ -35,35 +35,11 @@
Имя = Совпадение.Группы[1].Значение;
Значение = Совпадение.Группы[2].Значение;
Если СвойстваОписания.Свойство(Имя) Тогда
Если ТипЗнч(СвойстваОписания[Имя]) = Тип("Массив") Тогда
СвойстваОписания[Имя].Добавить(Значение);
Иначе
КоллекцияЗначений = Новый Массив();
КоллекцияЗначений.Добавить(СвойстваОписания[Имя]);
КоллекцияЗначений.Добавить(Значение);
СвойстваОписания.Вставить(Имя, КоллекцияЗначений);
КонецЕсли;
Иначе
СвойстваОписания.Вставить(Имя, Значение);
КонецЕсли;
Значения.Добавить(Имя, Значение);
КонецЦикла;
Если ПараметрыЧтения <> Неопределено Тогда
СвойстваОписания = ВыполнитьОбработкуПрочитанныхСвойств(СвойстваОписания, ПараметрыЧтения, ЭтотОбъект);
КонецЕсли;
СвойстваОписания = ОбработатьСырыеДанные(Значения, ПараметрыЧтения);
Возврат СвойстваОписания;
@ -78,7 +54,7 @@
// Возвращаемое значение:
// Структура - Данные описания
//
Функция ПрочитатьСвойстваИзФайла(ИмяФайла, ПараметрыЧтения = Неопределено) Экспорт
Функция ПрочитатьСвойстваИзФайла(ИмяФайла, ПараметрыЧтения) Экспорт
ТекстОписания = Утилиты.ПрочитатьФайл(ИмяФайла);
@ -171,74 +147,50 @@
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////
Функция ВыполнитьОбработкуПрочитанныхСвойств(СырыеДанные, ПараметрыЧтения, ОбъектПреобразователь)
Функция ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения)
СвойстваОписания = Новый Структура();
СтруктураСырыхДанных = Новый Структура();
Для Каждого Параметр Из ПараметрыЧтения Цикл
Для Каждого Элемент Из СырыеДанные Цикл
Значение = Неопределено;
СтруктураСырыхДанных.Вставить(Элемент.Значение, Элемент.Представление);
КонецЦикла;
ДанныеОбъекта = ЧтениеОписанийБазовый.ОбработатьСырыеДанные(СтруктураСырыхДанных, ПараметрыЧтения);
ЗначениеВМассиве = Новый Массив(1);
ОписаниеСвойства = Неопределено;
Для Каждого Элемент Из ДанныеОбъекта Цикл
Если НЕ СырыеДанные.Свойство(Параметр.Значение.Поле, Значение) Тогда
Значение = "";
Если НЕ ПараметрыЧтения.Свойства.Свойство(Элемент.Ключ, ОписаниеСвойства) ИЛИ НЕ ЗначениеЗаполнено(ОписаниеСвойства.МетодПреобразования) Тогда
Продолжить;
КонецЕсли;
Значение = ОбработатьСвойство(Значение, Параметр.Значение, ОбъектПреобразователь);
СвойстваОписания.Вставить(Параметр.Ключ, Значение);
ЗначениеВМассиве[0] = Элемент.Значение;
Значение = Рефлектор.ВызватьМетод(ЭтотОбъект, ОписаниеСвойства.МетодПреобразования, ЗначениеВМассиве);
ДанныеОбъекта.Вставить(Элемент.Ключ, Значение);
КонецЦикла;
Возврат СвойстваОписания;
КонецФункции
Если ПараметрыЧтения.ЕстьПодчиненные Тогда
Для Каждого Элемент Из СырыеДанные Цикл
Если Элемент.Значение <> "languages" И ТипыОбъектовКонфигурации.ОписаниеТипаПоИмени(Элемент.Значение) <> Неопределено Тогда
ДанныеОбъекта.Подчиненные.Добавить(Элемент.Представление);
КонецЕсли;
Функция ОбработатьСвойство(Значение, Параметр, ОбъектПреобразователь)
Если ПустаяСтрока(Значение) И Параметр.Коллекция Тогда
Возврат Новый Массив();
ИначеЕсли ПустаяСтрока(Значение) Тогда
Возврат Значение;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Массив") И ПустаяСтрока(Параметр.МетодПреобразования) И НЕ Параметр.Многоязычный Тогда
Возврат Значение;
КонецЕсли;
МетодПреобразования = Параметр.МетодПреобразования;
Если НЕ ЗначениеЗаполнено(МетодПреобразования) И Параметр.Многоязычный Тогда
МетодПреобразования = "МногоязычнаяСтрока";
КонецЕсли;
Если ЗначениеЗаполнено(МетодПреобразования) Тогда
ЗначениеВМассиве = Новый Массив();
ЗначениеВМассиве.Добавить(Значение);
Значение = Рефлектор.ВызватьМетод(ОбъектПреобразователь, МетодПреобразования, ЗначениеВМассиве);
КонецЕсли;
Если Параметр.Коллекция И ТипЗнч(Значение) <> Тип("Массив") Тогда
Результат = Новый Массив();
Результат.Добавить(Значение);
Значение = Результат;
КонецЦикла;
КонецЕсли;
Возврат Значение;
Возврат ДанныеОбъекта;
КонецФункции

View File

@ -81,6 +81,28 @@
КонецФункции
Функция ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения) Экспорт
ДанныеОбъекта = СтруктурыОписаний.СоздатьСтруктураОбъекта(ПараметрыЧтения.Тип);
Для Каждого Параметр Из ПараметрыЧтения.Свойства Цикл
Значение = Неопределено;
Если НЕ СырыеДанные.Свойство(Параметр.Значение.Поле, Значение) Тогда
Значение = "";
КонецЕсли;
ДанныеОбъекта.Вставить(Параметр.Ключ, Значение);
КонецЦикла;
Возврат ДанныеОбъекта;
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////

View File

@ -25,16 +25,14 @@
//
Функция ПолучитьСвойства(ТекстОписания, ПараметрыЧтения) Экспорт
СвойстваОписания = Новый Структура();
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстОписания);
ПрочитатьСвойстваXML(ЧтениеXML, СвойстваОписания, ПараметрыЧтения);
СырыеДанные = ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения);
ЧтениеXML.Закрыть();
СвойстваОписания = ВыполнитьОбработкуПрочитанныхСвойств(СвойстваОписания, ПараметрыЧтения);
СвойстваОписания = ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения);
Возврат СвойстваОписания;
@ -51,16 +49,14 @@
//
Функция ПрочитатьСвойстваИзФайла(ИмяФайла, ПараметрыЧтения) Экспорт
СвойстваОписания = Новый Структура();
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ПрочитатьСвойстваXML(ЧтениеXML, СвойстваОписания, ПараметрыЧтения);
СырыеДанные = ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения);
ЧтениеXML.Закрыть();
СвойстваОписания = ВыполнитьОбработкуПрочитанныхСвойств(СвойстваОписания, ПараметрыЧтения);
СвойстваОписания = ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения);
Возврат СвойстваОписания;
@ -214,35 +210,23 @@
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////
Функция ВыполнитьОбработкуПрочитанныхСвойств(СырыеДанные, ПараметрыЧтения)
Функция ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения)
СвойстваОписания = СтруктурыОписаний.СоздатьСтруктураОбъекта(ПараметрыЧтения.Тип);
Для Каждого Параметр Из ПараметрыЧтения.Свойства Цикл
Значение = Неопределено;
Если НЕ СырыеДанные.Свойство(Параметр.Значение.Поле, Значение) Тогда
Значение = "";
КонецЕсли;
СвойстваОписания.Вставить(Параметр.Ключ, Значение);
КонецЦикла;
ДанныеОбъекта = ЧтениеОписанийБазовый.ОбработатьСырыеДанные(СырыеДанные, ПараметрыЧтения);
Если ПараметрыЧтения.ЕстьПодчиненные И СырыеДанные.Свойство("ChildObjects") И ЗначениеЗаполнено(СырыеДанные.ChildObjects) Тогда
СвойстваОписания.Вставить("Подчиненные", СырыеДанные.ChildObjects);
ДанныеОбъекта.Вставить("Подчиненные", СырыеДанные.ChildObjects);
КонецЕсли;
Возврат СвойстваОписания;
Возврат ДанныеОбъекта;
КонецФункции
Функция ПрочитатьСвойстваXML(ЧтениеXML, Данные, ПараметрыЧтения)
Функция ПрочитатьСвойстваXML(ЧтениеXML, ПараметрыЧтения)
Данные = Новый Структура();
ОбработчикиПолей = Новый Структура();