При интеграции 1С с внешними сервисами рассылок, такими как infobip.com, разработчики часто сталкиваются с проблемой передачи специальных символов в тексте сообщения. Типичная ситуация: при добавлении в текст стандартного переноса строки Символы.ПС сервис возвращает ошибку BAD_REQUEST. Это происходит из-за того, что в формате JSON символ переноса строки должен быть правильно экранирован, иначе структура документа нарушается, и сервер не может его обработать.
В этой статье мы подробно разберем, как избежать подобных ошибок, проанализируем способы формирования JSON-запросов и рассмотрим переход на современные методы работы с HTTP в 1С.
Разберем ситуацию: когда мы формируем тело запроса путем простой склейки строк, символ Символы.ПС вставляется в текст как реальный разрыв строки. JSON-стандарт запрещает наличие «сырых» управляющих символов внутри строковых значений. Чтобы передать перенос строки, он должен быть заменен на специальную последовательность символов \n.
Проанализируем пример некорректного кода, который часто становится причиной ошибки:
// Ошибочный вариант склейки JSON
ТекстСообщения = "Первая строка" + Символы.ПС + "Вторая строка";
smsjson = "{
| ""from"":""MyCompany"",
| ""to"":""79991234567"",
| ""text"":""" + ТекстСообщения + """
|}";
В данном случае в переменную smsjson попадет текст с физическим переходом на новую строку, что приведет к невалидности JSON-пакета.
Самый быстрый способ исправить ошибку, если вы используете ручную сборку строки — это замена символа переноса строки на текстовое представление \n. Рассмотрим, как это сделать программно:
// Исправленный вариант с использованием замены
ТекстСообщения = "Здравствуйте!" + Символы.ПС + "Ваш заказ готов.";
ТекстДляJSON = СтрЗаменить(ТекстСообщения, Символы.ПС, "\n");
// Обратите внимание на удвоение обратного слэша, если это необходимо внутри строки 1С
smsjson = "{ ""text"": """ + ТекстДляJSON + """ }";
Этот метод работает, но он не защищает от других проблем, например, если в тексте сообщения встретятся двойные кавычки. Поэтому мы рекомендуем переходить к более надежным инструментам платформы 1С.
Начиная с версии 8.3, в 1С появились встроенные средства для работы с форматом JSON. Использование объекта ЗаписьJSON автоматически решает все проблемы с экранированием кавычек, обратных слэшей и переносов строк. Выясним, как реализовать это правильно:
// Формируем структуру данных
ДанныеСообщения = Новый Структура;
ДанныеСообщения.Вставить("from", "MyCompany");
ДанныеСообщения.Вставить("to", "79991234567");
ДанныеСообщения.Вставить("text", "Первая строка" + Символы.ПС + "Вторая строка");
// Сериализуем структуру в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеСообщения);
РезультатJSON = ЗаписьJSON.Закрыть();
// Теперь РезультатJSON содержит корректно экранированную строку с "\n"
Этот подход гарантирует, что сервис Infobip примет ваш запрос без ошибок, независимо от того, какие символы ввел пользователь в текст СМС.
Многие старые решения используют объект 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 Тогда
Сообщить("СМС успешно отправлено!");
Иначе
Сообщить("Ошибка отправки: " + Ответ.ПолучитьТелоИзСтроки());
КонецЕсли;
Исключение
Сообщить("Ошибка связи с сервером: " + ОписаниеОшибки());
КонецПопытки;
При внедрении функционала рассылок проанализируем еще несколько важных технических моментов:
from содержит зарегистрированное у операторов буквенное имя. В противном случае сообщение может быть заблокировано или заменено на стандартное имя сервиса.Таким образом, мы выяснили, что наиболее стабильным и современным способом отправки СМС из 1С является сочетание объекта ЗаписьJSON для подготовки данных и HTTPСоединение для их передачи. Это исключает ошибки синтаксиса и обеспечивает совместимость с актуальными требованиями API.