Как передать логин и пароль в POST-запросе из 1С для получения токена?

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

При интеграции 1С с внешними веб-сервисами одна из первых задач, с которой сталкивается разработчик, — это получение токена активации или сессии. Часто в документации к API указано: «отправьте POST-запрос с логином и паролем». Однако на практике стандартные свойства объекта HTTPСоединение не всегда помогают, и запрос возвращает ошибку. В этой статье мы детально разберем, как правильно передавать параметры авторизации в зависимости от требований целевого сервера.

Различие между авторизацией соединения и параметрами запроса

Первое, что нам необходимо проанализировать, — это способ, которым сервер ожидает получить данные. Существует два принципиально разных подхода, которые часто путают начинающие разработчики:

  1. Basic Authentication (Стандартная авторизация HTTP): В этом случае логин и пароль передаются в заголовке запроса Authorization в закодированном виде. Для этого в 1С при создании объекта HTTPСоединение используются свойства Пользователь и Пароль.
  2. Передача параметров в теле (Body) запроса: Это наиболее современный метод для получения токенов (например, в OAuth2 или JWT). Здесь логин и пароль являются частью данных, передаваемых внутри самого POST-запроса.

Если вы заполнили свойства Пользователь и Пароль в HTTPСоединение, а сервер выдает ошибку 400 или 401, скорее всего, он ожидает данные именно в теле запроса. Рассмотрим подробнее, как это реализовать.

Вариант 1: Передача параметров в формате URL-encoded

Этот способ часто используется, когда API имитирует отправку обычной HTML-формы. Параметры передаются в виде строки «ключ=значение», разделенных символом амперсанда. Выясним, как сформировать такой запрос в 1С. Нам важно не забыть про кодирование спецсимволов, чтобы пароль, содержащий, например, символ «&» или «+», не «развалил» структуру запроса.

Рассмотрим пример кода для формирования такого запроса:


// 1. Создаем соединение. Для HTTPS обязательно указываем защищенное соединение.
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.service.ru", 443,,,,, Защита);

// 2. Формируем строку параметров
Логин = "my_user";
Пароль = "my_password_123";

// Важно использовать КодироватьСтроку для безопасной передачи спецсимволов
СтрокаПараметров = "login=" + КодироватьСтроку(Логин, СпособКодированияСтроки.URLДанные) + 
                   "&password=" + КодироватьСтроку(Пароль, СпособКодированияСтроки.URLДанные);

// 3. Создаем запрос
Запрос = Новый HTTPЗапрос("/auth/get_token");
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

// 4. Устанавливаем тело запроса в кодировке UTF-8
Запрос.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.UTF8);

// 5. Отправляем запрос
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Вариант 2: Передача параметров в формате JSON

Большинство современных REST-сервисов предпочитают работать с форматом JSON. В этом случае данные передаются в виде структурированного объекта. Проанализируем, как правильно упаковать логин и пароль в JSON с помощью встроенных средств платформы 1С.

Использование объектов ЗаписьJSON и Структура позволяет избежать ошибок ручного формирования строки (например, неверно поставленных кавычек или запятых).


// Подготовим данные в виде структуры
ДанныеАвторизации = Новый Структура;
ДанныеАвторизации.Вставить("login", "ваш_логин");
ДанныеАвторизации.Вставить("password", "ваш_пароль");

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

// Формируем HTTP-запрос
Запрос = Новый HTTPЗапрос("/api/v1/login");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8);

// Отправка запроса (предполагается, что Соединение уже создано)
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Важность правильных заголовков и кодировки

Одной из скрытых причин ошибок, на которые жалуются разработчики, является несоответствие кодировок. 1С внутри себя работает с кодировкой UTF-16, в то время как интернет-стандартом является UTF-8. Если при вызове метода УстановитьТелоИзСтроки не указать явно КодировкаТекста.UTF8, сервер может получить нечитаемые символы вместо пароля.

Также разберем роль заголовка Content-Type. Если вы отправляете JSON, но не указали этот заголовок, сервер может просто проигнорировать тело запроса, так как не будет знать, как его интерпретировать. Всегда проверяйте документацию API на предмет обязательных заголовков, таких как Accept или User-Agent.

Работа с защищенным соединением (HTTPS)

Поскольку логин и пароль являются конфиденциальными данными, практически все современные сервисы работают только через протокол HTTPS. Посмотрим на нюансы работы с объектом ЗащищенноеСоединениеOpenSSL. Если вы просто укажете порт 443, но не передадите этот объект в конструктор HTTPСоединение, запрос завершится ошибкой или соединение будет сброшено.

В типовых случаях достаточно создать объект без параметров: Новый ЗащищенноеСоединениеOpenSSL(). Это заставит 1С использовать системное хранилище сертификатов для проверки подлинности сервера. Если же сервер использует самоподписанный сертификат, может потребоваться дополнительная настройка параметров сертификации, иначе 1С заблокирует соединение из соображений безопасности.

Как проанализировать ошибку, если запрос не проходит

Если даже после настройки тела запроса вы получаете код состояния отличный от 200 (например, 400 или 500), необходимо изучить ответ сервера более детально. Как правило, API возвращает описание ошибки в теле ответа.

Рассмотрим, как программно получить текст ошибки в 1С:


КодСостояния = Ответ.КодСостояния;
Если КодСостояния <> 200 Тогда
    ТекстОшибки = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    Сообщить("Ошибка запроса! Код: " + КодСостояния + ". Сообщение сервера: " + ТекстОшибки);
КонецЕсли;

Часто в этом тексте содержатся подсказки: «поле password обязательно для заполнения», «неверный формат даты» или «пользователь заблокирован». Это гораздо информативнее, чем просто код ошибки 400 в Postman или 1С.

Резюме

Для успешной передачи логина и пароля в POST-запросе выполним следующие шаги:

  1. Определим формат передачи: JSON или URL-encoded.
  2. Обязательно установим заголовок Content-Type.
  3. Сформируем тело запроса, используя КодироватьСтроку для форм или ЗаписьJSON для объектов.
  4. Установим тело запроса с явным указанием кодировки UTF-8.
  5. При использовании HTTPS обязательно используем ЗащищенноеСоединениеOpenSSL.

Следуя этой методике, мы минимизируем вероятность ошибок и обеспечим стабильную работу интеграции между 1С и внешним сервисом.

← На главную