Компонента:	TurboBL
Версия:		1.1.0.5
Автор:		Александр Орефков (telepat@inbox.ru)
Назначение:	Ускорение вызова методов и обращения к свойствам объектов 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.

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

КАК ИСПОЛЬЗОВАТЬ
	ЗагрузитьВнешнююКомпоненту("turbobl.dll");
	Вот и все.
	Более никаких изменений в существующем коде конфигурации не требуется.
	При загрузке компонента берет на себя всю работу по поиску номеров
	методов и свойств объектов 1С.
	Компонента использует "хитрый" способ загрузки, позволяющий ей загружаться
	без регистрации в реестре, те ВСЕГДА и для любого пользователя.

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

	ОБЪЕКТ "УскорительГК"
		Объект "УскорительГК" был предназначен для возможности обращения
		через контекст к методам и переменным ВНЕШНИХ ОТЧЕТОВ.
		Теперь это делается автоматически, и его метод "Ускорить" ничего не делает.
		Теперь этот объект можно использовать для проверки того, что TurboBL загружена:
		
		Попытка
			СоздатьОбъект("УскорительГК");
			Загружена=1;
		Исключение
			Загружена=0;
		КонецПопытки;
		
		Объект "Addin.TurboBL" теперь несуществует, и его создание нельзя использовать
		для проверки загруженности компоненты.

ПРИМЕРЫ.
	В поставку входит небольшая демобаза, для демонстрации работы компоненты.
	Скопируйте turbobl.dll в bin 1С, и откройте базу.
	Понажимайте на кнопочки, запускающие разные тесты.
	В колонке "До" будет отображатся время выполнения (мсек) каждого теста.
	Нажмите кнопку "Загрузить TurboBL".
	Снова позапускайте тесты.
	В колонке "После" отобразится новое время выполнения каждого теста.
	Почуствуйте разницу!

СОВМЕСТИМОСТЬ С 1С++
	Функционал компоненты включен в состав 1С++, поэтому применять их совместно нет смысла.

БЛАГОДАРНОСТИ
	Выражаю глубокую признательность Дмитрию Гусеву aka Deb,
	за плодотворное сотрудничество и помощь в тестировании компоненты.
	Алексею Федорову aka АЛьФ, за сотрудничество и подсказки по правильной работе таблиц.
	
PS
Данная разработка не придерживается технологии Внешних Компонент.
"1С-Совместимо" нет и не будет.
Используйте на свой страх и риск.

ИСТОРИЯ ВЕРСИЙ
Версия 1.1.0.1
	- Радикально упрощено использование компоненты.
	- Добавлена возможность вызова методов модулей через контекст.
	- Добавлена проверка установленных компонент при загрузке.
	- Исправлены мелкие баги.

Версия 1.1.0.2
	- Исправлена ошибка потери возвращаемого значения из функции, вызываемой через Контекст.
	- Исправлена ошибка, приводящая в определенных ситуациях к вылету 1С.

Версия 1.1.0.3
	- Изменен способ загрузки ВК, что уменьшило ее размер и позволило ей загружаться всегда.
	- Добавлено автоматическое ускорение контекстов внешних отчетов.
	- Исправлено обращение к шаблонам таблиц в форме при вызове функций модуля через контекст.
	- Исправлены мелкие баги.

Версия 1.1.0.4
	- Исправлена ошибка при выполнении запросов.

Версия 1.1.0.5
	- Компонента доработана для работы на многопроцессорных системах и процессорах с HT.
	- Компонента доработана для работы со включенным DEP.
	- Оптимизировано обращение к полям ТаблицыЗначений.
