Интеграция 1С с внешними сервисами отправки уведомлений — это стандартная задача, которая часто вызывает вопросы у начинающих разработчиков. Проблема, описанная в теме, заключается в использовании устаревших технологий (COM-объектов) и непонимании того, как отличить технический успех HTTP-запроса от фактической отправки сообщения пользователю. В данной статье мы разберем, как правильно выстроить работу с API сервиса sms.ru, используя современные возможности платформы 1С.
В исходном коде автора темы используется объект Microsoft.XMLHTTP. Рассмотрим причины, по которым его следует заменить на встроенные объекты 1С:
ЗащищенноеСоединениеOpenSSL, что гораздо проще и надежнее настраивается внутри платформы.HTTPСоединение и HTTPЗапрос оптимизированы для работы в кластере 1С.Так как сервис использует протокол HTTPS, нам необходимо создать объект защищенного соединения. Проанализируем ситуацию: чаще всего достаточно использовать настройки по умолчанию, чтобы 1С доверяла сертификатам центра сертификации.
// Создаем защищенное соединение
SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Разберем по шагам создание соединения и отправку запроса. Сервис sms.ru позволяет передавать данные как методом GET, так и методом POST. Мы рекомендуем использовать POST, так как это безопаснее (данные не отображаются в логах веб-серверов в открытом виде) и позволяет передавать длинные сообщения без риска обрезания URL.
Для начала подготовим параметры. Важно использовать КодироватьСтроку, чтобы спецсимволы и пробелы в тексте сообщения не «сломали» запрос.
// Исходные данные
ID_Аккаунта = "ВАШ_API_ID";
НомерТелефона = "79001234567";
ТекстСообщения = "Привет! Это проверка отправки из 1С.";
// Формируем строку параметров
ПараметрыЗапроса = "api_id=" + ID_Аккаунта +
"&to=" + НомерТелефона +
"&msg=" + КодироватьСтроку(ТекстСообщения, СпособКодированияСтроки.URLДанные) +
"&json=1"; // Просим сервер вернуть ответ в формате JSON
Теперь создадим объект HTTPСоединение и выполним запрос. Обратите внимание, что хост (адрес сервера) и путь к методу API разделяются.
Хост = "sms.ru";
Ресурс = "/sms/send";
Соединение = Новый HTTPСоединение(Хост, , , , , 10, SSL);
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.УстановитьТелоИзСтроки(ПараметрыЗапроса, КодировкаТекста.UTF8, "application/x-www-form-urlencoded");
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Исключение
Сообщить("Ошибка связи: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Выясним причину, по которой статус 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 можно использовать дополнительные параметры для оптимизации:
test=1: Позволяет имитировать отправку без списания реальных средств. Идеально подходит для отладки кода.translit=1: Автоматически переводит кириллицу в латиницу. Это позволяет уместить в одну тарифицируемую SMS до 160 символов вместо 70, что существенно экономит бюджет при массовых рассылках.Таким образом, мы проанализировали процесс интеграции и выяснили, что ключ к успеху лежит в правильной обработке тела ответа и использовании штатных объектов HTTPСоединение и ЧтениеJSON. Этот подход делает ваш код надежным, читаемым и независимым от операционной системы.