Как реализовать отправку SMS через сервис sms.ru в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция 1С с внешними сервисами отправки уведомлений — это стандартная задача, которая часто вызывает вопросы у начинающих разработчиков. Проблема, описанная в теме, заключается в использовании устаревших технологий (COM-объектов) и непонимании того, как отличить технический успех HTTP-запроса от фактической отправки сообщения пользователю. В данной статье мы разберем, как правильно выстроить работу с API сервиса sms.ru, используя современные возможности платформы 1С.

Почему стоит отказаться от Microsoft.XMLHTTP в пользу встроенных средств 1С?

В исходном коде автора темы используется объект Microsoft.XMLHTTP. Рассмотрим причины, по которым его следует заменить на встроенные объекты 1С:

  1. Кроссплатформенность: COM-объекты работают только в среде Windows. Если ваш сервер 1С работает под управлением Linux, такой код выдаст ошибку.
  2. Безопасность: Современные стандарты требуют работы через защищенный протокол HTTPS. В 1С это реализуется через ЗащищенноеСоединениеOpenSSL, что гораздо проще и надежнее настраивается внутри платформы.
  3. Производительность: Встроенные объекты HTTPСоединение и HTTPЗапрос оптимизированы для работы в кластере 1С.

Шаг 1. Настройка защищенного соединения (SSL)

Так как сервис использует протокол HTTPS, нам необходимо создать объект защищенного соединения. Проанализируем ситуацию: чаще всего достаточно использовать настройки по умолчанию, чтобы 1С доверяла сертификатам центра сертификации.


// Создаем защищенное соединение
SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

Шаг 2. Формирование запроса к API

Разберем по шагам создание соединения и отправку запроса. Сервис sms.ru позволяет передавать данные как методом GET, так и методом POST. Мы рекомендуем использовать POST, так как это безопаснее (данные не отображаются в логах веб-серверов в открытом виде) и позволяет передавать длинные сообщения без риска обрезания URL.

Для начала подготовим параметры. Важно использовать КодироватьСтроку, чтобы спецсимволы и пробелы в тексте сообщения не «сломали» запрос.


// Исходные данные
ID_Аккаунта = "ВАШ_API_ID";
НомерТелефона = "79001234567";
ТекстСообщения = "Привет! Это проверка отправки из 1С.";

// Формируем строку параметров
ПараметрыЗапроса = "api_id=" + ID_Аккаунта + 
                   "&to=" + НомерТелефона + 
                   "&msg=" + КодироватьСтроку(ТекстСообщения, СпособКодированияСтроки.URLДанные) + 
                   "&json=1"; // Просим сервер вернуть ответ в формате JSON

Шаг 3. Отправка и получение ответа

Теперь создадим объект HTTPСоединение и выполним запрос. Обратите внимание, что хост (адрес сервера) и путь к методу API разделяются.


Хост = "sms.ru";
Ресурс = "/sms/send";

Соединение = Новый HTTPСоединение(Хост, , , , , 10, SSL);
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.УстановитьТелоИзСтроки(ПараметрыЗапроса, КодировкаТекста.UTF8, "application/x-www-form-urlencoded");

Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Исключение
    Сообщить("Ошибка связи: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Шаг 4. Обработка JSON и проверка статуса отправки

Выясним причину, по которой статус 200 (ОК) не гарантирует доставку SMS. Статус 200 означает лишь то, что сервер sms.ru принял ваш запрос. Но само сообщение может не уйти из-за нехватки денег, неверного номера или блокировки отправителя. Чтобы проверить реальный статус, нам нужно разобрать JSON-ответ.


Если Ответ.КодСостояния = 200 Тогда
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТекстОтвета);
    Результат = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
    // Проверяем общий статус запроса
    Если Результат.status = "OK" Тогда
        // Успех на уровне API. Проверим статус конкретного сообщения
        // Ответ приходит в виде структуры, где ключ "sms" содержит информацию по номерам
        Для Каждого ТекущийНомер Из Результат.sms Цикл
            Если ТекущийНомер.Значение.status_code = 100 Тогда
                Сообщить("СМС на номер " + ТекущийНомер.Ключ + " успешно отправлено!");
            Иначе
                Сообщить("Ошибка отправки на номер " + ТекущийНомер.Ключ + ": " + ТекущийНомер.Значение.status_text);
            КонецЕсли;
        КонецЦикла;
        
        // Полезно сразу вывести баланс
        Сообщить("Остаток на балансе: " + Результат.balance);
    Иначе
        Сообщить("Сервер вернул ошибку: " + Результат.status_text);
    КонецЕсли;
Иначе
    Сообщить("Ошибка HTTP: " + Ответ.КодСостояния);
КонецЕсли;

Дополнительные возможности и советы

При работе с API sms.ru можно использовать дополнительные параметры для оптимизации:

Таким образом, мы проанализировали процесс интеграции и выяснили, что ключ к успеху лежит в правильной обработке тела ответа и использовании штатных объектов HTTPСоединение и ЧтениеJSON. Этот подход делает ваш код надежным, читаемым и независимым от операционной системы.

← На главную