Поиск циклических ссылок в 1С:Предприятие 8.3.10
Рубрика: Программирование -> 1С:Предприятие
Метки: 1С:Предприятие | полезности | программирование
Просмотров: 7116
Грядущий релиз платформы «1С:Предприятие» 8.3.10 должен включить множество интересных новинок, и одной из интересных для разработчика наверняка станет встроенный инструмент поиска циклических ссылок. Наличие в коде циклических ссылок - серьезный удар по потребляемым ресурсам. С виду невинный код, может запросто сожрать гигабайты оперативной памяти и проблему будет не так просто обнаружить.
Время жизни объектов в платформе «1С:Предприятие 8» определяется стратегией на основе подсчета ссылок (reference counting). Идея проверена временем и предельна проста. Для каждого объекта есть некий счетчик. При создании ссылки на объект – значение счетчика увеличивается на единицу. При удалении ссылки – наоборот, уменьшается. Как только счетчик становится равен нулю, платформа выполняет удаление объекта и занимаемая им память освобождается. Все достаточно просто. Проблемы начинаются, когда объекта ссылаются друг на друга – появляется циклическая ссылка.
Результатом становится утечка памяти – память, занимаемая таким объектом, не будет освобождена. Вот простой пример плохого кода:
ЦиклическаяСсылка = Новый Структура(); ЦиклическаяСсылка.Вставить("Параметр", 1); ЦиклическаяСсылка.Встаивть("Параметр2", ЦиклическаяСсылка);
Чем больше циклических ссылок и чем «жирней» объекты, тем больше ресурсов будет находиться в «заморозке».
Безусловно, опытные разработчики редко допускают подобные огрехи, но в любой команде есть новички и не всегда есть ресурсы выполнить тщательное ревью их кода. Это один из примеров, когда встроенные в платформы инструменты могут предотвратить назревающую проблему. Компания 1С планирует добавить в версию 8.3.10 два инструмента для автоматизации процесс поиска циклических ссылок.
Первый инструмент позволяет полностью автоматизировать поиск циклических ссылок. Достаточно активировать новую опцию «Проверка циклических ссылок встроенного языка» и платформа возьмет на себя заботу поиска циклических ссылок. При обнаружении проблемы, платформа будет останавливать выполнение кода, и выдавать соответствующее предупреждение.
Этот режим будет полезен для разработки новых конфигураций, а вот для диагностики уже существующих решений полезно будет активировать одноименную опцию в журнале регистрации. В этом случае, платформа не будет прерывать выполнение кода, а будет записывать информацию об обнаруженных циклических ссылках в журнал регистрации под событием SCRIPTCIRCREFS.
Второй инструмент поиска циклических ссылок реализован в виде нового метода глобального контекста «ПроверитьЦиклическиеСсылкиВстроенногоЯзыка()». Он поможет обнаружить циклические ссылки в определенном участке из встроенного языка. Как следует из описание на «Зазеркалье»:
«С его помощью вы можете найти циклические ссылки, например, в нужный вам момент, или в той процедуре, которая вас интересует, или проанализировать ту переменную, которая вызывает у вас подозрение. Если вы не указываете параметры этого метода, то будут проанализированы все локальные переменные на стеке. Если вы передаёте в метод локальную переменную, то будет проанализирована только она.».