При интеграции 1С с внешними веб-сервисами одна из первых задач, с которой сталкивается разработчик, — это получение токена активации или сессии. Часто в документации к API указано: «отправьте POST-запрос с логином и паролем». Однако на практике стандартные свойства объекта HTTPСоединение не всегда помогают, и запрос возвращает ошибку. В этой статье мы детально разберем, как правильно передавать параметры авторизации в зависимости от требований целевого сервера.
Первое, что нам необходимо проанализировать, — это способ, которым сервер ожидает получить данные. Существует два принципиально разных подхода, которые часто путают начинающие разработчики:
Authorization в закодированном виде. Для этого в 1С при создании объекта HTTPСоединение используются свойства Пользователь и Пароль.Если вы заполнили свойства Пользователь и Пароль в HTTPСоединение, а сервер выдает ошибку 400 или 401, скорее всего, он ожидает данные именно в теле запроса. Рассмотрим подробнее, как это реализовать.
Этот способ часто используется, когда 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. Отправляем запрос
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Большинство современных 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. Посмотрим на нюансы работы с объектом ЗащищенноеСоединениеOpenSSL. Если вы просто укажете порт 443, но не передадите этот объект в конструктор HTTPСоединение, запрос завершится ошибкой или соединение будет сброшено.
В типовых случаях достаточно создать объект без параметров: Новый ЗащищенноеСоединениеOpenSSL(). Это заставит 1С использовать системное хранилище сертификатов для проверки подлинности сервера. Если же сервер использует самоподписанный сертификат, может потребоваться дополнительная настройка параметров сертификации, иначе 1С заблокирует соединение из соображений безопасности.
Если даже после настройки тела запроса вы получаете код состояния отличный от 200 (например, 400 или 500), необходимо изучить ответ сервера более детально. Как правило, API возвращает описание ошибки в теле ответа.
Рассмотрим, как программно получить текст ошибки в 1С:
КодСостояния = Ответ.КодСостояния;
Если КодСостояния <> 200 Тогда
ТекстОшибки = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Сообщить("Ошибка запроса! Код: " + КодСостояния + ". Сообщение сервера: " + ТекстОшибки);
КонецЕсли;
Часто в этом тексте содержатся подсказки: «поле password обязательно для заполнения», «неверный формат даты» или «пользователь заблокирован». Это гораздо информативнее, чем просто код ошибки 400 в Postman или 1С.
Для успешной передачи логина и пароля в POST-запросе выполним следующие шаги:
КодироватьСтроку для форм или ЗаписьJSON для объектов.Следуя этой методике, мы минимизируем вероятность ошибок и обеспечим стабильную работу интеграции между 1С и внешним сервисом.