1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-12-09 08:55:53 +02:00

Merge pull request #230 from bia-technologies/feature/214

214 / Вынес метод ЗначениеСвойства в публичный api
This commit is contained in:
Koryakin Aleksey 2023-12-09 04:50:51 +03:00 committed by GitHub
commit 25959f6585
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 115 additions and 85 deletions

View File

@ -16,6 +16,43 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область ПрограммныйИнтерфейс
// Возвращает значение свойства объекта.
// Возможно получение "глубоко" вложенных свойство и элементов коллекции по индексу
//
// Параметры:
// Объект - Произвольный
// ИмяСвойства - Строка - Путь к свойству. Примеры: "ИмяСвойства.ИмяВложенногоСвойства", "[2].ИмяСвойства", "ИмяСвойства[2].ИмяВложенногоСвойства"
// - Число - Индекс элемента. Возможен выбор элемента с конца, для этого нужно указывать отрицательный номер элемента с конца,
// например: '-1' - последний элемент, '-2' - предпоследний
// Возвращаемое значение:
// Произвольный
Функция ЗначениеСвойства(Объект, ИмяСвойства) Экспорт
Путь = ЧастиПути(ИмяСвойства);
Значение = Объект;
Для Каждого Часть Из Путь Цикл
Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
Значение = Значение.Получить();
КонецЕсли;
Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда
Часть = Значение.Количество() + Часть;
КонецЕсли;
Значение = Значение[Часть];
КонецЦикла;
Возврат Значение;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#Область Строки
@ -1019,4 +1056,65 @@
КонецФункции
Функция ЧастиПути(Цепочка)
ПутьКСвойству = Новый Массив();
ТипПути = ТипЗнч(Цепочка);
Если ТипПути = Тип("Строка") Тогда
Части = СтрРазделить(Цепочка, ".");
Для Каждого Часть Из Части Цикл
Если СодержитИндекс(Часть) Тогда
ИзвлечьИндекс(Часть, ПутьКСвойству);
Иначе
ПутьКСвойству.Добавить(Часть);
КонецЕсли;
КонецЦикла;
Иначе
ПутьКСвойству.Добавить(Цепочка);
КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off
Возврат ПутьКСвойству;
КонецФункции
Функция СодержитИндекс(ИмяСвойства)
Возврат СтрНайти(ИмяСвойства, "[") > 0 И СтрЗаканчиваетсяНа(ИмяСвойства, "]") ;
КонецФункции
Процедура ИзвлечьИндекс(ИмяСвойства, БлокиПути)
ПозицияИндекса = СтрНайти(ИмяСвойства, "[");
Если ПозицияИндекса > 1 Тогда
БлокиПути.Добавить(Лев(ИмяСвойства, ПозицияИндекса - 1));
КонецЕсли;
Пока ПозицияИндекса > 0 Цикл
ЗакрывающаяПозиция = СтрНайти(ИмяСвойства, "]", , ПозицияИндекса);
ИндексСтрокой = Сред(ИмяСвойства, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1);
Индекс = Число(ИндексСтрокой);
БлокиПути.Добавить(Индекс);
ПозицияИндекса = СтрНайти(ИмяСвойства, "[", , ЗакрывающаяПозиция);
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -148,29 +148,6 @@
КонецФункции
Функция ЗначениеСвойства(Объект, ИмяСвойства) Экспорт
Путь = ЧастиПути(ИмяСвойства);
Значение = Объект;
Для Каждого Часть Из Путь Цикл
Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
Значение = Значение.Получить();
КонецЕсли;
Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда
Часть = Значение.Количество() + Часть;
КонецЕсли;
Значение = Значение[Часть];
КонецЦикла;
Возврат Значение;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -279,67 +256,6 @@
#КонецОбласти
Функция ЧастиПути(Цепочка)
ПутьКСвойству = Новый Массив();
ТипПути = ТипЗнч(Цепочка);
Если ТипПути = Тип("Строка") Тогда
Части = СтрРазделить(Цепочка, ".");
Для Каждого Часть Из Части Цикл
Если СодержитИндекс(Часть) Тогда
ИзвлечьИндекс(Часть, ПутьКСвойству);
Иначе
ПутьКСвойству.Добавить(Часть);
КонецЕсли;
КонецЦикла;
Иначе
ПутьКСвойству.Добавить(Цепочка);
КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off
Возврат ПутьКСвойству;
КонецФункции
Функция СодержитИндекс(ИмяСвойства)
Возврат СтрНайти(ИмяСвойства, "[") > 0 И СтрЗаканчиваетсяНа(ИмяСвойства, "]") ;
КонецФункции
Процедура ИзвлечьИндекс(ИмяСвойства, БлокиПути)
ПозицияИндекса = СтрНайти(ИмяСвойства, "[");
Если ПозицияИндекса > 1 Тогда
БлокиПути.Добавить(Лев(ИмяСвойства, ПозицияИндекса - 1));
КонецЕсли;
Пока ПозицияИндекса > 0 Цикл
ЗакрывающаяПозиция = СтрНайти(ИмяСвойства, "]", , ПозицияИндекса);
ИндексСтрокой = Сред(ИмяСвойства, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1);
Индекс = Число(ИндексСтрокой);
БлокиПути.Добавить(Индекс);
ПозицияИндекса = СтрНайти(ИмяСвойства, "[", , ЗакрывающаяПозиция);
КонецЦикла;
КонецПроцедуры
Функция ЗначениеИмеетСвойство(Значение, Свойство)
Результат = Ложь;
@ -387,7 +303,7 @@
Функция ПроверяемоеЗначение(ПараметрыПроверки)
Если ПараметрыПроверки.ОбъектПроверки.ИмяСвойства <> Неопределено Тогда
Значение = ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства);
Значение = ЮТОбщий.ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства);
Иначе
Значение = ПараметрыПроверки.ОбъектПроверки.Значение;
КонецЕсли;

View File

@ -28,6 +28,7 @@
.ДобавитьТест("Пауза")
.ДобавитьТест("ВывестиВКонсоль")
.ДобавитьСерверныйТест("Менеджер")
.ДобавитьТест("ЗначениеСвойства")
;
КонецПроцедуры
@ -158,6 +159,21 @@
КонецПроцедуры
#КонецЕсли
Процедура ЗначениеСвойства() Экспорт
Массив = ЮТОбщий.ЗначениеВМассиве(1, 2, 3);
Структура = Новый Структура("Число, Массив", 1, Массив);
Варианты = ЮТест.Варианты("Значение, Свойство, Результат")
.Добавить(Массив, 0, 1)
.Добавить(Массив, -1, 3)
.Добавить(Массив, "[0]", 1)
.Добавить(Массив, 1, 2)
.Добавить(Структура, "Число", 1)
.Добавить(Структура, "Массив[0]", 1);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции