Изменения
Контекст выполнения head
При использовании команды head в кеше, содержимое этой команды сохраняется отдельно и исполняется в момент подгрузки кеша.
Допустим, есть части A и B. Часть A вызывает часть B. Часть A использует кеширование, а часть B вызывает команду [head] с таким содержимым: [glob.x=1][cpart.name].
В текущем варианте системы произойдёт вот что - вся эта команда выполнится при запуске части A (т.к. кеширующий механизм заложен в ней).
Присвоение [glob.x=1] сработает верно, а вот [cpart.name] выведет информацию о части A, вместо части B (что предполагалось, т.к. команда расположена в части B).
Можно не запускать содержимое head при старте шаблона, а компилировать его заранее, оставляя в нём только куски [#header] команд (которым в любом случае нужен запуск и которые нельзя кешировать). В этом случае [cpart.name] отработает нормально (т.к. оно просто закешируется в момент первого рендера), но не будет работать [glob.x=1] (что чревато такими вещами, как множественное присоединение какой-нибудь JQuery, т..к. глобальная переменная [use_jquery] может быть попросту не определена из-за кеша).
Как вариант, можно записывать в секцию [head] части B константы, вместо переменных окружения.
Например так: ['[head][glob.x=1]'++cpart.name++'[/head]'.shell]
В этом случае отработают обе команды.
Единственное, что не будет работать в кеше в [head] это переменные текущей части (или глобальные переменные), т.к. их дамп не присутствует в контексте. Но при желании, можно его туда погрузить, если использование переменных в процессе исполнения этой секции зафиксировано (можно помещать только используемые переменные).
Также стоит помнить, что секция compile сохраняется для кеша в компилированном виде и не исполняется.