Работа с СМС
Bitrix Framework использует СМС, чтобы уведомлять пользователей. Отправляет СМС модуль Служба сообщений. Он соединяет систему с разными СМС-провайдерами.
Как работает отправка СМС
-
Код приложения создает СМС-событие с данными для подстановки.
-
Система находит активный СМС-шаблон по имени события, сайту и языку.
-
Данные подставляются в шаблон вместо специальных меток вида
#CODE#. -
Готовое сообщение передается выбранному СМС-провайдеру.
-
Провайдер доставляет СМС до абонента.
Метки в шаблонах — это специальные пометки в тексте, которые система заменяет реальными данными. Например, метка #USER_NAME# заменится на имя пользователя, а #ORDER_ID# — на номер заказа.

События и шаблоны сообщений
Чтобы отправить СМС, нужно создать тип события и связать с ним шаблон. Тип события определяет, когда отправлять сообщение, а шаблон — какой текст использовать. В шаблоне укажите метки, которые система заменит на реальные данные.
Создать тип события
Тип события — это идентификатор, который связывает код с шаблонами СМС.
Чтобы создать новый тип события, откройте страницу Настройки > Почтовые и СМС события > Типы событий и нажмите Добавить тип.

-
Тип события — укажите уникальное имя, например,
ORDER_READY. -
Вид события — выберите СМС-событие.
-
Название — напишите понятное название для каждого языка.
-
Описание — добавьте описание события, например, доступные метки.
Создать шаблон
Шаблон задает текст сообщения для системных уведомлений.

-
Название события — выберите тип события, который свяжет код и шаблон.
-
Активен — отметка, что система может использовать шаблон.
-
Сайты — сайт для которого действует шаблон.
-
Язык — конкретный язык, например,
ruилиen. -
Телефон отправителя — номер, с которого система отправит СМС.
-
Телефон получателя — номер получателя сообщения.
-
Шаблон сообщения — текст сообщения с метками, которые заменяются реальными данными.
В доступных полях система показывает системные метки и те, которые вы указали в типе события. Их можно использовать для полей сообщения.
Класс \Bitrix\Main\Sms\Event
Класс \Bitrix\Main\Sms\Event управляет отправкой СМС: ищет подходящий шаблон, подставляет данные и передает сообщение модулю Служба сообщений messageservice.
Конструктор
-
$eventName— имя СМС-события, совпадает с полемEVENT_NAMEв шаблоне. -
$fields— массив данных для подстановки.
Пример:
$event = new \Bitrix\Main\Sms\Event('ORDER_READY', [
'ORDER_ID' => 42,
'USER_PHONE' => '89991234567',
]);
Методы
Найти шаблон
Метод setSite($siteId) задает сайт для поиска шаблона.
$siteId— идентификатор сайта.
По умолчанию система использует текущий сайт.
Задать язык для выбора шаблона
Метод setLanguage($languageId) задает язык для выбора шаблона.
$languageId— идентификатор языка.
По умолчанию система использует текущий язык.
Выбрать шаблон по идентификатору
Метод setTemplate($templateId) выбирает конкретный шаблон по ID.
$templateId— числовой идентификатор шаблона.
Если указать шаблон по ID, система не будет искать его по событию и языку.
Отправить СМС
Метод send($directly) отправляет СМС.
$directly— по умолчанию имеет значениеfalse, то есть сообщение попадает в очередь. Если установитьtrue, сообщение отправится без очереди.
Метод возвращает объект \Bitrix\Main\Result. Получить список ошибок можно кодом:
Получить список сообщений
Метод createMessageList() получает список сообщений на основе шаблонов.
$result = $event->createMessageList();
if ($result->isSuccess())
{
$messages = $result->getData();
}
Метод возвращает объект \Bitrix\Main\Result. Поле data содержит массив объектов \Bitrix\Main\Sms\Message.
Примеры
Отправить СМС через очередь
Сообщение отправится через систему очередей после завершения текущего запроса.
use Bitrix\Main\Sms\Event;
// Создаем событие с данными для подстановки в шаблон
$event = new Event('USER_CONFIRM_PHONE', [
'CODE' => '123456', // Подставится вместо #CODE# в шаблоне
'USER_ID' => 42, // Подставится вместо #USER_ID# в шаблоне
]);
// Настраиваем и отправляем сообщение
$result = $event
->setSite('s1') // Указываем сайт для поиска шаблона
->setLanguage('ru') // Указываем язык шаблона
->send(false) // false — отправка через очередь
;
// Проверяем результат отправки
if (!$result->isSuccess())
{
foreach ($result->getErrorMessages() as $msg)
{
echo $msg;
}
}
Отправить сообщение без очереди
Сообщение отправится сразу, без помещения в очередь.
// Создаем и отправляем событие в одной строке
$result = (new Event('PASSWORD_RESTORE', $fields)) // $fields — массив данных для шаблона
->setSite('s1') // Указываем сайт
->send(true) // true — немедленная отправка без очереди
;
Отправить сообщение по ID шаблона
Пример использует конкретный шаблон по ID. Система не ищет шаблон по имени события.
// Используем конкретный шаблон, минуя поиск по имени события
$result = (new Event('IGNORED_EVENT', $fields)) // Имя события игнорируется
->setSite('s1')
->setTemplate(105) // Используем шаблон с ID 105
->send() // Отправляем сообщение
;
Событие onBeforeSendSms
Перед отправкой сообщения система вызывает событие main:onBeforeSendSms. Обработчик получает объект сообщения. Он может проверить данные или изменить текст. Если обработчик вернет ошибку, система не отправит сообщение.
use Bitrix\Main\EventManager;
use Bitrix\Main\EventResult;
// Регистрируем обработчик для проверки СМС перед отправкой
EventManager::getInstance()->addEventHandler(
'main',
'onBeforeSendSms',
function(\Bitrix\Main\Event $event) {
// Получаем объект сообщения
$msg = $event->getParameter('message');
// Проверяем формат номера телефона
if (!preg_match('/^\+?[1-9]\d{7,14}$/', $msg->getTo()))
{
// Если номер невалидный — отменяем отправку
return new EventResult(EventResult::ERROR);
}
// Если все проверки пройдены, сообщение будет отправлено
}
);
Модуль Служба сообщений
Чтобы отправить СМС, система использует внешних провайдеров — специальные сервисы, которые доставляют сообщения до абонентов. Модуль Служба сообщений messageservice управляет подключением к провайдерам и настройками отправки.
Установить модуль
Чтобы установить модуль Служба сообщений, откройте страницу Настройки > Настройки продукта > Модули в административном разделе. В списке найдите модуль и нажмите кнопку Установить.

Настроить модуль
Настроить модуль можно на странице Настройки > Настройки продукта > Настройки модулей > Служба сообщений.
-
Сколько дней хранить сообщения — задает срок хранения истории СМС. Система автоматически удаляет старые сообщения.
-
Сколько сообщений отправлять за один хит — ограничивает количество СМС за один запрос. Это предотвращает перегрузку сервера.
-
Службы отправки SMS — отображает список доступных СМС-провайдеров. Для подключения сервиса кликните по его названию и заполните форму.
-
Дневные лимиты отправки SMS — ограничивает количество СМС в сутки.

Класс SmsManager
Класс \Bitrix\MessageService\Sender\SmsManager предоставляет единый интерфейс для работы с СМС-провайдерами. Он автоматически определяет доступные сервисы отправки и управляет процессом отправки сообщений.
Провайдеры
Каждый сервис отправки СМС — это класс в пространстве имен \Bitrix\MessageService\Sender\Sms\. Класс содержит константы для идентификации провайдера.
\Bitrix\MessageService\Sender\Sms\SmsRu::ID // идентификатор SMS.RU
\Bitrix\MessageService\Sender\Sms\EdnaRu::ID // идентификатор Edna
Примечание
Полный список провайдеров можно получить методом getSenders(). Система включает только те провайдеры, которые поддерживаются текущей конфигурацией.
Методы
Подключите модуль messageservice, чтобы использовать методы.
getSenders— получает список всех доступных провайдеров.
getDefaultSender— получает провайдера по умолчанию для региона.
getUsableSender— получает первого доступного провайдера.
getSenderById— получает информацию о провайдере по идентификаторуID.
$sender = \Bitrix\MessageService\Sender\SmsManager::getSenderById(
\Bitrix\MessageService\Sender\Sms\SmsRu::ID
);
Зарегистрировать провайдера
Чтобы добавить провайдера:
-
создайте класс провайдера — наследник
\Bitrix\MessageService\Sender\Base, -
зарегистрируйте класс через событие.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->registerEventHandler(
'messageservice',
'onGetSmsSenders',
'messageservice',
'Bitrix\MessageService\Sender\Sms\Dummy',
'onGetSmsSenders'
);
Отправка сообщений
Класс SmsManager предоставляет несколько способов отправки СМС. Вы можете отправлять сообщения напрямую, работать с объектами сообщений для тонкой настройки или создавать сообщения на основе шаблонов.
Отправить сообщение
Метод sendMessage() отправляет сообщение через указанного провайдера. Сообщение добавляется в очередь отправки.
\Bitrix\MessageService\Sender\SmsManager::sendMessage([
'SENDER_ID' => \Bitrix\MessageService\Sender\Sms\Ednaru::ID, // Идентификатор провайдера
'AUTHOR_ID' => $authorId, // Пользователь — отправитель сообщения
'MESSAGE_TO' => $phoneNumber, // Номер получателя в международном формате
'MESSAGE_FROM' => $chanelId, // Канал отправителя
'MESSAGE_BODY' => 'Здравствуйте, ваш заказ уже в пути.', // Текст сообщения
]);
Отправить сообщение с расширенной настройкой
Метод createMessage() дает больше контроля над отправкой СМС. Используйте его, чтобы задать дополнительные параметры или заголовки.
С помощью метода можно:
-
настроить дополнительные параметры через
MESSAGE_HEADERS, -
выбрать момент отправки — через очередь или сразу,
-
проверить данные перед отправкой.
$message = \Bitrix\MessageService\Sender\SmsManager::createMessage([
'SENDER_ID' => \Bitrix\MessageService\Sender\Sms\Ednaru::ID,
'MESSAGE_TO' => $phoneNumber,
'MESSAGE_FROM' => $chanelId,
'MESSAGE_BODY' => $text,
'MESSAGE_HEADERS' => [
'module_id' => 'crm', // Привязка к модулю, например, CRM
'bindings' => [ // Связи с CRM-объектами
[
'OWNER_TYPE_ID' => 1, // Тип объекта, например, лид
'OWNER_ID' => 57, // Идентификатор объекта
],
],
],
]);
// Отправить через очередь
$result = $message->send();
// Отправить немедленно
$result = $message->sendDirectly();
Отправить сообщение без очереди
Метод sendMessageDirectly() отправляет сообщение немедленно, без помещения в очередь. Используйте этот метод для срочных сообщений.
$result = \Bitrix\MessageService\Sender\SmsManager::sendMessageDirectly([
'SENDER_ID' => \Bitrix\MessageService\Sender\Sms\SmsRu::ID,
'MESSAGE_TO' => '+79161234567',
'MESSAGE_BODY' => 'Срочное сообщение',
]);
Создать сообщение по шаблону
Метод createMessageListByTemplate() создает список сообщений на основе СМС-шаблонов. Система автоматически находит шаблоны по имени события и подставляет переданные данные.
// Данные для подстановки в шаблон. Могут быть разными для каждого получателя
$templateData = [
'CODE' => $confirmationCode, // Данные для подстановки в плейсхолдер #CODE#
'USER_ID' => $userId, // Данные для подстановки в плейсхолдер #USER_ID#
'SENDER_ID' => \Bitrix\MessageService\Sender\Sms\SmsRu::ID, // Опциональный провайдер
'DEFAULT_FROM' => 'MyCompany' // Опциональный отправитель
];
// Создаем сообщения на основе шаблона 'USER_CONFIRM_PHONE'
$messages = \Bitrix\MessageService\Sender\SmsManager::createMessageListByTemplate(
'USER_CONFIRM_PHONE', // имя события, указанное в шаблоне
$templateData
);
// Отправляем все созданные сообщения
foreach ($messages as $message)
{
$message->send();
}
Проверить статус сообщения
Метод getMessageStatus() позволяет получить текущий статус отправленного сообщения. Статус помогает отслеживать доставку и обрабатывать ошибки.
// Получаем статус сообщения по его ID
$status = \Bitrix\MessageService\Sender\SmsManager::getMessageStatus($messageId);
if ($status->isSuccess())
{
// Сообщение успешно обработано
$statusCode = $status->getExternalStatus(); // Код статуса от провайдера
$statusText = $status->getStatusText(); // Текстовое описание статуса
}
else
{
// Произошла ошибка
$errors = $status->getErrorMessages(); // Массив ошибок
}
Автоматическая нормализация номеров
Система автоматически приводит номера телефонов к международному формату.
Обработка ошибок
Методы отправки возвращают объект Bitrix\Main\Result. Используйте этот объект для проверки результата операции. Если отправка не удалась, получите список ошибок.
$result = \Bitrix\MessageService\Sender\SmsManager::sendMessage($messageFields);
if (!$result->isSuccess())
{
foreach ($result->getErrorMessages() as $error)
{
// Обработка ошибки
}
}
События
Событие OnMessageSuccessfullySent позволяет выполнить код после успешной отправки СМС. Например, можно залогировать отправку или обновить данные в CRM.
use Bitrix\Main\EventManager;
use Bitrix\Main\Event;
// Логируем отправку СМС
EventManager::getInstance()->addEventHandler(
'messageservice',
'OnMessageSuccessfullySent',
function(Event $event) {
$messageId = $event->getParameter('ID');
// Запишем успешную отправку сообщения
AddMessage2Log("СМС отправлено. ID: {$messageId}", 'messageservice');
}
);