Текущая версия 1.1.0.2 Скачать |
Что это | История версий |
ВК TurboBL Автор: Александр Орефков Назначение: КРАТКИЙ ЭКСКУРС В МЕХАНИЗМ ВЫЗОВА МЕТОДОВ.Что происходит внутри 1С, когда мы пишем спр.ТекущийЭлемент()? 1С преобразует имя метода ТекущийЭлемент в соответствующий ему номер, и вызывает метод объекта по номеру. НО, клинические исследования показали, что для ЛЮБОГО объекта 1С используется один алгоритм такого преобразования, реализованный "В ЛОБ", и котрый заключатся в простом последовательном переборе всех имен методов объекта и сравнении их с искомым. Соответственно, чем больше номер метода, тем большее время занимает такой поиск. Например, для того же "ТекущийЭлемент" перед реальным вызовом функции происходит перебор 88 названий методов. Аналогично и для свойств объектов. Как известно, для поиска номера метода применяется 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 ....... СОВМЕСТИМОСТЬ С 1С++ v1.5.0.3Для автоускорения ГрупповыхКонтекстов и возможности обращения к методам модуля, TurboBL перехватывает ту же функцию 1С, что и 1С++ v1.5.0.3 для работы препроцессора в модулях конфигурации.Поэтому, та компонента, которая будет загружена позже, та и будет делать свое дело. Если сначала загрузить TurboBL, затем 1С++, не будет работать вызов методов модуля через контекст, если наоборот, не будет работать препроцессор в модулях конфигурации. Функционал TurboBL включен в 1С++ версии 1.6.0.0 |
|