Последние сообщения

#1
7.7 / Re: Как определить наличие в к...
Последний ответ от Arbuz - Вчера в 17:59
Вот, на тебе, специально с 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);
    КонецЕсли;

#2
7.7 / Re: Как определить наличие в к...
Последний ответ от Злоп - 07 февраля 2025, 21:08
Чтобы не ругалось на синтаксис - там какой-то хитрый кунштюк с подавлением вывода в окно сообщений вроде?
#3
7.7 / Re: Как определить наличие в к...
Последний ответ от Arbuz - 07 февраля 2025, 16:40
Цитата: Пиит от 06 февраля 2025, 11:15Интересный факт, Информатор умеет работать не только с Объектами, но и с Контекстом.

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

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

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

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

Чтобы "не ругалось на синтаксис" — чуть модифицировав туда можно добавить и выполнение в нужном контексте, но надо будет и параметры добавлять, например через сз.
#4
7.7 / Re: Как определить наличие в к...
Последний ответ от Пиит - 06 февраля 2025, 13:51
Цитата: Пиит от 06 февраля 2025, 11:15Интересный факт, Информатор умеет работать не только с Объектами, но и с Контекстом...

Сори, за баян, друзья.
#5
7.7 / Re: Как определить наличие в к...
Последний ответ от Пиит - 06 февраля 2025, 11:15
Интересный факт, Информатор умеет работать не только с Объектами, но и с Контекстом.

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

Так можно проверить наличие метода в текущем контексте, но не в конфигурации.
#6
7.7 / Re: Как определить наличие в к...
Последний ответ от Злоп - 06 февраля 2025, 09:22
Тогда надо делать обработку-контейнер с функциями/процедурами и макетами. Типа БСП.
#7
7.7 / Re: Как определить наличие в к...
Последний ответ от Харлампий Дымба - 05 февраля 2025, 23:42
Так никогда нельзя быть уверенным, что глПечатьТЗ конкретно в этой конфе делает именно то, что тебе нужно. Может она рисует "главную печать" фирмы на переданном в функцию "техзадании" и делает e-mail рассылку готового ТЗ по всем подрядчикам.
Так что - всё своё приходится носить с собой, раз уж обработка универсальная...
#8
7.7 / Re: Как определить наличие в к...
Последний ответ от Злоп - 05 февраля 2025, 19:50
И ну его нафиг эти клюшки.
И снеговик туда же.
#9
7.7 / Re: Как определить наличие в к...
Последний ответ от Злоп - 05 февраля 2025, 19:49
А вообще может это все хрень, что я извращаюсь
#10
7.7 / Re: Как определить наличие в к...
Последний ответ от Злоп - 05 февраля 2025, 19:49
Ну, например, пишу универсальную обработку, на форме - ТЗ.
На ней кнопка "Печать". Да, можно вкорябать по быстрому простенькую печать ТЗ.
Но, обычно, во многих конфигах есть функция/процедура типа глПечатьТЗ, поэтому
хочется типа
Если ЕстьПроцедура(ИмяПроцедурыФункции)=1 Тогда
  ВыполнитьПроцедуру(ИмяПроцедуры);
.
чтобы не ругалось на синтаксис если где-то впрямую пишем имя процедуры/функции, которой сожет и не быть в ГМ - можно, наверное, через Шаблон как-то проверять.
.