Есть хорошая статья на эту тему. Немного устарела, но суть осталась прежняя:
https://dev.1c-bitrix.ru/community/blogs/silaev/ma...
Отлаживать очень сложно, так как по времени должен быть запуск
Если триггер активирован - он создаёт агента.
Можно либо править время запуска агента, либо вызывать его код запуска руками.
Ниже привожу обрезанный код работающего триггера с проекта.
Вешаете на событие обработчик:
AddEventHandler("sender", "OnTriggerList", ["EventListener", "onTriggerList"]);
Затем вызываете ваш триггер:
use Bitrix\Main\Event;
class EventListener
{
public static function OnTriggerList(Event $event): Event
{
Handlers\Sender\MyTrigger::addTriggerInList($event);
return $event;
}
}
Код обработчика примерно такой:
namespace Handlers\Sender;
use Bitrix\Main\Event;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\EventResult;
use Bitrix\Sender\Trigger\TriggerConnectorClosed;
Loc::loadMessages(__FILE__);
Loader::includeModule('sender');
class MyTrigger extends TriggerConnectorClosed
{
public static function addTriggerInList(Event &$event): Event
{
$event->addResult(new EventResult(0, [
'TRIGGER' => [
'Handlers\Sender\MyTrigger'
]
]));
return $event;
}
public function getName(): string
{
return 'TriggerName';
}
public function getCode(): string
{
return 'my_trigger';
}
public static function canBeTarget(): bool
{
return false;
}
public function filter(): bool
{
$this->recipient = [];
// Тут какая-то логика на поиск людей по нужным параметрам
$this->recipient[] = [
'EMAIL' => $user['EMAIL'],
'NAME' => $user['NAME'],
'USER_ID' => $user['ID'],
];
if (!empty($this->recipient)) {
return true;
} else {
return false;
}
}
public function getForm(): string
{
return ' '; // Тут форма с параметрами которые можно выбирать при создании триггера, если нужно.
}
public function getRecipient()
{
return $this->recipient;
}
public static function getPersonalizeList(): array
{
return [];
}
}
Главное учтите, что если триггер будет запускаться через Cron, а в его коде есть какие-то методы и классы которые подключаются через composer, то путь к автолоадеру должен быть прописан абсолютный, а не через
$_SERVER["DOCUMENT_ROOT"]
- иначе не будет отрабатывать триггер.