Как отправить GET-запрос с авторизацией Base64 в заголовке из 1С

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

При интеграции 1С с внешними сервисами, такими как InSales или другими системами через API, разработчики часто сталкиваются с необходимостью реализации Basic-авторизации. Несмотря на кажущуюся простоту, этот процесс имеет множество нюансов: от правильного формирования строки Base64 до корректной настройки объекта HTTPСоединение. В этой статье мы подробно разберем, почему возникают ошибки 401, как правильно передавать учетные данные и какие типичные ошибки мешают успешному обмену данными.

Разбор первой проблемы: ошибка в заголовке Authorization

Рассмотрим ситуацию, когда разработчик пытается вручную сформировать заголовок авторизации. Типичный код выглядит следующим образом:


Basic = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(Логин + ":" + Пароль)); 
HTTPЗапрос = новый HTTPЗапрос(МетодЗапроса); 
HTTPЗапрос.Заголовки.Вставить("Authorization:", "Basic " + Basic);

Проанализируем этот фрагмент. Здесь допущены сразу две критические ошибки, которые приводят к ответу сервера 401 Unauthorized:

  1. Лишнее двоеточие в ключе заголовка: В методе Вставить при указании ключа "Authorization:" не нужно ставить двоеточие в конце строки. Платформа 1С сама добавит необходимые разделители при формировании HTTP-пакета. Правильно писать: HTTPЗапрос.Заголовки.Вставить("Authorization", "Basic " + Basic);.
  2. Метод отправки: Если нам нужно получить данные (GET-запрос), следует использовать метод Получить, а не ОтправитьДляОбработки (который по умолчанию предназначен для POST-запросов).

Особенности формирования Base64 и кодировки

Выясним причину, по которой даже при исправленном заголовке сервер может отклонить запрос. Функция Base64Строка в 1С при работе с длинными данными может добавлять невидимые символы переноса строк (CRLF). Кроме того, важно учитывать кодировку текста. Рассмотрим правильный способ подготовки данных:

Во-первых, при преобразовании строки "Логин:Пароль" в двоичные данные крайне важно явно указывать кодировку UTF-8 и отключать использование маркера BOM (Byte Order Mark). Многие веб-серверы некорректно воспринимают BOM-символы в заголовках. Во-вторых, необходимо принудительно удалять переносы строк из результирующей Base64-строки.

Пример надежного формирования заголовка:


ЛогинПароль = Логин + ":" + Пароль;
// Указываем UTF8 и Ложь (без BOM)
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ЛогинПароль, КодировкаТекста.UTF8, Ложь);
BasicЗашифрованный = Base64Строка(ДвоичныеДанные);
// Удаляем возможные переносы строк
BasicЗашифрованный = СтрЗаменить(BasicЗашифрованный, Символы.ПС, "");
BasicЗашифрованный = СтрЗаменить(BasicЗашифрованный, Символы.ВК, "");

HTTPЗапрос = Новый HTTPЗапрос(Ресурс);
HTTPЗапрос.Заголовки.Вставить("Authorization", "Basic " + BasicЗашифрованный);

Использование встроенной авторизации в HTTPСоединение

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

Посмотрим на пример кода:


// Логин и пароль передаются 3-м и 4-м параметрами
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , Таймаут, Новый ЗащищенноеСоединениеOpenSSL());

HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
Ответ = Соединение.Получить(HTTPЗапрос);

Если Ответ.КодСостояния = 200 Тогда
    // Обработка успешного ответа
КонецЕсли;

Важный совет: При использовании этого метода убедитесь, что в логине и пароле нет символов кириллицы, если сервер ожидает стандартную латинскую авторизацию. Если же использование русских букв необходимо, придется вернуться к ручному формированию заголовка с явным указанием кодировки UTF-8.

Решение проблемы «Недостаточно параметров»

Часто при выносе кода в общий модуль разработчики сталкиваются с ошибкой «Недостаточно параметров» при вызове методов или создании объектов. Разберем основные причины:

  1. Параметры конструктора: У конструктора HTTPСоединение их восемь. Если вы пропускаете параметры, убедитесь, что количество запятых соответствует позиции нужного параметра. Например, Новый HTTPСоединение(Адрес,,, Пароль) — это попытка передать пароль в четвертый параметр, пропустив порт и логин.
  2. Типы данных: Параметр Порт должен быть числом (например, 443 для HTTPS), а не строкой. Параметр ИмяСервера не должен содержать протокол (нельзя писать "https://mysite.ru", нужно "mysite.ru").
  3. Контекст модуля: Если функция вызывается из обработки и находится в общем модуле, проверьте наличие флага "Сервер" и "Вызов сервера" в настройках общего модуля. Также убедитесь, что при передаче параметров из клиента на сервер все объекты могут быть сериализованы.

Дополнительные заголовки для API InSales

При работе с конкретными API, такими как InSales, одного заголовка Authorization может быть недостаточно. Сервер может требовать явного указания формата данных, которые вы хотите получить. Для этого мы рекомендуем всегда добавлять заголовки Content-Type и Accept.

Рассмотрим расширенный пример настройки запроса:


Запрос = Новый HTTPЗапрос("/admin/products.json");
Запрос.Заголовки.Вставить("Authorization", "Basic " + СформированныйBase64);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Accept", "application/json");

Ответ = Соединение.Получить(Запрос);

Если сервер возвращает ошибку, воспользуйтесь инструментами отладки, такими как Fiddler или Postman. Сравните сырой текст HTTP-пакета, который отправляет Postman (где запрос работает), с тем, что генерирует 1С. Основное внимание уделите разделу Headers (Заголовки) — наличие лишних пробелов, двоеточий или неправильная кодировка строки Base64 сразу станут заметны.

Итоги и рекомендации

Подведем итоги нашего исследования. Для успешной отправки GET-запроса с авторизацией в 1С следует придерживаться следующих правил:

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

← На главную