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

Автор Злоп, 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);
    КонецЕсли;


Злоп