From e8ea526b74a5347b7a85053ee579106453c9c0a6 Mon Sep 17 00:00:00 2001 From: alkoleft Date: Sat, 9 Dec 2023 04:36:36 +0300 Subject: [PATCH] #214 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Вынес метод ЗначениеСвойства в публичный api --- .../src/CommonModules/ЮТОбщий/Module.bsl | 98 +++++++++++++++++++ .../ЮТСравнениеКлиентСервер/Module.bsl | 86 +--------------- tests/src/CommonModules/ОМ_Общий/Module.bsl | 16 +++ 3 files changed, 115 insertions(+), 85 deletions(-) diff --git a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl index 758ad95c..022a50ee 100644 --- a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl @@ -16,6 +16,43 @@ // //©///////////////////////////////////////////////////////////////////////////©// +#Область ПрограммныйИнтерфейс + +// Возвращает значение свойства объекта. +// Возможно получение "глубоко" вложенных свойство и элементов коллекции по индексу +// +// Параметры: +// Объект - Произвольный +// ИмяСвойства - Строка - Путь к свойству. Примеры: "ИмяСвойства.ИмяВложенногоСвойства", "[2].ИмяСвойства", "ИмяСвойства[2].ИмяВложенногоСвойства" +// - Число - Индекс элемента. Возможен выбор элемента с конца, для этого нужно указывать отрицательный номер элемента с конца, +// например: '-1' - последний элемент, '-2' - предпоследний +// Возвращаемое значение: +// Произвольный +Функция ЗначениеСвойства(Объект, ИмяСвойства) Экспорт + + Путь = ЧастиПути(ИмяСвойства); + + Значение = Объект; + Для Каждого Часть Из Путь Цикл + + Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда + Значение = Значение.Получить(); + КонецЕсли; + + Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда + Часть = Значение.Количество() + Часть; + КонецЕсли; + + Значение = Значение[Часть]; + + КонецЦикла; + + Возврат Значение; + +КонецФункции + +#КонецОбласти + #Область СлужебныйПрограммныйИнтерфейс #Область Строки @@ -1019,4 +1056,65 @@ КонецФункции +Функция ЧастиПути(Цепочка) + + ПутьКСвойству = Новый Массив(); + + ТипПути = ТипЗнч(Цепочка); + + Если ТипПути = Тип("Строка") Тогда + + Части = СтрРазделить(Цепочка, "."); + + Для Каждого Часть Из Части Цикл + + Если СодержитИндекс(Часть) Тогда + + ИзвлечьИндекс(Часть, ПутьКСвойству); + + Иначе + + ПутьКСвойству.Добавить(Часть); + + КонецЕсли; + + КонецЦикла; + + Иначе + + ПутьКСвойству.Добавить(Цепочка); + + КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off + + Возврат ПутьКСвойству; + +КонецФункции + +Функция СодержитИндекс(ИмяСвойства) + + Возврат СтрНайти(ИмяСвойства, "[") > 0 И СтрЗаканчиваетсяНа(ИмяСвойства, "]") ; + +КонецФункции + +Процедура ИзвлечьИндекс(ИмяСвойства, БлокиПути) + + ПозицияИндекса = СтрНайти(ИмяСвойства, "["); + + Если ПозицияИндекса > 1 Тогда + БлокиПути.Добавить(Лев(ИмяСвойства, ПозицияИндекса - 1)); + КонецЕсли; + + Пока ПозицияИндекса > 0 Цикл + + ЗакрывающаяПозиция = СтрНайти(ИмяСвойства, "]", , ПозицияИндекса); + ИндексСтрокой = Сред(ИмяСвойства, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1); + Индекс = Число(ИндексСтрокой); + БлокиПути.Добавить(Индекс); + + ПозицияИндекса = СтрНайти(ИмяСвойства, "[", , ЗакрывающаяПозиция); + + КонецЦикла; + +КонецПроцедуры + #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТСравнениеКлиентСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТСравнениеКлиентСервер/Module.bsl index 0e33d80a..31c5a560 100644 --- a/exts/yaxunit/src/CommonModules/ЮТСравнениеКлиентСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТСравнениеКлиентСервер/Module.bsl @@ -148,29 +148,6 @@ КонецФункции -Функция ЗначениеСвойства(Объект, ИмяСвойства) Экспорт - - Путь = ЧастиПути(ИмяСвойства); - - Значение = Объект; - Для Каждого Часть Из Путь Цикл - - Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда - Значение = Значение.Получить(); - КонецЕсли; - - Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда - Часть = Значение.Количество() + Часть; - КонецЕсли; - - Значение = Значение[Часть]; - - КонецЦикла; - - Возврат Значение; - -КонецФункции - #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -279,67 +256,6 @@ #КонецОбласти -Функция ЧастиПути(Цепочка) - - ПутьКСвойству = Новый Массив(); - - ТипПути = ТипЗнч(Цепочка); - - Если ТипПути = Тип("Строка") Тогда - - Части = СтрРазделить(Цепочка, "."); - - Для Каждого Часть Из Части Цикл - - Если СодержитИндекс(Часть) Тогда - - ИзвлечьИндекс(Часть, ПутьКСвойству); - - Иначе - - ПутьКСвойству.Добавить(Часть); - - КонецЕсли; - - КонецЦикла; - - Иначе - - ПутьКСвойству.Добавить(Цепочка); - - КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off - - Возврат ПутьКСвойству; - -КонецФункции - -Функция СодержитИндекс(ИмяСвойства) - - Возврат СтрНайти(ИмяСвойства, "[") > 0 И СтрЗаканчиваетсяНа(ИмяСвойства, "]") ; - -КонецФункции - -Процедура ИзвлечьИндекс(ИмяСвойства, БлокиПути) - - ПозицияИндекса = СтрНайти(ИмяСвойства, "["); - - Если ПозицияИндекса > 1 Тогда - БлокиПути.Добавить(Лев(ИмяСвойства, ПозицияИндекса - 1)); - КонецЕсли; - - Пока ПозицияИндекса > 0 Цикл - - ЗакрывающаяПозиция = СтрНайти(ИмяСвойства, "]", , ПозицияИндекса); - ИндексСтрокой = Сред(ИмяСвойства, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1); - Индекс = Число(ИндексСтрокой); - БлокиПути.Добавить(Индекс); - - ПозицияИндекса = СтрНайти(ИмяСвойства, "[", , ЗакрывающаяПозиция); - - КонецЦикла; - -КонецПроцедуры - Функция ЗначениеИмеетСвойство(Значение, Свойство) Результат = Ложь; @@ -387,7 +303,7 @@ Функция ПроверяемоеЗначение(ПараметрыПроверки) Если ПараметрыПроверки.ОбъектПроверки.ИмяСвойства <> Неопределено Тогда - Значение = ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства); + Значение = ЮТОбщий.ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства); Иначе Значение = ПараметрыПроверки.ОбъектПроверки.Значение; КонецЕсли; diff --git a/tests/src/CommonModules/ОМ_Общий/Module.bsl b/tests/src/CommonModules/ОМ_Общий/Module.bsl index a154d352..9073fa7c 100644 --- a/tests/src/CommonModules/ОМ_Общий/Module.bsl +++ b/tests/src/CommonModules/ОМ_Общий/Module.bsl @@ -28,6 +28,7 @@ .ДобавитьТест("Пауза") .ДобавитьТест("ВывестиВКонсоль") .ДобавитьСерверныйТест("Менеджер") + .ДобавитьТест("ЗначениеСвойства") ; КонецПроцедуры @@ -158,6 +159,21 @@ КонецПроцедуры #КонецЕсли +Процедура ЗначениеСвойства() Экспорт + + Массив = ЮТОбщий.ЗначениеВМассиве(1, 2, 3); + Структура = Новый Структура("Число, Массив", 1, Массив); + + Варианты = ЮТест.Варианты("Значение, Свойство, Результат") + .Добавить(Массив, 0, 1) + .Добавить(Массив, -1, 3) + .Добавить(Массив, "[0]", 1) + .Добавить(Массив, 1, 2) + .Добавить(Структура, "Число", 1) + .Добавить(Структура, "Массив[0]", 1); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции