При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда запрос в Postman отрабатывает идеально, а встроенные средства 1С возвращают ошибки 401 Unauthorized или 400 Bad Request. В этой статье мы подробно разберем, как правильно реализовать получение токена, сформировать тело запроса в формате JSON и обойти специфические проблемы платформы 1С, такие как невидимые символы BOM.
Рассмотрим типичную ситуацию: при попытке передать логин и пароль через параметры строки в формате application/x-www-form-urlencoded, сервер возвращает ошибку, утверждая, что активного пользователя не существует. Проанализируем причины. Многие современные API (например, Stubla) ориентированы на работу с JSON в теле запроса, даже если документация допускает иное. Кроме того, 1С при записи строки в тело запроса может добавлять префикс BOM (Byte Order Mark), который ломает парсер на стороне сервера.
Вместо ручной склейки строки с амперсандами, которую трудно отлаживать, используем встроенные механизмы работы с JSON. Выясним, как правильно сконструировать объект для передачи данных. Наиболее надежный способ — использование объекта ЗаписьJSON.
Разберем по шагам процесс формирования запроса:
Content-Type: application/json.Посмотрим на пример кода, который решает проблему авторизации:
// Устанавливаем защищенное соединение
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("stubla.com",,,,,,, SSL);
// Подготавливаем заголовки
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Формируем JSON тело через структуру (наиболее изящный способ)
ПараметрыАвторизации = Новый Структура;
ПараметрыАвторизации.Вставить("phone_number", Объект.Логин);
ПараметрыАвторизации.Вставить("password", Объект.Пароль);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыАвторизации);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Отправляем запрос
HTTPЗапрос = Новый HTTPЗапрос("/en/api/v1/login/", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
РезультатТекст = Ответ.ПолучитьТелоКакСтроку();
Важный момент: Обратите внимание на параметр ИспользованиеByteOrderMark.НеИспользовать в методе УстановитьТелоИзСтроки. Это критически важно для предотвращения ошибки 400 на стороне многих веб-серверов.
Как отмечают опытные разработчики, использование прямой записи через ЗаписатьНачалоОбъекта() и ЗаписатьИмяСвойства() часто избыточно. Гораздо удобнее сначала наполнить структуру 1С, а затем одной командой ЗаписатьJSON превратить ее в строку. Это делает код читаемым и снижает вероятность синтаксических ошибок в JSON-файле.
Если вы столкнулись с ошибкой JSON parse error - Unexpected UTF-8 BOM при отправке данных (особенно если вы используете УстановитьИмяФайлаТела), это означает, что файл на диске содержит метку порядка байтов. Выясним причину: 1С при сохранении текстовых файлов по умолчанию часто добавляет эти три байта (EF BB BF) в начало файла.
Чтобы избежать этой проблемы при отправке XML или JSON из файла, рекомендуется считывать файл в ДвоичныеДанные и отправлять их напрямую через HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(), предварительно убедившись, что в данных нет лишних заголовков кодировки.
После получения токена (обычно это JWT), его нужно передавать в последующих запросах. Рассмотрим типичную ошибку в формировании заголовка Authorization. Код может выглядеть так:
ЗаголовокHTTP.Вставить("Authorization", "Bearer " + Токен);
Проанализируем ситуацию: лишние пробелы между ключевым словом Bearer и самим телом токена недопустимы по стандарту RFC. Сервер может интерпретировать такой заголовок как некорректный и вернуть 401 Unauthorized. Всегда используйте ровно один пробел:
ЗаголовокHTTP.Вставить("Authorization", "Bearer " + СокрЛП(Токен));
Часто возникает путаница, когда разработчик пытается отправить XML-файл, но при этом в заголовках указывает Content-Type: application/json. Выясним: если API ожидает данные для обновления товаров, и сервер выдает ошибку JSON parse error, значит, вы обязаны передать данные именно в формате JSON. Даже если ваша внутренняя логика построена на XML, перед отправкой необходимо выполнить преобразование:
Посмотрим на пример логики преобразования данных:
// Предположим, мы прочитали данные из XML в массив "СписокТоваров"
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("products", СписокТоваров);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
ТелоЗапроса = ЗаписьJSON.Закрыть();
// Теперь отправляем как JSON
Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);
Если после всех исправлений ошибка сохраняется, воспользуйтесь следующими советами:
Объект.логин.Используя объект HTTPСоединение вместе с правильной сериализацией через ЗаписьJSON и контролем BOM, вы обеспечите надежную работу интеграции 1С с любым современным API.