OneS icon indicating copy to clipboard operation
OneS copied to clipboard

Универсальные методы проверки наличия свойства \ метода

Open SeiOkami opened this issue 4 years ago • 6 comments

Расширить возможности рефлексии в 1С.

Добавить платформенные методы  "СвойствоОбъекта()" и "МетодОбъекта()", благодаря которым можно без Попытки проверить, есть ли у переменной нужное свойство или метод. Если есть метод, то какой число входящих параметров и значения по умолчанию.

Для свойства есть разные костыльные способы. Для получения метода только Попытка. И получить описания параметров нельзя.

Пример реализации:

//Проверять существование метода\свойства можно у любого значения. 
//У тех типов, которые явно не имеют методов\свойств не должно быть вызова исключения
//Таким образом, мы можем проверять наличие метода\свойства у любой переменной, совершенно не заботясь о её типе.

Если СуществуетМетод(МойОбъект, "Сформировать") Тогда
  МойОбъект.Сформировать();
КонецЕсли;

//Ещё лучше так:
ОписаниеМетода = ОписаниеМетода(МойОбъект, "Сформировать");
Если ОписаниеМетода <> Непределено Тогда
   ОписаниеМетода.Выполнить();
КонецЕсли;

//А так можно проверить наличие свойства объекта. 
//ВладелецСвойства - переменная, теоретически содержащая внешний отчет. 
ЗначениеСвойства = Неопределено;
Если СвойствоОбъекта(ВладелецСвойства, "ИспользуемоеИмяФайла", ЗначениеСвойства) Тогда
  Сообщить(ЗначениеСвойства);
КонецЕсли;

МояПеременная= "Текст";
//Так можно реализовать поведение методов, чтобы они были универсальными
Сообщить(СвойствоОбъекта(МояПеременная, "ИмяСвойства")) //Ложь
Сообщить(СуществуетМетод(МояПеременная, "ИмяМетода")) //Ложь
Сообщить(ОписаниеМетода(МояПеременная, "ИмяМетода")) //Неопределено

SeiOkami avatar Apr 06 '21 09:04 SeiOkami

Для свойства есть разные костыльные способы.

Получение типа значения, поиск соответствия в Метаданные и перебор вложенных коллекций (реквизиты, измерения, ресурсы и т.п.) - это не костыль, а канон! ))

Но в целом, согласен, что с такими методами было бы проще. Только я бы не делал их методами глобального контекста, а поместил бы в класс Тип. Как-то так:

ТипПеременной = ТипЗнч(ВходящаяПеременная); Если ТипПеременной.СуществуетМетод("Сформировать") Тогда . . . . ВходящаяПеременная.Сформировать(); КонецЕсли;

DementorAK avatar Apr 06 '21 11:04 DementorAK

Получение типа значения, поиск соответствия в Метаданные и перебор вложенных коллекций (реквизиты, измерения, ресурсы и т.п.) - это не костыль, а канон! ))

Костыльный канон) Ведь мне приходится перебирать несколько возможных коллекций. Реквизиты, СтандартныеРеквизиты, ТабличныеЧасти, Измерения, Ресурсы... И это только в тех, которые относятся к метанаданным. А если это, например, элемент формы? В БСП есть универсальный метод. И он явно костыль =)

Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт
	
	КлючУникальности   = Новый УникальныйИдентификатор;
	СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
	ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
	
	Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
	
КонецФункции

SeiOkami avatar Apr 06 '21 16:04 SeiOkami

Отправлено боту 1С 06.04.2021 в 12:36

SeiOkami avatar Nov 10 '21 11:11 SeiOkami

Вот пример, когда подход БСП упадёт

image image

SeiOkami avatar Mar 13 '23 17:03 SeiOkami

@SeiOkami предлагаю разбить ишью на 2 разных, т.к. смешиваются 2 разных задачи Задачу по свойству 1С сделать не так сложно, а вот по методам могут быть и проблемы, и нежелание, и проектные решения

отправил сегодня, 21.07.2023, в 1С пожелания про ЗначениеСвойства

artbear avatar Jul 21 '23 09:07 artbear

отправил сегодня, 21.07.2023, в 1С пожелания Еще бы кто-то эти пожелания не просто читал, а ставил в бэклог.

DementorAK avatar Aug 01 '23 08:08 DementorAK