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

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

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

-
Название события — выберите тип события, который свяжет код и шаблон.
-
Активен — отметка, что система может использовать шаблон.
-
Сайты — сайт для которого действует шаблон.
-
Язык — конкретный язык, например,
ruилиen. -
Телефон отправителя — номер, с которого система отправит СМС.
-
Телефон получателя — номер получателя сообщения.
-
Шаблон сообщения — текст сообщения с метками, которые заменяются реальными данными.
В доступных полях система показывает системные метки и те, которые вы указали в типе события. Их можно использовать для полей сообщения.
Класс \Bitrix\Main\Sms\Event
Класс \Bitrix\Main\Sms\Event управляет отправкой СМС: ищет подходящий шаблон, подставляет данные и передает сообщение модулю Служба сообщений messageservice.
Конструктор
__construct(string $eventName, array $fields = [])
-
$eventName— имя СМС-события, совпадает с полемEVENT_NAMEв шаблоне. -
$fields— массив данных для подстановки.
Пример:
$event = new \Bitrix\Main\Sms\Event('ORDER_READY', [
'ORDER_ID' => 42,
'USER_PHONE' => '89991234567',
]);
Методы
Найти шаблон
Метод setSite($siteId) задает сайт для поиска шаблона.
$siteId— идентификатор сайта.
$event->setSite('s1');
По умолчанию система использует текущий сайт.
Задать язык для выбора шаблона
Метод setLanguage($languageId) задает язык для выбора шаблона.
$languageId— идентификатор языка.
$event->setLanguage('ru'); // может быть 'ru', 'en', 'de' и так далее
По умолчанию система использует текущий язык.
Выбрать шаблон по идентификатору
Метод setTemplate($templateId) выбирает конкретный шаблон по ID.
$templateId— числовой идентификатор шаблона.
$event->setTemplate(105);
Если указать шаблон по ID, система не будет искать его по событию и языку.
Отправить СМС
Метод send($directly) отправляет СМС.
$directly— по умолчанию имеет значениеfalse, то есть сообщение попадает в очередь. Если установитьtrue, сообщение отправится без очереди.
$result = $event->send(false);
Метод возвращает объект \Bitrix\Main\Result. Получить список ошибок можно кодом:
if (!$result->isSuccess()) {
foreach ($result->getErrorMessages() as $msg) {
echo $msg;
}
}
Получить список сообщений
Метод 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, чтобы использовать методы.
CModule::IncludeModule('messageservice');
getSenders— получает список всех доступных провайдеров.
$senders = \Bitrix\MessageService\Sender\SmsManager::getSenders();
getDefaultSender— получает провайдера по умолчанию для региона.
$defaultSender = \Bitrix\MessageService\Sender\SmsManager::getDefaultSender();
getUsableSender— получает первого доступного провайдера.
$usableSender = \Bitrix\MessageService\Sender\SmsManager::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(); // Массив ошибок
}
Автоматическая нормализация номеров
Система автоматически приводит номера телефонов к международному формату.
// 1. Вход: 89161234567 → Выход: +79161234567
// 2. Вход: +7 (916) 123-45-67 → Выход: +79161234567
Обработка ошибок
Методы отправки возвращают объект 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');
}
);