При интеграции 1С с внешними сервисами, такими как InSales или другими системами через API, разработчики часто сталкиваются с необходимостью реализации Basic-авторизации. Несмотря на кажущуюся простоту, этот процесс имеет множество нюансов: от правильного формирования строки Base64 до корректной настройки объекта HTTPСоединение. В этой статье мы подробно разберем, почему возникают ошибки 401, как правильно передавать учетные данные и какие типичные ошибки мешают успешному обмену данными.
Рассмотрим ситуацию, когда разработчик пытается вручную сформировать заголовок авторизации. Типичный код выглядит следующим образом:
Basic = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(Логин + ":" + Пароль));
HTTPЗапрос = новый HTTPЗапрос(МетодЗапроса);
HTTPЗапрос.Заголовки.Вставить("Authorization:", "Basic " + Basic);
Проанализируем этот фрагмент. Здесь допущены сразу две критические ошибки, которые приводят к ответу сервера 401 Unauthorized:
Вставить при указании ключа "Authorization:" не нужно ставить двоеточие в конце строки. Платформа 1С сама добавит необходимые разделители при формировании HTTP-пакета. Правильно писать: HTTPЗапрос.Заголовки.Вставить("Authorization", "Basic " + Basic);.Получить, а не ОтправитьДляОбработки (который по умолчанию предназначен для POST-запросов).Выясним причину, по которой даже при исправленном заголовке сервер может отклонить запрос. Функция 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Зашифрованный);
Проанализируем более современный и надежный подход. Платформа 1С позволяет передавать логин и пароль непосредственно в конструктор объекта HTTPСоединение. В этом случае платформа самостоятельно сформирует все необходимые заголовки авторизации по стандарту Basic, что исключает ошибки ручного кодирования.
Посмотрим на пример кода:
// Логин и пароль передаются 3-м и 4-м параметрами
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , Таймаут, Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
Ответ = Соединение.Получить(HTTPЗапрос);
Если Ответ.КодСостояния = 200 Тогда
// Обработка успешного ответа
КонецЕсли;
Важный совет: При использовании этого метода убедитесь, что в логине и пароле нет символов кириллицы, если сервер ожидает стандартную латинскую авторизацию. Если же использование русских букв необходимо, придется вернуться к ручному формированию заголовка с явным указанием кодировки UTF-8.
Часто при выносе кода в общий модуль разработчики сталкиваются с ошибкой «Недостаточно параметров» при вызове методов или создании объектов. Разберем основные причины:
HTTPСоединение их восемь. Если вы пропускаете параметры, убедитесь, что количество запятых соответствует позиции нужного параметра. Например, Новый HTTPСоединение(Адрес,,, Пароль) — это попытка передать пароль в четвертый параметр, пропустив порт и логин.Порт должен быть числом (например, 443 для HTTPS), а не строкой. Параметр ИмяСервера не должен содержать протокол (нельзя писать "https://mysite.ru", нужно "mysite.ru").При работе с конкретными 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С следует придерживаться следующих правил:
HTTPСоединение для передачи логина и пароля.Authorization, убедитесь в отсутствии двоеточия в ключе и лишних переносов строк в значении.КодировкаТекста.UTF8 и Ложь (без BOM) при получении двоичных данных для Base64.Новый ЗащищенноеСоединениеOpenSSL().Соблюдение этих технических регламентов позволит вам избежать большинства проблем с авторизацией и сделает интеграцию 1С с внешними веб-сервисами стабильной и надежной.