Как правильно отправить СМС из 1С с переносом строки через API Infobip

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

При интеграции 1С с внешними сервисами рассылок, такими как infobip.com, разработчики часто сталкиваются с проблемой передачи специальных символов в тексте сообщения. Типичная ситуация: при добавлении в текст стандартного переноса строки Символы.ПС сервис возвращает ошибку BAD_REQUEST. Это происходит из-за того, что в формате JSON символ переноса строки должен быть правильно экранирован, иначе структура документа нарушается, и сервер не может его обработать.

В этой статье мы подробно разберем, как избежать подобных ошибок, проанализируем способы формирования JSON-запросов и рассмотрим переход на современные методы работы с HTTP в 1С.

Почему возникает ошибка при использовании Символы.ПС

Разберем ситуацию: когда мы формируем тело запроса путем простой склейки строк, символ Символы.ПС вставляется в текст как реальный разрыв строки. JSON-стандарт запрещает наличие «сырых» управляющих символов внутри строковых значений. Чтобы передать перенос строки, он должен быть заменен на специальную последовательность символов \n.

Проанализируем пример некорректного кода, который часто становится причиной ошибки:


// Ошибочный вариант склейки JSON
ТекстСообщения = "Первая строка" + Символы.ПС + "Вторая строка";
smsjson = "{
|   ""from"":""MyCompany"",
|   ""to"":""79991234567"",
|   ""text"":""" + ТекстСообщения + """
|}";

В данном случае в переменную smsjson попадет текст с физическим переходом на новую строку, что приведет к невалидности JSON-пакета.

Решение 1: Ручное экранирование спецсимволов

Самый быстрый способ исправить ошибку, если вы используете ручную сборку строки — это замена символа переноса строки на текстовое представление \n. Рассмотрим, как это сделать программно:


// Исправленный вариант с использованием замены
ТекстСообщения = "Здравствуйте!" + Символы.ПС + "Ваш заказ готов.";
ТекстДляJSON = СтрЗаменить(ТекстСообщения, Символы.ПС, "\n");

// Обратите внимание на удвоение обратного слэша, если это необходимо внутри строки 1С
smsjson = "{ ""text"": """ + ТекстДляJSON + """ }";

Этот метод работает, но он не защищает от других проблем, например, если в тексте сообщения встретятся двойные кавычки. Поэтому мы рекомендуем переходить к более надежным инструментам платформы 1С.

Решение 2: Использование объекта ЗаписьJSON (рекомендуемый способ)

Начиная с версии 8.3, в 1С появились встроенные средства для работы с форматом JSON. Использование объекта ЗаписьJSON автоматически решает все проблемы с экранированием кавычек, обратных слэшей и переносов строк. Выясним, как реализовать это правильно:


// Формируем структуру данных
ДанныеСообщения = Новый Структура;
ДанныеСообщения.Вставить("from", "MyCompany");
ДанныеСообщения.Вставить("to", "79991234567");
ДанныеСообщения.Вставить("text", "Первая строка" + Символы.ПС + "Вторая строка");

// Сериализуем структуру в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеСообщения);
РезультатJSON = ЗаписьJSON.Закрыть();

// Теперь РезультатJSON содержит корректно экранированную строку с "\n"

Этот подход гарантирует, что сервис Infobip примет ваш запрос без ошибок, независимо от того, какие символы ввел пользователь в текст СМС.

Решение 3: Переход на HTTPСоединение вместо WinHTTP

Многие старые решения используют объект WinHttp.WinHttpRequest.5.1. Это ограничивает работу программы средой Windows и может вызвать сложности с настройкой сертификатов безопасности. Рассмотрим, как реализовать отправку через стандартный объект 1С HTTPСоединение, что сделает ваш код более надежным и универсальным.

Разберем по шагам процесс отправки:


// Настройки подключения
Сервер = "api.infobip.com";
АПИ_Ключ = "Ваш_Ключ_Авторизации";

// Создаем соединение (используем защищенное соединение OpenSSL)
НТТРСоединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());

// Подготавливаем заголовок
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "App " + АПИ_Ключ);
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("Accept", "application/json");

// Создаем запрос
НТТРЗапрос = Новый HTTPЗапрос("/sms/1/text/single", Заголовки);
НТТРЗапрос.УстановитьТелоИзСтроки(РезультатJSON, КодировкаТекста.UTF8);

// Отправляем и получаем ответ
Попытка
    Ответ = НТТРСоединение.ОтправитьДляОбъекта(НТТРЗапрос);
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("СМС успешно отправлено!");
    Иначе
        Сообщить("Ошибка отправки: " + Ответ.ПолучитьТелоИзСтроки());
    КонецЕсли;
Исключение
    Сообщить("Ошибка связи с сервером: " + ОписаниеОшибки());
КонецПопытки;

Важные нюансы при работе со СМС-сообщениями

При внедрении функционала рассылок проанализируем еще несколько важных технических моментов:

  1. Кодировка и длина сообщения. Помните, что использование кириллицы и спецсимволов (включая перенос строки) переводит СМС в кодировку Unicode. В этом случае длина одной части СМС сокращается со 160 символов (для латиницы) до 70. Перенос строки занимает 1 символ в счетчике, но делает сообщение визуально более читаемым.
  2. Транслитерация. Если бюджет на СМС ограничен, рассмотрите возможность транслитерации текста перед отправкой. Infobip поддерживает автоматическую транслитерацию на стороне сервера, что позволяет отправлять до 160 символов в одном сегменте.
  3. Имя отправителя (Sender ID). Убедитесь, что параметр from содержит зарегистрированное у операторов буквенное имя. В противном случае сообщение может быть заблокировано или заменено на стандартное имя сервиса.
  4. Смешивание алфавитов. Избегайте использования в одном слове латинских и русских букв. Системы защиты от спама у операторов связи часто блокируют такие сообщения, считая их попыткой обхода фильтров.

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

← На главную