Событие перед построением дерева разделов
[onBeforeCreateTreeOfGroups] Группы товаров перед созданием разделов
Событие вызывается при импорте групп товаров МойСклад (productfolder) в разделы инфоблока — перед тем, как модуль построит по ним дерево разделов. Обработчик может изменить список групп: убрать лишние, поправить названия, описание или родителя.
Имя события
В коде модуля событие называется onBeforeCreateTreeOfGroups — с маленькой on. Битрикс сравнивает имена событий без учёта регистра, поэтому подписка на OnBeforeCreateTreeOfGroups тоже сработает.
Когда вызывается:
- один раз за полный проход импорта групп — после загрузки последней страницы групп из МойСклад в HL-кеш;
- после того как модуль обработал удаление разделов для групп, которых больше нет;
- в список попадают все группы из HL-кеша, а если в настройках выбраны корневые группы — только они и их потомки.
Как модуль читает ответ
- Модуль перебирает ответы всех обработчиков, и параметры последнего
EventResult::SUCCESSцеликом заменяютallGroups. Ответы не сливаются: каждый обработчик получает исходный список. EventResult::ERRORигнорируется.- Исключение из обработчика модуль на месте вызова не перехватывает: шаг импорта групп прерывается, дерево не строится, ошибка попадает в лог агента.
- Всегда возвращайте полный массив групп, а если менять нечего — не возвращайте ничего.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
allGroups | array | Группы товаров из HL-кеша модуля, ключ — href группы в API МойСклад |
Структура allGroups
[
'https://api.moysklad.ru/api/remap/1.2/entity/productfolder/...' => [
'ID' => 15, // ID записи в HL-кеше групп (не ID раздела инфоблока)
'HREF' => 'https://api.moysklad.ru/api/remap/1.2/entity/productfolder/...',
'XML_ID' => 'folderCode', // идентификатор группы, пишется в XML_ID раздела
'PATH' => 'Одежда/Мужская', // путь родительских групп в МойСклад, '' для корневой
'PARENT_HREF' => 'https://api.moysklad.ru/api/remap/1.2/entity/productfolder/...', // '' для корневой
'ARCHIVED' => false, // bool или null
'ACTIVE' => 'Y', // 'Y' / 'N'
'NAME' => 'Рубашки',
'DESCRIPTION' => '',
'DATE_UPDATE' => '27.09.2026 10:15:00', // или ''
],
// ...
]
По итоговому массиву модуль создаёт и обновляет разделы: для каждой группы строит цепочку родителей по PARENT_HREF. Что при этом важно:
- родитель ищется только в
allGroups: если убрать группу, а её дочерние оставить, они станут разделами верхнего уровня; - группа с пустым
XML_IDпропускается; - если добавить группе ключ
SECTION_IDс ID существующего раздела, модуль возьмёт этот раздел как есть — не будет ни искать, ни обновлять его, и вложит в него дочерние группы.
Возвращаемое значение
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $allGroups);
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'onBeforeCreateTreeOfGroups',
'onBeforeCreateTreeOfGroupsHandler'
);
function onBeforeCreateTreeOfGroupsHandler(\Bitrix\Main\Event $event)
{
$allGroups = $event->getParameter('allGroups'); // href группы => данные группы
#WORK_AREA#
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $allGroups);
}
Не создавать разделы для служебных групп
function onBeforeCreateTreeOfGroupsHandler(\Bitrix\Main\Event $event)
{
$allGroups = $event->getParameter('allGroups');
foreach ($allGroups as $href => $group) {
// группы «_Служебные» и всё, что в них вложено
if ($group['NAME'] === '_Служебные' || mb_strpos($group['PATH'], '_Служебные') === 0) {
unset($allGroups[$href]);
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $allGroups);
}