.. Автор: Александр Орефков
.. Автор: Александр Клабуков

.. include:: commonchm.txt

#####################################################################
Что это?
#####################################################################
..	<chminfo>
		<insert nodes="//common/maininfo/*"/>
		<alinks>_1cpp_TurboBL_</alinks>
	</chminfo>

.. contents:: Содержание
	:backlinks: none

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

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

Что происходит внутри 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С. 

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

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

	конт=0;
	ОткрытьФорму("Справочник.Товары",конт);
	конт.Печать();
	//где Печать() - процедура в модуле	ФормыСписка справочника.
	
	или например:
	// в модуле проведения дока
	Процедура ЭтоДокСТоваром()
	    возврат 1;
	КонецПроцедуры;
	Процедура ОбработкаПроведения(парам)
	    глНекаяГлобФункция(Контекст);
	    ....
		
	// В ГМ:
	Процедура глНекаяГлобФункция(Конт)
	    Если Конт.ЭтоДокСТоваром()=1
	    .......
