Что это?

Что это?

Назначение: Ускорение вызова методов и обращения к свойствам объектов 1С-Предприятия 7.7 Обращение к методам и переменным модулей через Контекст

  • КРАТКИЙ ЭКСКУРС В МЕХАНИЗМ ВЫЗОВА МЕТОДОВ.
  • ВЫЗОВ МЕТОДОВ МОДУЛЕЙ ГРУППОВЫХ КОНТЕКСТОВ


КРАТКИЙ ЭКСКУРС В МЕХАНИЗМ ВЫЗОВА МЕТОДОВ.

1C++ :: Что это? | Ранее: Что это? | Далее: ВЫЗОВ МЕТОДОВ МОДУЛЕЙ ГРУППОВЫХ КОНТЕКСТОВ
КРАТКИЙ ЭКСКУРС В МЕХАНИЗМ ВЫЗОВА МЕТОДОВ.

ДЛЯ ВСЕХ

Что происходит внутри 1С, когда мы пишем спр.ТекущийЭлемент()? 1С преобразует имя метода ТекущийЭлемент в соответствующий ему номер, и вызывает метод объекта по номеру. НО, клинические исследования показали, что для ЛЮБОГО объекта 1С используется один алгоритм такого преобразования, реализованный "В ЛОБ", и котрый заключатся в простом последовательном переборе всех имен методов объекта и сравнении их с искомым. Соответственно, чем больше номер метода, тем большее время занимает такой поиск. Например, для того же "ТекущийЭлемент" перед реальным вызовом функции происходит перебор 88 названий методов. Аналогично и для свойств объектов.

ДЛЯ ЗНАКОМЫХ С "RAINBOW"

Как известно, для поиска номера метода применяется virtual int CBLContext::FindMethod(const char* name); Как оказалось, НИ В ОДНОМ из объектов 1С данный метод не переопределен. Перехват вызова функций различных объектов показал лень и мягко говоря, не вполне компетентность людей, писавших этот код. Вобщем, когда вызывается FindMethod, из него вызываются: GetNMethods(), GetMethodName(i,0), GetMethodName(i,1) т.е. FindMethod работает примерно так:

for(int i=0;i<GetNMethods();i++)
{
    if(!stricmp(name,GetMethodName(i,0))
        return i;
    if(!stricmp(name,GetMethodName(i,1))
        return i;
}
return -1;

Понятно, хотелось добиться универсальности и простоты, что и достигнуто. Но при этом: Некомпетентность: GetNMethods можно вынести из цикла. Лень: не зря же FindMethod виртуальная, почему же она не переопределена ни в одном из наследуемых классов для более оптимального поиска? Аналогичная ситуация и с FindProp.

ЦЕЛЬ КОМПОНЕНТЫ

Дабы устранить эту досадную оплошность при поиске методов и свойств, мною и была создана данная ВК. Суть ее работы в следующем: оптимизация алгоритма преобразования имен методов/свойств в их номера. Попутно сделана возможность обращаться к методам и переменным модулей ГрупповыхКонтекстов.

КАК ИСПОЛЬЗОВАТЬ

ЗагрузитьВнешнююКомпоненту("1cpp.dll");

Вот практически и все. Более никаких изменений в существующем коде конфигурации не требуется. При загрузке компонента берет на себя всю работу по поиску номеров методов и свойств объектов 1С.


ВЫЗОВ МЕТОДОВ МОДУЛЕЙ ГРУППОВЫХ КОНТЕКСТОВ

1C++ :: Что это? | Ранее: КРАТКИЙ ЭКСКУРС В МЕХАНИЗМ ВЫЗОВА МЕТОДОВ. | Далее:
ВЫЗОВ МЕТОДОВ МОДУЛЕЙ ГРУППОВЫХ КОНТЕКСТОВ

Да!!! Свершилось!!! Теперь можно через контекст обратится к методам и переменным модуля контекста. Например:

конт=0;
ОткрытьФорму("Справочник.Товары",конт);
конт.Печать();
//где Печать() - процедура в модуле     ФормыСписка справочника.

или например:
// в модуле проведения дока
Процедура ЭтоДокСТоваром()
    возврат 1;
КонецПроцедуры;
Процедура ОбработкаПроведения(парам)
    глНекаяГлобФункция(Контекст);
    ....

// В ГМ:
Процедура глНекаяГлобФункция(Конт)
    Если Конт.ЭтоДокСТоваром()=1
    .......