Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Вынес метод ЗначениеСвойства в публичный api
  • Loading branch information
alkoleft committed Dec 9, 2023
1 parent ed86031 commit e8ea526
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 85 deletions.
98 changes: 98 additions & 0 deletions exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,43 @@
//
//©///////////////////////////////////////////////////////////////////////////©//

#Область ПрограммныйИнтерфейс

// Возвращает значение свойства объекта.
// Возможно получение "глубоко" вложенных свойство и элементов коллекции по индексу
//
// Параметры:
// Объект - Произвольный
// ИмяСвойства - Строка - Путь к свойству. Примеры: "ИмяСвойства.ИмяВложенногоСвойства", "[2].ИмяСвойства", "ИмяСвойства[2].ИмяВложенногоСвойства"
// - Число - Индекс элемента. Возможен выбор элемента с конца, для этого нужно указывать отрицательный номер элемента с конца,
// например: '-1' - последний элемент, '-2' - предпоследний
// Возвращаемое значение:
// Произвольный
Функция ЗначениеСвойства(Объект, ИмяСвойства) Экспорт

Путь = ЧастиПути(ИмяСвойства);

Значение = Объект;
Для Каждого Часть Из Путь Цикл

Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
Значение = Значение.Получить();
КонецЕсли;

Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда
Часть = Значение.Количество() + Часть;
КонецЕсли;

Значение = Значение[Часть];

КонецЦикла;

Возврат Значение;

КонецФункции

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

#Область Строки
Expand Down Expand Up @@ -1019,4 +1056,65 @@

КонецФункции

Функция ЧастиПути(Цепочка)

ПутьКСвойству = Новый Массив();

ТипПути = ТипЗнч(Цепочка);

Если ТипПути = Тип("Строка") Тогда

Части = СтрРазделить(Цепочка, ".");

Для Каждого Часть Из Части Цикл

Если СодержитИндекс(Часть) Тогда

ИзвлечьИндекс(Часть, ПутьКСвойству);

Иначе

ПутьКСвойству.Добавить(Часть);

КонецЕсли;

КонецЦикла;

Иначе

ПутьКСвойству.Добавить(Цепочка);

КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off

Возврат ПутьКСвойству;

КонецФункции

Функция СодержитИндекс(ИмяСвойства)

Возврат СтрНайти(ИмяСвойства, "[") > 0 И СтрЗаканчиваетсяНа(ИмяСвойства, "]") ;

КонецФункции

Процедура ИзвлечьИндекс(ИмяСвойства, БлокиПути)

ПозицияИндекса = СтрНайти(ИмяСвойства, "[");

Если ПозицияИндекса > 1 Тогда
БлокиПути.Добавить(Лев(ИмяСвойства, ПозицияИндекса - 1));
КонецЕсли;

Пока ПозицияИндекса > 0 Цикл

ЗакрывающаяПозиция = СтрНайти(ИмяСвойства, "]", , ПозицияИндекса);
ИндексСтрокой = Сред(ИмяСвойства, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1);
Индекс = Число(ИндексСтрокой);
БлокиПути.Добавить(Индекс);

ПозицияИндекса = СтрНайти(ИмяСвойства, "[", , ЗакрывающаяПозиция);

КонецЦикла;

КонецПроцедуры

#КонецОбласти
Original file line number Diff line number Diff line change
Expand Up @@ -148,29 +148,6 @@

КонецФункции

Функция ЗначениеСвойства(Объект, ИмяСвойства) Экспорт

Путь = ЧастиПути(ИмяСвойства);

Значение = Объект;
Для Каждого Часть Из Путь Цикл

Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
Значение = Значение.Получить();
КонецЕсли;

Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда
Часть = Значение.Количество() + Часть;
КонецЕсли;

Значение = Значение[Часть];

КонецЦикла;

Возврат Значение;

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции
Expand Down Expand Up @@ -279,67 +256,6 @@

#КонецОбласти

Функция ЧастиПути(Цепочка)

ПутьКСвойству = Новый Массив();

ТипПути = ТипЗнч(Цепочка);

Если ТипПути = Тип("Строка") Тогда

Части = СтрРазделить(Цепочка, ".");

Для Каждого Часть Из Части Цикл

Если СодержитИндекс(Часть) Тогда

ИзвлечьИндекс(Часть, ПутьКСвойству);

Иначе

ПутьКСвойству.Добавить(Часть);

КонецЕсли;

КонецЦикла;

Иначе

ПутьКСвойству.Добавить(Цепочка);

КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off

Возврат ПутьКСвойству;

КонецФункции

Функция СодержитИндекс(ИмяСвойства)

Возврат СтрНайти(ИмяСвойства, "[") > 0 И СтрЗаканчиваетсяНа(ИмяСвойства, "]") ;

КонецФункции

Процедура ИзвлечьИндекс(ИмяСвойства, БлокиПути)

ПозицияИндекса = СтрНайти(ИмяСвойства, "[");

Если ПозицияИндекса > 1 Тогда
БлокиПути.Добавить(Лев(ИмяСвойства, ПозицияИндекса - 1));
КонецЕсли;

Пока ПозицияИндекса > 0 Цикл

ЗакрывающаяПозиция = СтрНайти(ИмяСвойства, "]", , ПозицияИндекса);
ИндексСтрокой = Сред(ИмяСвойства, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1);
Индекс = Число(ИндексСтрокой);
БлокиПути.Добавить(Индекс);

ПозицияИндекса = СтрНайти(ИмяСвойства, "[", , ЗакрывающаяПозиция);

КонецЦикла;

КонецПроцедуры

Функция ЗначениеИмеетСвойство(Значение, Свойство)

Результат = Ложь;
Expand Down Expand Up @@ -387,7 +303,7 @@
Функция ПроверяемоеЗначение(ПараметрыПроверки)

Если ПараметрыПроверки.ОбъектПроверки.ИмяСвойства <> Неопределено Тогда
Значение = ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства);
Значение = ЮТОбщий.ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства);
Иначе
Значение = ПараметрыПроверки.ОбъектПроверки.Значение;
КонецЕсли;
Expand Down
16 changes: 16 additions & 0 deletions tests/src/CommonModules/ОМ_Общий/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
.ДобавитьТест("Пауза")
.ДобавитьТест("ВывестиВКонсоль")
.ДобавитьСерверныйТест("Менеджер")
.ДобавитьТест("ЗначениеСвойства")
;

КонецПроцедуры
Expand Down Expand Up @@ -158,6 +159,21 @@
КонецПроцедуры
#КонецЕсли

Процедура ЗначениеСвойства() Экспорт

Массив = ЮТОбщий.ЗначениеВМассиве(1, 2, 3);
Структура = Новый Структура("Число, Массив", 1, Массив);

Варианты = ЮТест.Варианты("Значение, Свойство, Результат")
.Добавить(Массив, 0, 1)
.Добавить(Массив, -1, 3)
.Добавить(Массив, "[0]", 1)
.Добавить(Массив, 1, 2)
.Добавить(Структура, "Число", 1)
.Добавить(Структура, "Массив[0]", 1);

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции
Expand Down

0 comments on commit e8ea526

Please sign in to comment.