В процессе разработки и оптимизации кода на платформе 1С:Предприятие часто приходится прибегать к инструменту Замер производительности. Однако иногда результаты его работы вызывают недоумение: мы видим, что первая строка общего модуля вызывается десятки раз, хотя в логике программы такое количество вызовов попросту отсутствует. Давайте разберемся, почему так происходит и как правильно интерпретировать данные замера.
Основная причина возникновения подобных «фантомных» вызовов кроется в том, как платформа 1С работает с кодом. 1С является средой, сочетающей в себе черты интерпретатора и компилятора. Когда вы вызываете общий модуль, происходит процесс его инициализации.
В момент первого обращения к методам модуля выполняется весь глобальный код, расположенный вне процедур и функций. Если в самом начале модуля присутствуют комментарии или пустые строки, Замер производительности может некорректно «привязывать» время выполнения всей операции инициализации к первой доступной строке. Таким образом, количество вызовов в отчете может отражать не фактическое исполнение кода метода, а системное событие обращения к объекту метаданных.
Отдельного внимания заслуживает функция Вычислить(). Она является мощным, но «непрозрачным» инструментом для отладчика и замера. Когда мы используем конструкцию типа:
Модуль = Вычислить(Имя);
Модуль.Метод();
Система вынуждена интерпретировать строку кода динамически. В этот момент происходит обращение к таблице имен и инициализация объекта. Замер производительности при обработке таких динамических вызовов часто не способен точно сопоставить машинный код с исходным текстом. В итоге мы видим в отчете первую строку модуля или строку вызова как «заглушку», в которую суммируются затраты ресурсов на системные операции по поиску и связыванию модуля.
Если вы столкнулись с подобной ситуацией, не спешите паниковать и искать несуществующие циклы в коде. Давайте пройдем по шагам, чтобы подтвердить теорию о системном характере проблемы:
srvinfo на сервере и папок кэша на клиенте. Не забудьте проверить путь AppData\Local\1C\1cv8, так как именно там хранятся скомпилированные образы конфигурации для текущего пользователя.ЗаписьЖурналаРегистрации(). Добавьте его в начало подозрительного модуля:
ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Информация,,, "Вызов модуля");
Вычислить() для получения доступа к методам модулей, то «завышенные» показатели в замере — это плата за гибкость архитектуры.Важно помнить, что Замер производительности — это инструмент для поиска «узких мест», а не абсолютный лог выполнения инструкций процессором. Если точка останова в подозрительной строке не срабатывает, это прямое свидетельство того, что либо исполняется скомпилированный кэшированный образ, либо произошла рассинхронизация между тем, что вы видите в конфигураторе, и тем, что реально исполняется на сервере.
В завершение, проанализируем ситуацию: если замер показывает 28 вызовов, а в коде их быть не должно, воспринимайте это как 28 событий обращения к метаданным или внутренней таблице имен. Сконцентрируйтесь на общем времени выполнения модуля, а не на количестве «виртуальных» проходов по первой строке. Это поможет вам эффективно оптимизировать производительность системы, не отвлекаясь на особенности механизмов отладки платформы.