Впринципе не сложно.
Для начала Вы подписываетесь на событие OnAdminListDisplay модуля Main.
Именно оно отвечает за действие ДО вывода любого списка элементов в административной панели (за исключением под-листов у инфоблоков и модуля производительности).
На вход оно принимает лишь 1 параметр - экзепляр класса CAdminList (см. /bitrix/modules/main/interface/admin_list.php)
Чтобы обрабатывать нужную таблицу, нужно ограничить выборку. Т.е. Ваш обработчик будет выглядеть как-то так:
<?php
AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
function MyOnAdminContextMenuShow(&$oAdminList)
{
/**
* $type - тип кода инфоблока, например news, events и т.д.
* $iblock - идентификатор инфоблока
*
* Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
*/
if ( $oAdminList->table_id == "tbl_iblock_list_".md5($type.".".$iblock) )
{
// полезные действия
}
}
?>
Собственно так, мы получаем возможность работать с выводом.
Для более подробного пояснения лучше прочитать про заказные элементы в административной панели в документации:
https://dev.1c-bitrix.ru/api_help/main/general/adm...
Собственно добавим нужные нам данные для работы. Предположим, я хочу логгировать выделенные элементы на странице, тогда мой код будет выглядеть так:
AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
function MyOnAdminContextMenuShow(&$oAdminList)
{
/**
* $type - тип кода инфоблока, например news, events и т.д.
* $iblock - идентификатор инфоблока
*
* Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
*/
if ( $oAdminList->table_id == "tbl_iblock_list_".md5("structure.4") )
{
$arActions = $oAdminList->arActions;
$arActions['alert'] = 'Ругаться!';
$oAdminList->AddGroupActionTable($arActions);
}
}
AddEventHandler("main", "OnAfterEpilog", "iblockAlert");
function iblockAlert()
{
$oRequest = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
// Проверяем, что работает только в админке
if ( $oRequest->isAdminSection() )
{
if (
// Интересуют только интерактивные запросы
$oRequest->get('mode')=='frame'
// Где передана переменна IBLOCK_ID
&& $oRequest->get('IBLOCK_ID')==4
// Соответствующие нашему action
&& $oRequest->get('action')=='alert'
)
{
/**
* Вот тут можно сделать что угодно
* Можно получить выделенные ID
* через $oRequest->get('ID')
* Если он пуст, значит действие на всех элементах инфоблока
*/
}
}
}
На самом деле параметров гораздо больше - есть еще custom области, которые можно выводить, но суть та же. Если захотите добавить свое поле (я добавлял простой action), то
лучше глянуть в исходники и там уже по аналогии разрбраться