Как получить токен для API через HTTP-соединение в 1С и избежать ошибок 401 и 400

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

При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда запрос в Postman отрабатывает идеально, а встроенные средства 1С возвращают ошибки 401 Unauthorized или 400 Bad Request. В этой статье мы подробно разберем, как правильно реализовать получение токена, сформировать тело запроса в формате JSON и обойти специфические проблемы платформы 1С, такие как невидимые символы BOM.

Анализ проблемы: почему стандартный подход может не работать

Рассмотрим типичную ситуацию: при попытке передать логин и пароль через параметры строки в формате application/x-www-form-urlencoded, сервер возвращает ошибку, утверждая, что активного пользователя не существует. Проанализируем причины. Многие современные API (например, Stubla) ориентированы на работу с JSON в теле запроса, даже если документация допускает иное. Кроме того, 1С при записи строки в тело запроса может добавлять префикс BOM (Byte Order Mark), который ломает парсер на стороне сервера.

Решение 1: Переход на формат JSON и правильное формирование тела

Вместо ручной склейки строки с амперсандами, которую трудно отлаживать, используем встроенные механизмы работы с JSON. Выясним, как правильно сконструировать объект для передачи данных. Наиболее надежный способ — использование объекта ЗаписьJSON.

Разберем по шагам процесс формирования запроса:

  1. Создаем защищенное соединение SSL, так как большинство API работают по протоколу HTTPS.
  2. Указываем заголовок Content-Type: application/json.
  3. Сериализуем данные (логин и пароль) в 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 на стороне многих веб-серверов.

Решение 2: Использование структуры для чистоты кода

Как отмечают опытные разработчики, использование прямой записи через ЗаписатьНачалоОбъекта() и ЗаписатьИмяСвойства() часто избыточно. Гораздо удобнее сначала наполнить структуру 1С, а затем одной командой ЗаписатьJSON превратить ее в строку. Это делает код читаемым и снижает вероятность синтаксических ошибок в JSON-файле.

Устранение ошибки Unexpected UTF-8 BOM при отправке файлов

Если вы столкнулись с ошибкой JSON parse error - Unexpected UTF-8 BOM при отправке данных (особенно если вы используете УстановитьИмяФайлаТела), это означает, что файл на диске содержит метку порядка байтов. Выясним причину: 1С при сохранении текстовых файлов по умолчанию часто добавляет эти три байта (EF BB BF) в начало файла.

Чтобы избежать этой проблемы при отправке XML или JSON из файла, рекомендуется считывать файл в ДвоичныеДанные и отправлять их напрямую через HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(), предварительно убедившись, что в данных нет лишних заголовков кодировки.

Правильная настройка заголовка Authorization

После получения токена (обычно это JWT), его нужно передавать в последующих запросах. Рассмотрим типичную ошибку в формировании заголовка Authorization. Код может выглядеть так:

ЗаголовокHTTP.Вставить("Authorization", "Bearer " + Токен);

Проанализируем ситуацию: лишние пробелы между ключевым словом Bearer и самим телом токена недопустимы по стандарту RFC. Сервер может интерпретировать такой заголовок как некорректный и вернуть 401 Unauthorized. Всегда используйте ровно один пробел:

ЗаголовокHTTP.Вставить("Authorization", "Bearer " + СокрЛП(Токен));

Работа с форматами: XML vs JSON

Часто возникает путаница, когда разработчик пытается отправить XML-файл, но при этом в заголовках указывает Content-Type: application/json. Выясним: если API ожидает данные для обновления товаров, и сервер выдает ошибку JSON parse error, значит, вы обязаны передать данные именно в формате JSON. Даже если ваша внутренняя логика построена на XML, перед отправкой необходимо выполнить преобразование:

  1. Прочитать XML-файл в структуру или таблицу значений 1С.
  2. Сформировать из этих данных массив структур.
  3. Сериализовать полученный массив в JSON.

Посмотрим на пример логики преобразования данных:


// Предположим, мы прочитали данные из XML в массив "СписокТоваров"
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("products", СписокТоваров);

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
ТелоЗапроса = ЗаписьJSON.Закрыть();

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

Дополнительные рекомендации по отладке

Если после всех исправлений ошибка сохраняется, воспользуйтесь следующими советами:

Используя объект HTTPСоединение вместе с правильной сериализацией через ЗаписьJSON и контролем BOM, вы обеспечите надежную работу интеграции 1С с любым современным API.

← На главную