Ускорение работы, оптимизация 1С 7.7


Ускорение вызова методов и обращения к свойствам объектов 1С-Предприятия 7.7

Оптимизация 1С 7.7.zip

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

ДЛЯ ВСЕХ
Что происходит внутри 1С, когда мы пишем спр.ТекущийЭлемент()?

1С преобразует имя метода ТекущийЭлемент в соответствующий ему номер, и вызывает метод объекта по номеру. НО, исследования показали, что для ЛЮБОГО объекта 1С используется один алгоритм такого преобразования, реализованный «В ЛОБ», и который заключается в простом последовательном переборе всех имен методов объекта и сравнении их с искомым.

Соответственно, чем больше номер метода, тем большее время занимает такой поиск. Например, для того же «ТекущийЭлемент» перед реальным вызовом функции происходит
перебор 88 названий методов. Аналогично и для свойств объектов.

ДЛЯ ЗНАКОМЫХ С «RAINBOW»
Как известно, для поиска номера метода применяется virtual int CBLContext::FindMethod(const char* name);

Как оказалось, НИ В ОДНОМ из объектов 1С данный метод не переопределен. Перехват вызова функций различных объектов показал лень и мягко говоря, не вполне компетентность людей, писавших этот код.

В общем, когда вызывается FindMethod, из него вызываются: GetNMethods(), GetMethodName(i,0), GetMethodName(i,1) т.е. FindMethod работает примерно так:

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

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

Оптимизация алгоритма преобразования имен методов/свойств в их номера. Попутно сделана возможность обращаться к методам и переменным модулей ГрупповыхКонтекстов.

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

При загрузке компонента берет на себя всю работу по поиску номеров методов и свойств объектов 1С. Компонента использует «хитрый» способ загрузки, позволяющий ей загружаться
без регистрации в реестре, те ВСЕГДА и для любого пользователя.

ВЫЗОВ МЕТОДОВ МОДУЛЕЙ ГРУППОВЫХ КОНТЕКСТОВ
Теперь можно через контекст обратится к методам и переменным модуля контекста.
Например:

ОБЪЕКТ «УскорительГК»
Объект «УскорительГК» был предназначен для возможности обращения через контекст к методам и переменным ВНЕШНИХ ОТЧЕТОВ. Теперь это делается автоматически, и его метод «Ускорить» ничего не делает. Теперь этот объект можно использовать для проверки того, что TurboBL загружена:

Объект «Addin.TurboBL» теперь не существует, и его создание нельзя использовать для проверки загруженности компоненты.

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

P.S.
Данная разработка не придерживается технологии Внешних Компонент. «1С-Совместимо» нет и не будет. Используйте на свой страх и риск.

1С:Предприятие 7.7. Оптимизация.

Разгоняем 1С:Предприятие 7.7. Выжимаем последние соки.

Существует два способа, которые позволяют поднять производительность вычислительной системы:

  1. Увеличить вычислительную мощь (железо)
  2. Сократить количество выполняемых действий (программа)

С первым способом все просто. Основной прирост производительности достигается заменой существующей вычислительной системы на более современную. Достаточно мощную и сбалансированную по производительности между основными компонентами: дисковой подсистемой, памятью и процессором. Не стоит забывать о сетевом оборудовании и ОС.

По подбору оборудования есть достаточно много статей, поэтому на этом без сомнения важном способе повышения производительности задерживаться не будем, а рассмотрим поподробнее второй способ.

Начнем с простого и очевидного приема. Использование библиотек turbobl.dll, автор или 1cpp.dll. Если рассматривать типовые конфигурации фирмы 1С для 1С:Предприятия 7.7, то наиболее заметный эффект использования данных библиотек проявляется в конфигурациях «1С:Зарплата и кадры 7.7» и «1С:Комплексная конфигурация 7.7». В данном случае для использования этих библиотек не требуется значительная модификация кода конфигурации. Эффект наступает сразу после загрузки библиотек даже в типовых конфигурациях, т.к. рост производительности происходит на уровне платформы 1С:Прелприятия 7.7. В базовых версиях можно воспользоваться обработкой, которая загрузит одну из библиотек.

Например, для загрузки библиотеки можно вставить в конец глобального модуля следующий код:

Остальные приемы потребовали более значительной модификации программного кода конфигурации.

Второй прием связан с сокращением общего количества точек (разименований) при выполнении кода. Этот прием является продолжением или частной модификацией первого приема. Т.е. рост производительности достигается за счет сокращения количества операций разименования.

Например:

Заменяем на

В данном случае удалось избавиться от двух точек и, несмотря на одну лишнюю команду, получить некоторый рост производительности. Этот пример демонстрирует лишь общий принцип, а не частный случай. Сравнить результат выполнения блоков команд можно используя в отладчике замер производительности.

Третий прием связан с сокращением количества используемых в конфигурации команд СоздатьОбъект().

Далее по тексту всех модулей использование вызовов может быть следующим:

Четвертый прием связан с использованием разных объектов одного типа для чтения и для записи. Например, для работы с журналом расчетов один объект используется для расчета начального сальдо (чтение), а второй для записи результатов расчетов.

Пятый прием связан с использованием эффективных порций обрабатываемой информации. Эффективные порции могут измеряться в строках документов, количестве записей или количестве сотрудников. Эти порции чтения записи обрабатываются в транзакции. Следует отметить, что размер эффективных порций зависит от режима работы 1С:Предприятия 7.7. В монопольном режиме работы размер эффективных порций в 2-4 раза больше, чем в разделенном режиме. Это связано с обработкой блокировок, которые создают дополнительный трафик в разделенном режиме.

В этом приеме есть некоторое противоречие, потому что транзакции призваны обеспечить целостность выполняемых изменений в информационной базе. А при использовании данного приема документ проводится несколькими транзакциями. Сбой при проведении в одной из транзакций может привести к частичному проведению документа, что, конечно же, исказит картину целостности информации. К счастью таких проблем не возникало.

Для определения размера эффективных порций можно воспользоваться счетчиками диспетчера задач «Прочитано байт» и «Записано байт». При подборе эффективной порции уменьшение значения этих показателей чаще всего дает наибольший рост производительности.

Рассмотрим возможную реализацию данного приема чуть подробнее.

  1. Отключается автоматическое удаление движений документа
  2. В форме документа создается процедура, которая запускает на проведение документ блоками
  3. В модуле документа процедура проведения изменяется на работу с блоками данных
  4. В модуле документа добавляется процедура отмены проведения
  5. В глобальном модуле добавляются процедуры на события пометки на удаление и отмены проведения документов с «особой» обработкой документов без автоматического удаления движений
  6. Изменяется групповая обработка документов, которая для документов без автоматического удаления движений открывает форму с передачей параметра запускающего документ на проведение

Блоки могут формироваться в виде списка (списка значений, массива и т.д.) или в виде указателя: номер строки, позиция в выборке по справочнику и т.д.

Пример обработки блоков с передачей указателя строки документа.
Текст в модуле формы документа:

Текст в модуле документа:

Шестой прием связан с заменой использования для объектов типа СписокЗначений метода Принадлежит() на метод Найти(). Это связано с особенностями данных методов. Вот описание из метода Принадлежит():

Если на принадлежность проверяется значение типа элемент справочника, то проверка выполняется с учетом его возможного вхождения в группы справочников, которые являются значениями списка значений. Данный метод оптимизирует проверку принадлежности при массовых последовательных сравнениях, если между сравнениями сам список значений не меняется.

Седьмой прием касается передачи параметров между функциями в модуле. Довольно часто математика конфигурации развалена по функциям и процедурам. При этом одни и те же переменные передаются между функциями и процедурами по ссылкам. На передачу и прием параметров также тратится некоторое время. Эти переменные можно объявить глобальными, если обработка происходит в глобальном модуле или объявить переменными модуля, если обработка происходит в модуле формы или модуле объекта.

Восьмой прием связан с сокращением повторных обращений к базе данных в рамках, например, проведения документа. Т.к. операции чтения из базы данных являются более медленными, чем, например, из ТаблицыЗначений.

Про печать. При выводе печатных форм оптимизировать можно код и таблицу.

Девятый прием. Выражения выводимые при печати лучше рассчитывать в модуле, а не в таблице использующейся в качестве шаблона. Данная рекомендация есть на диске ИТС.

Десятый прием. Шаблон печатной формы. Чем меньше ячеек содержит результирующая таблица, тем меньше памяти потребуется для ее отображения, тем быстрее будет выполняться навигация по таблице.

Одиннадцатый прием. Для больших таблиц также применим метод определения эффективной порции. Т.е. большой отчет может быть разбит на несколько небольших отчетов. Это тоже позволит поднять производительность печати.

Двенадцатый прием. Кроме этого можно значительно сэкономить ресурсы ПК, если отправлять отчеты непосредственно на печать без вывода на экран. При этом таблицы MXL можно предварительно сохранить на жестком диске и отправлять на печать поочереди с диска, а не держать в оперативной памяти.

Не стоит забывать о регламентных операциях с базой данных: переиндексация, пересчет итогов и ссылок, упаковка. Ну, и конечно дефрагментация жесткого диска.