Приветствую, коллеги!
Прошло ровно 3 года с момента выхода моей статьи Функции "слоупока": как заставить открываться "Все функции" в 97 раз быстрее!
Предлагаю в честь третьей годовщины дружно пнуть розового покемона под зад ещё разок)
Если кто-то пропустил, то напомню в двух словах суть оригинальной статьи: на крупных конфигурациях Функции для технического специалиста открывались по 2-3 минуты. Мой анализ показал, что вся проблема была в циклическом доставании пиктограмм объектов метаданных из библиотеки картинок.
Вскрылась проблема, что платформа не кэширует картинки после первого обращения к ним, и 97% времени построения дерева метаданных конфигурации система тратила в "никуда".
Статья тогда вызвала широчайший общественный резонанс (набрав аж 245 плюсиков на инфостарте!) и вместе мы смогли переломить ситуацию: 1С пофиксила баг платформы, и начиная с версии 8.3.22 "Все функции" начали открываться практически мгновенно!
Занавес! Танцующие слоны! Индийская музыка!
Как бы не так! Увы, но приходится возвращаться к этому вопросу повторно. К сожалению, в данную обработку заложена ещё одна архитектурная бомба, не исправив которую, мы скоро вернёмся к тому же, от чего ушли...
Причины её появления очевидны и они ничем не отличаются от предыдущего косяка с картинками.
Пока конфигурации были маленькие, дерево метаданных строилось быстро и никому в голову не приходило что-то оптимизировать. Конфигурации выросли, и вылезла большая проблема.
Что произошло теперь: жил был такой раздел во всех функциях, под названием "Стандартные". В нём хранились встроенные в конфигурацию обработки. И было этих обработок очень мало. И заложили под построение этих пунктов меню кривую архитектуру. Но их было мало, поэтому проблема не ощущалась.
Но время шло, а количество стандартных обработок росло как снежный ком.
Для примера, в платформе 8.3.18 у нас было 16 стандартных обработок, а в версии 8.3.24 их уже стало 28! И очевидно, что их количество будет и дальше расти.
И вот что мы имеем на текущий день:
Это скрин замера производительности построения дерева конфигурации в Функциях технического специалиста в платформе 8.3.24.1764:
Если мы просуммируем % времени, которое занимают выделенные строки, то выходим на цифру 89,96%. Именно столько времени при открытии Всех функций тратится на отрисовку обработок из раздела "Стандартные"!
Сейчас на относительно мощном серваке это занимает порядка 12 секунд. Это конечно не 2-3 минуты, как раньше, но тем не менее определённый дискомфорт доставляет.
А учитывая, что количество этих стандартных обработок растёт как грибы после дождя, не исправив этот архитектурный косяк сейчас, мы рискуем через пару лет откатиться к прошлым 2 минутам.
Однако, давайте уже детально рассмотрим проблему и пути её очевидного решения.
Предлагаю рассмотреть её на примере одной обработки из пункта меню "Стандартные", ввиду того, что все остальные 27 пунктов имеют аналогичную архитектуру.
If AccessRight("Administration", Metadata) Then
ServersControl = Undefined;
Try
ServersControl = New("ExternalDataProcessorObject.StandardServersManagement");
Except
Try
ExternalDataProcessors.Connect("v8res://mngbase/StandardServersManagement.epf", "StandardServersManagement", false, , LanguageCode);
ServersControl = New("ExternalDataProcessorObject.StandardServersManagement");
Except
Message(ErrorDescription());
EndTry;
EndTry;
If ServersControl <> Undefined Then
SubString = Table.Rows.Add();
SubString.Name = NStr("en = 'Server management'; SYS = 'AllFunctions.ServersControl'", "en");
SubString.Form = "ExternalDataProcessor.StandardServersManagement.Form";
SubString.Picture = PictureLib.Form;
SubString.Type = "ExternalForm";
EndIf;
EndIf;
Код на английском, поэтому я немного поясню. Здесь мы пытаемся создать новый объект внешней обработки с именем StandardServersManagement. Если мы падаем в исключение, значит такая внешняя обработка ещё не подключена.
Поэтому попав в исключение, мы данную внешнюю обработку подключаем из системного ресурсного файла, находящегося по адресу "v8res://mngbase/StandardServersManagement.epf".
Если всё прошло гладко, то мы выводим соответствующий пункт меню в дерево метаданных в раздел "Стандартные".
Беда здесь заключается в том, что подключение внешней обработки из ресурсного файла - это дело не быстрое. И при открытии Всех функций мы подключаем сразу все 28 внешних обработок, тратя на это почти 90% времени.
С какой долей вероятности мы воспользуемся хотя бы 3-4 стандартными обработками за сеанс? Конечно, куда логичнее выполнять подключение конкретной, нужной нам стандартной обработки в момент её запуска. Нет никакого смысла подключать каждый раз все 28 обработок в момент открытия, подвешивая систему на 12 секунд!
Имеет смысл конечно обсудить и платформенный вопрос кэширования данных обработок. Условно говоря, если бы эти 28 обработок были встроены в конфигурацию, их бы не пришлось при каждом запуске сеанса доставать и подключать из ресурсных файлов. Что мешает разработчикам платформы проработать аналогичный способ хранения данных обработок, просто скрыв их отображение в дереве конфигурации? Согласитесь, это чертовски странно - использовать функционал ВНЕШНИХ обработок для реализации ВНУТРЕННЕГО встроенного по умолчанию в платформу функционала.
Друзья, давайте уже добьём эту проблему до конца! Оптимизировав лишь этот момент, Все функции будут открываться меньше, чем за секунду! Поэтому я вновь призываю всех, у кого есть такая возможность - донести данную информацию до разработчиков платформы.
И быть может, через пару лет, в одном из будущих релизов платформы 8.5 или 8.6 мы облегчённо вздохнём...)
Ну а я традиционно выкладываю расширение, которое открывает оптимизированные "Все функции" мгновенно, по нажатию горячих клавиш Ctrl + Shift + Q.
При самом первом запуске алгоритм проверит, какие из стандартных обработок доступны в вашей версии платформы и сохранит эту информацию в хранилище общих настроек, чтобы в дальнейшем отрисовывать в дереве только те пункты стандартных обработок, которые существуют.
Поэтому самый первый запуск будет такой же долгий, как и стандартные "Все функции". При последующих открытиях проблем не возникнет. Стандартные обработки, разумеется, будут подключаться из ресурсных файлов только в момент их открытия.
Удачи, друзья! И как всегда, призываю экономить своё время!))