Как определить наличие в конфигурации процедуры/функции..?

Автор Злоп, 30 января 2025, 14:51

« назад - далее »

Пиит

Интересный факт, Информатор умеет работать не только с Объектами, но и с Контекстом.

ТЗ = Информатор.ПолучитьТаблицуМетодов(Контекст)

Так можно проверить наличие метода в текущем контексте, но не в конфигурации.

Пиит

Цитата: Пиит от 06 февраля 2025, 11:15Интересный факт, Информатор умеет работать не только с Объектами, но и с Контекстом...

Сори, за баян, друзья.

Arbuz

Цитата: Пиит от 06 февраля 2025, 11:15Интересный факт, Информатор умеет работать не только с Объектами, но и с Контекстом.

ТЗ = Информатор.ПолучитьТаблицуМетодов(Контекст)

Так можно проверить наличие метода в текущем контексте, но не в конфигурации.

Экспортные методы глобального модуля туда не попадут.

А так, я же в #6 уже сделал по наводке АЛьФ'а через проверку компиляции выполняемого модуля.

Чтобы "не ругалось на синтаксис" — чуть модифицировав туда можно добавить и выполнение в нужном контексте, но надо будет и параметры добавлять, например через сз.

Злоп

Чтобы не ругалось на синтаксис - там какой-то хитрый кунштюк с подавлением вывода в окно сообщений вроде?

Arbuz

Вот, на тебе, специально с goto:
//====================================================================== // пМетод - Строка типа "глФРМ", "глФРМ()", "глФРМ(П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);     КонецЕсли;


Злоп