При интеграции 1С с внешними системами через HTTP-запросы разработчики часто сталкиваются с тем, что «на той стороне» сервер получает поврежденный JSON. Это может проявляться в виде появления лишних обратных слешей, исчезновения кавычек в значениях или ошибок парсинга. Разберем детально, почему это происходит и как правильно передавать данные.
Рассмотрим типичную ошибку, представленную в исходном сообщении. Программист формирует JSON-строку путем обычной конкатенации (склеивания) строк. На первый взгляд код кажется правильным, но он таит в себе множество опасностей:
ТекстНаПроверку = "{""guid"":""" + ГУИД + """, ""type"":" + Строка(Тип) + "}";
Запрос = Новый HTTPЗапрос(Константы.ЭИК_HTTP_Запрос.Получить);
Запрос.Заголовки.Вставить("Content-type", "application/json");
Запрос.УстановитьТелоИзСтроки(ТекстНаПроверку);
Почему это плохо? Если в переменной ГУИД или Тип окажется символ, требующий экранирования (например, случайная кавычка, перевод строки или спецсимвол), весь JSON-пакет станет невалидным. Более того, при ручной сборке легко ошибиться в количестве кавычек. Появление обратных слешей \" в логах принимающей стороны часто говорит о том, что сервер воспринял ваш объект как обычную строку и попытался её десериализовать повторно.
Для исключения ошибок форматирования проанализируем наиболее надежный способ — использование объекта ЗаписьJSON. Платформа 1С берет на себя все вопросы по расстановке кавычек, экранированию спецсимволов и соблюдению стандартов.
Разберем по шагам правильный алгоритм формирования тела запроса:
ЗаписьJSON для сериализации.
// 1. Подготавливаем данные в виде структуры
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("guid", ГУИД);
ДанныеДляОтправки.Вставить("type", Тип);
// 2. Сериализуем в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет); // Убираем лишние пробелы для экономии трафика
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
ТекстJSON = ЗаписьJSON.Закрыть();
// 3. Формируем запрос
Запрос = Новый HTTPЗапрос(Путь);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Выясним причину, по которой сервер может «не видеть» кавычки или выдавать ошибку структуры. В 1С метод УстановитьТелоИзСтроки по умолчанию может добавлять в начало сообщения невидимые символы BOM (метка порядка байтов). Многие современные веб-серверы (на Python, Go, Node.js) не ожидают увидеть эти символы в JSON-потоке. В результате парсер сервера «спотыкается» на первом же байте, и данные интерпретируются некорректно.
Важный момент: Всегда явно указывайте третий параметр в методе УстановитьТелоИзСтроки. Используйте системное перечисление ИспользованиеByteOrderMark.НеИспользовать. Это гарантирует, что в поток уйдет только чистый текст JSON.
Иногда принимающая сторона требует строгого соблюдения регистра или наличия указания кодировки прямо в заголовке Content-Type. Проанализируем, как сделать запрос максимально совместимым:
Content-Type (с большой буквы, через дефис).charset=utf-8, если сервер возвращает ошибки кодировки.text/plain, но только в целях диагностики.Если программный код кажется верным, но ошибка сохраняется, необходимо перехватить «сырой» пакет данных. Рассмотрим инструменты, которые помогут нам в этом:
Проанализируем ситуацию, когда в логах сервера вы видите \"guid\". Это часто случается, если на стороне сервера данные принимаются сначала как «строка», а потом эта строка еще раз преобразуется в JSON. В 1С такая ситуация возникает, если вы ошибочно передаете уже готовую JSON-строку внутрь функции, которая сама делает ЗаписатьJSON. Убедитесь, что вы сериализуете объект только один раз.
Подведем итог: Для стабильной работы HTTP-интеграций в 1С следует отказаться от ручного формирования строк в пользу объекта ЗаписьJSON, всегда отключать BOM при установке тела запроса и проверять финальный пакет через сторонние сервисы отладки типа Webhook.site.