При разработке интеграций в системе «1С:Предприятие», особенно когда речь идет о мобильной платформе, разработчики часто сталкиваются с загадочным поведением: один и тот же код прекрасно работает на эмуляторе Windows, но при переносе на реальное мобильное устройство (Android или iOS) сервер перестает получать данные из тела запроса. Разберем эту ситуацию подробно, выясним причины и рассмотрим правильные способы передачи данных.
Рассмотрим типичный пример кода, который часто приводит к ошибке. Программист пытается передать структуру данных, сериализованную в JSON, через обычный запрос HTTPЗапрос с использованием метода Получить() (соответствует HTTP-методу GET):
// Пример ошибочного подхода
Запрос = Новый HTTPЗапрос;
Запрос.АдресРесурса = СтруктураАдреса.Путь;
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("Номер", НомерДокумента);
СтруктураЗапроса.Вставить("Год", ГодДокумента);
// Записываем JSON в тело запроса
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, СтруктураЗапроса);
СтрокаТела = Запись.Закрыть();
Запрос.УстановитьТелоИзСтроки(СтрокаТела);
Соединение = Новый HTTPСоединение(СтруктураАдреса.Сервер, , Пользователь, Пароль);
// Отправка методом GET
Результат = Соединение.Получить(Запрос);
Проблема заключается в том, что на стороне сервера команда ПолучитьТелоКакСтроку() для такого запроса вернет пустую строку, хотя в коде 1С тело было явно установлено. Проанализируем, почему это происходит.
Основная причина кроется в строгом следовании стандартам HTTP и официальной документации 1С. В Синтаксис-помощнике для метода УстановитьТелоИзСтроки() или при описании HTTPЗапрос прямо указано: «При использовании метода GET тело запроса на сервер отправлено не будет».
Возникает логичный вопрос: почему же это работало на эмуляторе или в тонком клиенте на Windows? Выясним причину:
body отсекается еще до того, как запрос покинет устройство.Самый правильный и надежный способ передать сложную структуру данных (JSON, XML) — это использование метода POST. В терминах встроенного языка 1С это метод ОтправитьДляОбработки() объекта HTTPСоединение. Проанализируем исправленный код:
// Правильный способ передачи тела запроса
Запрос = Новый HTTPЗапрос;
Запрос.АдресРесурса = СтруктураАдреса.Путь;
Запрос.Заголовки.Вставить("Content-Type", "application/json");
// Подготовка JSON данных
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
Запрос.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
Соединение = Новый HTTPСоединение(СтруктураАдреса.Сервер);
// Используем POST вместо GET
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Важный нюанс: Не забудьте указать заголовок Content-Type, чтобы сервер понимал, как интерпретировать полученные байты. Без этого заголовка даже с методом POST могут возникнуть проблемы при получении данных на стороне веб-сервиса.
Если архитектура вашего API жестко требует использования метода GET, то данные необходимо передавать не в теле, а в строке запроса (Query Parameters). Рассмотрим, как это реализовать:
// Формируем строку параметров
ПараметрыСтрокой = "nomer=" + НомерДокумента + "&god=" + ГодДокумента;
АдресСПараметрами = СтруктураАдреса.Путь + "?" + ПараметрыСтрокой;
Запрос = Новый HTTPЗапрос(АдресСПараметрами);
Соединение = Новый HTTPСоединение(СтруктураАдреса.Сервер);
// Теперь GET запрос не имеет тела, данные в URL
Результат = Соединение.Получить(Запрос);
Посмотрим на ограничения этого метода:
КодироватьСтроку() с параметром СпособКодированияСтроки.URLДанные.При работе с мобильной платформой 1С всегда придерживайтесь следующих правил, чтобы избежать «сюрпризов» при переносе кода с ПК на устройство:
GET и DELETE.POST (ОтправитьДляОбработки) или PUT (Записать).Content-Type в заголовках запроса.PATCH.Таким образом, «проблема» пустого тела — это не ошибка платформы, а принудительное соблюдение стандартов, которое обеспечивает стабильную работу приложения в реальных мобильных сетях.