//======================================================================
// пМетод - Строка типа "глФРМ", "глФРМ()", "глФРМ(П1)", "глФРМ(П1,П2)"
// пКонтекст - Контекст выполнения, если пустой, то проверяется только экспорт ГМ
// впМодуль - возвращаемый объект типа 'ВыполняемыйМодуль' в котором есть процедура/функция "__Выполнить" для пМетод
// Возвращает: 0 - нет такого метода
// 1 - есть метод и доступен Выполняемый модуль в впМодуль
// -1 - метод есть, но недостаточно аргументов.
Функция МетодСуществует(Знач пМетод, пКонтекст = "", впМодуль = 0)
_Функция = 1;
_ПозПараметров = Найти(пМетод, "(");
Если _ПозПараметров = 0 Тогда
_Параметры = "()";
пМетод = пМетод + _Параметры;
Иначе
_Параметры = Сред(пМетод, _ПозПараметров);
КонецЕсли;
~Метка:
Если ТипЗначенияСтр(впМодуль) <> "ВыполняемыйМодуль" Тогда
впМодуль = СоздатьОбъект("ВыполняемыйМодуль");
КонецЕсли;
впМодуль.УстановитьМодуль("
|" + ?(_Функция = 1, "Функция", "Процедура") + " __Выполнить" + _Параметры + "
| " + ?(_Функция = 1, "Возврат ", "") + пМетод + "
|" + ?(_Функция = 1, "КонецФункции", "КонецПроцедуры") + "
);
впМодуль.НазначитьКонтекст(пКонтекст);
Попытка
//Сообщить(впМодуль.ПолучитьТекстМодуля());
впМодуль.КомпилироватьИВыполнитьМодуль();
//Сообщить("Ошибок нет");
Возврат 1;
Исключение
//Сообщить(ОписаниеОшибки());
Если Найти(ОписаниеОшибки(), "Процедура вызывается как функция") > 0 Тогда
_Функция = 0;
Перейти ~Метка;
ИначеЕсли (0=1)
ИЛИ (Найти(ОписаниеОшибки(), "Недостаточно фактических параметров") > 0)
ИЛИ (Найти(ОписаниеОшибки(), "TODO: ДОБАВИТЬ УСЛОВИЙ") > 0) // !!! TODO: ДОБАВИТЬ УСЛОВИЙ
Тогда
Возврат -1;
Иначе
Возврат 0;
КонецЕсли;
КонецПопытки;
КонецФункции // МетодСуществует
Сообщить(МетодСуществует("__Выполнить", Контекст));
Сообщить(МетодСуществует("глФРМ"));
Сообщить(МетодСуществует("глФРМ()"));
Сообщить(МетодСуществует("глФРМ(П1)"));
Сообщить(МетодСуществует("глФРМ(П1,П2)"));
Сообщить(МетодСуществует("ПриОткрытии", КакойтоКонтекст, _вм));
_вм.__Выполнить();
Сообщить(МетодСуществует("глОтладка"));
Если МетодСуществует("глОтладка(П1,П2,П3)", Контекст, _вм) = 1 Тогда
_вм.__Выполнить("123",1,0);
КонецЕсли;
Цитата: Пиит от 06 февраля 2025, 11:15Интересный факт, Информатор умеет работать не только с Объектами, но и с Контекстом.ТЗ = Информатор.ПолучитьТаблицуМетодов(Контекст)
Так можно проверить наличие метода в текущем контексте, но не в конфигурации.
Цитата: Пиит от 06 февраля 2025, 11:15Интересный факт, Информатор умеет работать не только с Объектами, но и с Контекстом...
ТЗ = Информатор.ПолучитьТаблицуМетодов(Контекст)