Зачем нужны уведомления о новых элементах
В CMS 1С-Битрикс часто используется механизм инфоблоков для хранения различного контента:
-
Товары и услуги
-
Новости и статьи
-
Заявки и обращения
-
Отзывы и комментарии
При этом новые элементы могут:
- Требовать модерации перед публикацией
- Нуждаться в оперативной обработке (например, заказы)
- Быть частью важных бизнес-процессов
Автоматические уведомления решают эти задачи, избавляя от необходимости постоянной проверки административного раздела.
Базовый способ: обработчик события OnAfterIBlockElementAdd
1. Создаем обработчик
Добавьте в файл /bitrix/php_interface/init.php:
<?php
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "notifyAboutNewElement");
function notifyAboutNewElement(&$arFields) {
// Укажите ID вашего инфоблока
$targetIblockId = 22;
if ($arFields["IBLOCK_ID"] == $targetIblockId) {
$adminEmail = COption::GetOptionString("main", "email_from");
$iblockName = CIBlock::GetByID($targetIblockId)->Fetch()['NAME'];
$subject = "Добавлен новый элемент в инфоблок «{$iblockName}»";
$message = "
<h3>Новый элемент #{$arFields['ID']}</h3>
<p><strong>Название:</strong> {$arFields['NAME']}</p>
<p><strong>Дата создания:</strong> ".FormatDate('j F Y H:i')."</p>
";
if (!empty($arFields['PREVIEW_TEXT'])) {
$message .= "<p><strong>Описание:</strong> {$arFields['PREVIEW_TEXT']}</p>";
}
$message .= "
<p>
<a href='/bitrix/admin/iblock_element_edit.php?IBLOCK_ID={$targetIblockId}&type=content&ID={$arFields['ID']}'>
Редактировать элемент
</a>
</p>
";
CEvent::SendImmediate(
"IBLOCK_NEW_ELEMENT",
SITE_ID,
array(
"EMAIL_TO" => $adminEmail,
"SUBJECT" => $subject,
"BODY" => $message,
)
);
}
}2. Особенности реализации
- Гибкая фильтрация по ID инфоблока
- Автоматическое определение email из настроек сайта
- Ссылка на редактирование элемента в админке
- Адаптивный формат письма (HTML)
Продвинутый вариант: использование почтовых шаблонов
1. Создаем почтовый шаблон
-
Перейдите в Контент → Почтовые шаблоны
-
Добавьте новый шаблон:
-
Тип события:
IBLOCK_ELEMENT_ADDED -
Тема:
Новый элемент #ELEMENT_ID# в #IBLOCK_NAME# -
Тело письма:
<p>На сайте #SITE_NAME# создан новый элемент.</p> <h3>#ELEMENT_NAME#</h3> <p>Тип: #IBLOCK_NAME#</p> <p>Дата: #DATE_CREATE#</p> #if PREVIEW_TEXT# <div style="background:#f5f5f5;padding:15px;margin:10px 0;"> #PREVIEW_TEXT# </div> #endif# <p> <a href="#ADMIN_LINK#">Перейти к редактированию</a> </p>
-
2. Модифицируем обработчик
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "notifyAboutNewElement");
function notifyAboutNewElement(&$arFields) {
$targetIblocks = [22, 33]; // Массив ID отслеживаемых инфоблоков
if (in_array($arFields["IBLOCK_ID"], $targetIblocks)) {
$iblockInfo = CIBlock::GetByID($arFields["IBLOCK_ID"])->Fetch();
CEvent::Send(
"IBLOCK_ELEMENT_ADDED",
SITE_ID,
array(
"ELEMENT_ID" => $arFields['ID'],
"ELEMENT_NAME" => $arFields['NAME'],
"IBLOCK_NAME" => $iblockInfo['NAME'],
"PREVIEW_TEXT" => $arFields['PREVIEW_TEXT'],
"DATE_CREATE" => FormatDate('j F Y H:i'),
"ADMIN_LINK" => "/bitrix/admin/iblock_element_edit.php?IBLOCK_ID="
.$arFields["IBLOCK_ID"]."&type=content&ID=".$arFields['ID']
),
"Y" // Отправить копию на email из настроек
);
}
}Дополнительные возможности
1. Отправка разным адресатам в зависимости от инфоблока
$recipients = [
22 => ['admin@site.com', 'content@site.com'], // Для инфоблока 22
33 => ['sales@site.com', 'manager@site.com'] // Для инфоблока 33
];
if (isset($recipients[$arFields["IBLOCK_ID"]])) {
foreach ($recipients[$arFields["IBLOCK_ID"]] as $email) {
CEvent::Send(...);
}
}2. Включение свойств элемента
$props = CIBlockElement::GetProperty(
$arFields["IBLOCK_ID"],
$arFields['ID']
);
while ($prop = $props->Fetch()) {
if ($prop['VALUE']) {
$message .= "<p><strong>{$prop['NAME']}:</strong> {$prop['VALUE']}</p>";
}
}3. Обработка только активных элементов
if ($arFields["ACTIVE"] == 'Y') {
// Отправляем уведомление только для активных элементов
}Частые вопросы
Q: Как проверить работу обработчика?
A: Добавьте временный код для логирования:
AddMessage2Log("Элемент {$arFields['ID']} добавлен в инфоблок {$arFields["IBLOCK_ID"]}", "iblock");
Q: Можно ли отправлять SMS вместо email?
A: Да, используйте аналогичный обработчик с подключением SMS-шлюза.
Q: Как избежать спама при массовом импорте?
A: Добавьте проверку:
if (defined('BX_CRONTAB') || defined('BX_IMPORT')) {
return; // Не отправляем при импорте или по cron
}Заключение
Представленные решения позволяют:
-
Гибко настраивать уведомления для любых инфоблоков
-
Контролировать важные изменения контента
-
Интегрировать с бизнес-процессами компании
Для сложных сценариев рассмотрите использование:
-
Бизнес-процессов в модуле workflow
-
Обработчиков OnAfterIBlockElementUpdate для отслеживания изменений
-
Интеграции с мессенджерами (Telegram, Slack)
Настроив автоматические уведомления, вы значительно повысите эффективность работы с контентом в Битрикс!