TurboBL
130Инструментарий программиста (алгоритмы, утилиты)
Описание
Внешняя компонента для 1С: Бухгалтерия 7.7, 1С: Торговля и склад 7.7, 1С: Зарплата и кадры 7.7
Обращение к методам/переменным модуля через его Контекст.
Версия: 1.1.0.6
КРАТКИЙ ЭКСКУРС В МЕХАНИЗМ ВЫЗОВА МЕТОДОВ.
ДЛЯ ВСЕХ
Что происходит внутри 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.
- Оптимизировано обращение к полям ТаблицыЗначений.
Версия 1.1.0.6
- Исправлена работа при использовании #ЗагрузитьИзФайла.
Скачать
Наименование | Размер | Скачиваний 4479 |
Доступ |
TurboBL | 35 kb | 1067 | Все |
Версия 1.1.0.5 | 39 kb | 714 | Все |
Версия 1.1.0.6 | 39 kb | 2698 | Все |
Оценка сообщества
Плюсы (+130):
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , |
Добавить плюс Добавить минус
Комментарии (71)

Вроде нашел. По всей видимости следующий код включает ускоритель в 1С++:
<code>
Попытка
СоздатьОбъект("УскорительГК");
Загружена=1;
Исключение
Загружена=0;
КонецПопытки;
</code>

В 1С++ этот функционал по умолчанию включен, те достаточно сделать
ЗагрузитьВнешнююКомпоненту("1cpp.dll")
Но пока в 1С++ более старая версия, в которой несовсем правильно работают таблицы
при вызове методов модуля через контекст, и нет автоускорения контекстов внешних отчетов.

Да, не стоит думать, что 1С будет после этой ВК "летать".
Все-таки основное время в 1С тратится на доступ к базе данных, хотя в-среднем выигрыш по скорости будет, в районе 10-15 процентов.

да, все хорошо... но прямо как в анекдоте (вот еще вчера с глюком формекса в составе 1с++ встретился)
- Скажите, это правда что вы виграли в спортлото "Волгу"?
- Правда, но не "Волгу", а 1000 руб, и не в Спортлото, а в преферанс, и не выиграл, а проиграл...
;-)

Вот это оперативность !!!!
:)))
+10, однозначно. С нетерпением ждем новых свершений.

Оказывается, когда делаешь Запрос.Выполнить, 1С генерит исполняемые модули, видимо для вычисления внешних функций.
Но чем-то эти модули отличаются, тк при вызове одного из их методов, 1С падает.

+1.
осталось телепат скрестить с 1с++, и научить её ускорять ДБФ.
И получится НЕЧТО!

Валится при попытке выполнения кода управления таблицей в режиме ввода,
например:
Таблица.Область(, 1,, ФиксКол).ШиринаСтолбца(15);

(JohnyDeath) Всё нравится. Но... 5-6 ДЛЛ хуже, чем 1. Забыть не получится ;о)

Ты, конечно, монстЁр, но кое в чем не прав.
> Некомпетентность: GetNMethods можно вынести из цикла
Уверен на 90%, что это НЕ функция, как таковая, а on-line определение, типа:
class BBB
{ void *ptr;
...
public:
int GetNMethods(int i) { return ptr+i; }
}
Поэтому, выносить его нет смысла.
> Лень: не зря же FindMethod виртуальная, почему же она
не переопределена ни в одном из наследуемых классов для более
оптимального поиска?
Это не лень, а осмотрительность. Функции позднего связывания, конечно, могут серьюзно украсить алгоритм и придать ему супер крутизну, но только не скорость выполнения! Это чуть ли не самый ресурсоемкий и медленный механизм. В предложенном тобой случае 1С работала бы медленнее раза в полтора.

В смысле
int *GetNMethods(int i) { return ptr+i; }
конечно, а ПТР не void* а int*

(O-Planet) - типа наезд ради наезда?
> Уверен на 90%, что это НЕ функция, как таковая, а on-line определение, типа:
> class BBB
> { void *ptr;
> ...
> public:
> int GetNMethods(int i) { return ptr+i; }
> }
> Поэтому, выносить его нет смысла
Ты хоть 1CHeaders смотрел когданить, в 1С++ например?
GetNMethods имеет такое объявление
virtual int GetNMethods();
А виртуальные функции не инлайнятся.
> Это не лень, а осмотрительность.
> Функции позднего связывания, конечно, могут серьюзно украсить алгоритм
> и придать ему супер крутизну, но только не скорость выполнения!
> Это чуть ли не самый ресурсоемкий и медленный механизм.
> В предложенном тобой случае 1С работала бы медленнее раза в полтора.
Странно, я как раз это реализовал (переопределение FindMethod в конечных классах)
и заработало быстрее

(Saguna)
У меня не валится. Кинь мне пример таблицы, на которой у тебя падает

to O-Planet
>> Некомпетентность: GetNMethods можно вынести из цикла
>Уверен на 90%, что это НЕ функция, как таковая, а on-line определение, типа:
...
>Поэтому, выносить его нет смысла.
Не on-line, а очевидно inline? Не могет: она виртуальная. Интереснее другое: почему ее компилятор за цикл не вынес?
>> Лень: не зря же FindMethod виртуальная, почему же она не переопределена ни в одном из наследуемых классов для более
>>оптимального поиска?
>Это не лень, а осмотрительность. Функции позднего связывания, конечно, могут серьюзно украсить алгоритм и придать ему супер крутизну, но только не скорость выполнения!
Если так рассуждать, то тогда опять же, какого х. делать ф-цию виртуальной, если все равно не переопределять. Ведь вызов виртуала хоть на чуть-чуть, но медленнее вызова невиртуала.

Компилятор не может делать предположений о том, что GetNMethods каждый раз возвращает одно и то же значений, тк не видит ее реализации.

* При ответе на комментарий, указывайте его номер в круглых скобках, например, (1).
Покрутил . Вещь!!! Особенно при работе с ТЗ и групповым контекстом разница во времени весьма ощутимая, после загрузки ВК это раз в 5-10 быстрее.
Особенно порадовало, что можно через контекст обратится к методам и переменным модуля контекста.
Получается весьма прикольно.
У вас сказано, что "Функционал компоненты включен в состав 1С++", тогда вопрос:
Где ее включить в 1С++?