С развитием платформы «1С:Предприятие 8.3» механизм расширений конфигурации стал основным инструментом кастомизации прикладных решений. Он позволяет дорабатывать типовые конфигурации (такие как «1С:Комплексная автоматизация 2», «1С:ERP» или «1С:Бухгалтерия») без изменения основной конфигурации поставщика, что существенно упрощает последующее обновление. Однако на практике разработчики и системные администраторы часто сталкиваются с тем, что после очередного обновления системы или самих расширений производительность программы резко падает, а сервер приложений начинает испытывать пиковые нагрузки.
В данной статье мы подробно разберем, как расширения влияют на производительность на уровне СУБД и оперативной памяти сервера, почему зависают рабочие процессы rphost, и какие практические шаги необходимо предпринять для локализации и устранения подобных проблем.
Одно из самых распространенных заблуждений разработчиков заключается в том, что расширения существуют только на уровне программного кода платформы 1С и не оказывают влияния на СУБД. На самом деле это не так. Рассмотрим детально, что происходит в базе данных, когда мы заимствуем объекты или добавляем в расширение новые реквизиты:
GUID).LEFT JOIN) между основной таблицей объекта и таблицей-сателлитом из расширения.Table Scan / Index Scan). Это вызывает лавинообразный рост нагрузки на дисковую подсистему и процессор сервера СУБД, а также приводит к избыточным блокировкам данных.Практический вывод: Если вы добавили в систему новые документы и реквизиты, которых изначально не было в типовом решении, и храните их в расширении, их перенос непосредственно в основную конфигурацию действительно может повысить производительность системы. Это избавит СУБД от необходимости выполнять постоянные неявные соединения таблиц при каждом обращении к данным.
Проанализируем, как расширения влияют на время запуска программы пользователями. Платформа 1С не обращается к файлам расширений на диске при каждом вызове процедуры. Вместо этого происходит однократное слияние метаданных:
В момент старта сеанса (при открытии тонкого или толстого клиента, а также при инициализации серверного контекста для фонового задания или веб-сервиса) платформа считывает метаданные основной конфигурации и всех активных расширений, компилирует их в единую структуру в оперативной памяти сервера.
Если в вашей базе подключено множество «тяжелых» расширений или в них заимствовано избыточное количество крупных типовых объектов (например, общие модули на десятки тысяч строк кода, сложные формы документов), время инициализации сеанса («холодный старт») может существенно возрасти. Это критично в следующих сценариях:
Для оптимизации «холодного старта» рекомендуется заимствовать в расширения только те процедуры и функции, которые непосредственно изменяются. Избегайте заимствования огромных модулей целиком «на всякий случай».
Выбор аннотации при изменении процедур и функций в расширении напрямую влияет на микросекундные задержки при выполнении кода. Рассмотрим особенности работы основных аннотаций:
&Вместо (&Instead): Работает быстрее остальных методов перехвата, так как платформа полностью подменяет оригинальный метод вашим кодом. Однако, если внутри процедуры используется вызов метода ПродолжитьВызов(), системе приходится тратить ресурсы на передачу управления обратно в основную конфигурацию, что нивелирует выигрыш в скорости.&Перед (&Before) и &После (&After): Требуют от платформы динамического построения цепочек вызовов (так называемого стека перехватчиков). Если один и тот же метод перехвачен в нескольких разных расширениях, это создает дополнительную вычислительную нагрузку на процессор сервера приложений.Если расширение перехватывает методы, которые выполняются миллионы раз в циклах проведения документов, расчете себестоимости или обработке больших массивов данных, это неизбежно приведет к общему снижению производительности по сравнению с выполнением того же кода, внедренного непосредственно в основную конфигурацию.
Рассмотрим детально ситуацию, описанную в сообщении 34 форума, когда после обновления расширения сервер 1С начинает непрерывно перезапускать рабочие процессы rphost, выбрасывая пользователей из базы, а нагрузка на CPU достигает 100%.
Главной причиной здесь является динамическое обновление расширений на «живой» базе (без монопольного выгона пользователей). Этот процесс таит в себе те же опасности, что и классическое динамическое обновление основной конфигурации («демо-обновление»):
rphost, утечкам памяти и зацикливанию вызовов, из-за чего процесс нагружает процессор на 100%.rphost как аварийный, принудительно завершает его работу (что приводит к аварийному закрытию программы у всех пользователей, чьи сеансы находились на этом процессе) и создает новый процесс rphost, в который снова загружается поврежденный кэш.Ниже приведен пример кода, демонстрирующий, как можно программно проверить наличие активных расширений в системе и убедиться, что они подключены корректно:
ВыборкаРасширений = РасширенияКонфигурации.Получить();
Для Каждого Расширение Из ВыборкаРасширений Цикл
Если Расширение.Активно Тогда
ЗаписьЖурналаРегистрации("Расширения.Контроль",
УровеньЖурналаРегистрации.Информация,
,
,
"Расширение " + Расширение.Имя + " успешно подключено и активно.");
Иначе
ЗаписьЖурналаРегистрации("Расширения.Контроль",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Внимание! Расширение " + Расширение.Имя + " загружено, но не активно!");
КонецЕсли;
КонецЦикла;
Если ваша база 1С начала тормозить после обновления, выполните следующие шаги для локализации проблемы:
По умолчанию в настройках кластера серверов 1С несколько информационных баз могут обслуживаться одним общим рабочим процессом rphost. Если в одной из баз происходит сбой кэша из-за некорректного расширения, зависают все базы на этом сервере.
Перейдите в консоль администрирования кластера 1С и настройте параметры так, чтобы на каждую рабочую базу выделялся как минимум один отдельный процесс rphost. Это позволит локализовать проблему в рамках одной конкретной базы данных.
После обновления расширений обязательно производите полную очистку кэша. На сервере приложений для этого необходимо остановить службу 1C:Enterprise 8.3 Server Agent, удалить содержимое папок кэша в каталоге пользователя, под которым запускается служба (обычно это папки внутри %USERPROFILE%\AppData\Local\1C\1cv8 и %USERPROFILE%\AppData\Roaming\1C\1cv8), и запустить службу заново.
Если сервер продолжает виснуть, отключите использование всех расширений (сняв соответствующий флаг активности в меню «Администрирование» — «Параметры системы» — «Расширения» или через конфигуратор). Если производительность восстановилась, включайте расширения по одному, чтобы выявить конкретный модуль, вызывающий деградацию системы.
Зачастую тормоза после обновления конфигурации (включающей расширения) связаны с тем, что СУБД не успевает обновить статистику работы с новыми таблицами. Настройте в MS SQL Server или PostgreSQL регулярное выполнение следующих регламентных задач:
Если вы все еще используете старые релизы платформ (такие как 8.3.12, 8.3.13 или 8.3.14), учтите, что механизм расширений в них содержал множество зарегистрированных ошибок, связанных с утечками памяти в rphost и некорректной работой СУБД. Переход на актуальные стабильные релизы платформы (например, ветки 8.3.20, 8.3.22 и новее) часто позволяет полностью решить проблемы с производительностью расширений без изменения их кода.