Перейти к содержимому

Notifly в 1С-Битрикс

В Битриксе всё происходит через систему событий (AddEventHandler). Подключим её к Notifly и научимся получать push в момент важных бизнес-событий.

Положите helper в bitrix/php_interface/init.php (или подключите оттуда отдельный файл):

<?php
function notifly_send(string $title, string $message, int $priority = 5): void {
$url = defined('NOTIFLY_URL') ? NOTIFLY_URL : (getenv('NOTIFLY_URL') ?: '');
$token = defined('NOTIFLY_TOKEN') ? NOTIFLY_TOKEN : (getenv('NOTIFLY_TOKEN') ?: '');
if (!$url || !$token) return;
$body = json_encode([
'title' => mb_substr($title, 0, 200),
'message' => mb_substr($message, 0, 1500),
'priority' => $priority,
], JSON_UNESCAPED_UNICODE);
$ch = curl_init("$url/message?token=$token");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => $body,
CURLOPT_TIMEOUT => 5,
]);
curl_exec($ch);
curl_close($ch);
}

В bitrix/.settings_extra.php (или php_interface/dbconn.php) задайте:

define('NOTIFLY_URL', 'https://your-notifly.example.com');
define('NOTIFLY_TOKEN', 'AGdjfk_L.dKe8q');
use Bitrix\Main\EventManager;
use Bitrix\Sale\Order;
EventManager::getInstance()->addEventHandler(
'sale', 'OnSaleOrderSaved',
function (\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
if (!$order instanceof Order) return;
if (!$event->getParameter('IS_NEW')) return;
$items = [];
foreach ($order->getBasket() as $item) {
$items[] = '' . $item->getField('NAME')
. ' × ' . (int)$item->getQuantity();
}
notifly_send(
"🛒 Заказ #{$order->getId()}" . number_format($order->getPrice(), 2, '.', ' ') . '',
"Покупатель: " . $order->getField('USER_DESCRIPTION') . "\n" .
"Состав:\n" . implode("\n", $items) . "\n\n" .
"Админка: https://" . $_SERVER['SERVER_NAME']
. "/bitrix/admin/sale_order_view.php?ID={$order->getId()}",
8
);
}
);
EventManager::getInstance()->addEventHandler(
'sale', 'OnSaleStatusOrderChange',
function ($id, $status) {
notifly_send(
"📦 Заказ #$id → статус $status",
"https://" . $_SERVER['SERVER_NAME']
. "/bitrix/admin/sale_order_view.php?ID=$id",
5
);
}
);
EventManager::getInstance()->addEventHandler(
'form', 'onAfterResultAdd',
function ($form_id, $result_id) {
$form = \CForm::GetByID($form_id)->Fetch();
notifly_send(
"✉️ Форма «{$form['NAME']}» (#$result_id)",
"Открыть: https://" . $_SERVER['SERVER_NAME']
. "/bitrix/admin/form_result_view.php?WEB_FORM_ID=$form_id&RESULT_ID=$result_id",
6
);
}
);
EventManager::getInstance()->addEventHandler(
'main', 'OnAfterUserAdd',
function (&$fields) {
if (empty($fields['ID'])) return;
notifly_send(
"👤 Новый пользователь: {$fields['LOGIN']}",
"ID: {$fields['ID']}\n" .
"Email: {$fields['EMAIL']}\n" .
"https://" . $_SERVER['SERVER_NAME']
. "/bitrix/admin/user_edit.php?ID={$fields['ID']}",
4
);
}
);

В php_interface/init.php добавьте error-handler:

set_error_handler(function ($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) return;
if ($severity === E_USER_NOTICE || $severity === E_NOTICE) return;
notifly_send(
"⚠️ PHP error: $message",
"Файл: $file:$line\nURL: " . ($_SERVER['REQUEST_URI'] ?? '-'),
7
);
});
register_shutdown_function(function () {
$err = error_get_last();
if ($err && in_array($err['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
notifly_send(
"🔥 Fatal: {$err['message']}",
"Файл: {$err['file']}:{$err['line']}\nURL: " . ($_SERVER['REQUEST_URI'] ?? '-'),
10
);
}
});

Битрикс-агенты запускаются по cron или хитам. Если хитов мало, агенты «спят» сутками. Заведите ежедневный агент-маяк:

function NotiflyDailyAgent() {
notifly_send('🟢 Bitrix агенты живы',
'Сервер: ' . $_SERVER['SERVER_NAME'] . ', ' . date('Y-m-d H:i:s'),
2);
return 'NotiflyDailyAgent();';
}
// Регистрируется через CAgent::AddAgent() в init.php или вручную в админке

Если 25 часов нет «зелёного» — что-то с агентами или cron-ом.

  • Бизнес-уведомления приходят моментально. Заказ упал — push прежде, чем клиент закрыл вкладку.
  • Дополнительный канал для критичных событий. Когда стандартные SMTP-уведомления Битрикса застревают в очереди или не доходят, Notifly работает.
  • Дешёвый «error tracker» для крупных сайтов. Не каждый владелец Битрикса готов платить за Sentry/Bugsnag.
  • Отдельные каналы Notifly: «заказы», «формы», «ошибки» — разные звуки и фильтры.
  • Тротлинг через \Bitrix\Main\Data\Cache, чтобы не получать одно и то же при батч-импорте.