Для ИС работает отлично вот такой код:
...
/* получаем для пути ассоциативный массив с id группы и id/url элемента для данной инфосистемы */
$GLOBALS['INFSYS_result'] = $InformationSystem->GetInformationFromPath($InformationSystem_id,
'', $break_if_path_not_found);
/* Если путь существует */
if ($GLOBALS['INFSYS_result']) {
// начало кода для переопределения шаблона
$data_template_id = 0;
// id доп.свойства группы, хранящего идентификатор шаблона
$data_template_property_id = 12345; // - впишите свой id
// если у вас все сделано по-уму (для указания id доп.свойства группы добавлен параметр ТДС,
// с названием data_template_property_id, то закомментируйте предыдущую строчку,
// и раскомментируйте следующую
//$data_template_property_id = to_int($GLOBALS['LA']['data_template_property_id']);
if ($data_template_property_id) {
$group_id = $GLOBALS['INFSYS_result']['group'];
while (!$data_template_id) {
$row = $InformationSystem->GetPropertysGroup($group_id, $InformationSystem_id);
if (sizeof($row))
foreach ($row as $key => $property_row)
if ($property_row['information_propertys_groups_id'] == $data_template_property_id) {
$data_template_id = $property_row['information_propertys_groups_value_value'];
break;
}
if ($data_template_id)
break;
else {
$row2 = $InformationSystem->GetInformationGroup($group_id);
if ($row2)
$group_id = $row2['information_groups_parent_id'];
else
break;
}
}
if ($data_template_id)
$kernel->set_current_page_data_template($data_template_id);
}
// конец кода для переопределения шаблона
/* получаем массив с деревом от текущей группы до корня */
$InformationSystem->GetInformationGroupsForXml($GLOBALS['INFSYS_result']['group'],
$InformationSystem_id);
$group_path = '';
$mas_information_groups_for_xml = $InformationSystem->
get_mas_information_groups_for_xml();
/* получаем данные о группе */
$group_result = $InformationSystem->SelectInformationGroups($GLOBALS['INFSYS_result']['group'],
$InformationSystem_id);
...
Для групп создается доп.свойство, хранящее id шаблона. При нахождении в какой-либо группе ИС, код пытается получить значение этого доп.свойства для текущей группы. Если оно не задано - то у группы-родителя, если и у нее не задано, то у группы-родителя родителя... и так далее, до самого корня ИС, или пока не не встретится группа, у которой это свойство задано. Если такая группа нашлась, то устанавливается ее шаблон, если до самого корня ни для одной из групп шаблон не задан, то используется тот, который указан в настройках текущего узла структуры (то есть как обычно).
Не смотря на то, что этот пример - для ИС, его очень легко переписать для магазина, фактически только заменить имена методов и некоторые их параметры.