Интеграция 1С с современными маркетплейсами, такими как Rozetka, требует от разработчика понимания нюансов протокола HTTP и особенностей платформы 1С при работе с кодировками. Часто при переносе запроса из Postman в 1С возникают ошибки авторизации, даже если логин и пароль указаны верно. Разберем пошагово, как реализовать этот процесс правильно, избегая типичных ловушек.
Первое, на что следует обратить внимание — это протокол. Большинство современных сервисов работают исключительно через HTTPS. Если в 1С создать объект HTTPСоединение без указания защищенного соединения, сервер может вернуть ошибку или код перенаправления 301. Проанализируем, как правильно инициализировать соединение.
Для работы с HTTPS необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Это критически важно, так как при передаче учетных данных по открытому каналу HTTP риск перехвата паролей становится максимальным, и многие серверы (включая Rozetka) блокируют такие запросы.
// Инициализация защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();
АдресСервиса = "api.seller.rozetka.com.ua";
// Создание соединения с использованием SSL
HTTPСоединение = Новый HTTPСоединение(АдресСервиса, , , , , , Защита);
Одной из частых ошибок является попытка собрать строку JSON вручную. Рассмотрим ситуацию: если передать строку вида "username:Login, password:Pass", сервер её не примет. Тело запроса должно быть валидным JSON-объектом, заключенным в фигурные скобки, где и ключи, и строковые значения обернуты в двойные кавычки.
Рекомендуется использовать объект ЗаписьJSON, который автоматически экранирует спецсимволы и гарантирует правильную структуру документа. Выясним, как это выглядит в коде:
ДанныеЗапроса = Новый Соответствие;
ДанныеЗапроса.Вставить("username", "ВашЛогин");
ДанныеЗапроса.Вставить("password", "ВашПарольВBase64");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрJSON = ЗаписьJSON.Закрыть();
API Rozetka требует, чтобы пароль в запросе передавался в кодировке Base64. При этом важно убедиться, что перед кодированием строка пароля была преобразована в двоичные данные в правильной кодировке (обычно UTF-8). Рассмотрим функцию для корректного преобразования:
Функция СоздатьСтрокуBase64(ВходнаяСтрока) Экспорт
Птк = Новый ПотокВПамяти;
Текст = Новый ЗаписьТекста(Птк, "UTF-8"); // Важно использовать UTF-8
Текст.Записать(ВходнаяСтрока);
Текст.Закрыть();
ДД = Птк.ЗакрытьИПолучитьДвоичныеДанные();
Возврат Base64Строка(ДД);
КонецФункции
Это одна из самых коварных проблем в 1С. По умолчанию метод УстановитьТелоИзСтроки при использовании кодировки UTF-8 может добавлять в начало сообщения невидимые символы — префикс BOM. Многие веб-серверы не понимают этот префикс в теле JSON и возвращают ошибку incorrect_username_password (код 1004), даже если пароль верный.
Чтобы избежать этой проблемы, начиная с платформы 8.3.6, мы можем явно указать использование BOM. Рассмотрим, как правильно задать тело запроса:
HTTPЗапрос = Новый HTTPЗапрос("/sites/auth"); // Проверьте актуальный эндпоинт в документации
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
// Отключаем использование BOM при установке тела запроса
HTTPЗапрос.УстановитьТелоИзСтроки(СтрJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Если вы используете более ранние версии платформы, проблему можно решить через ПотокВПамяти и ДвоичныеДанные, как показано в финальном решении автора темы.
Соберем все части воедино. Проанализируем итоговый алгоритм, который гарантированно работает с API маркетплейса:
Процедура ВыполнитьАвторизациюНаРозетке()
// 1. Подготовка данных
Логин = "MyAccount";
ПарольОбычный = "MySecretPassword";
ПарольBase64 = СоздатьСтрокуBase64(ПарольОбычный);
АдресСервиса = "api.seller.rozetka.com.ua";
ПутьКАвторизации = "/sites/auth"; // Уточните путь в документации Rozetka
// 2. Формирование структуры JSON
СтруктураДанных = Новый Структура();
СтруктураДанных.Вставить("username", Логин);
СтруктураДанных.Вставить("password", ПарольBase64);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
ТелоЗапроса = ЗаписьJSON.Закрыть();
// 3. Настройка соединения и запроса
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(АдресСервиса, , , , , , Защита);
Запрос = Новый HTTPЗапрос(ПутьКАвторизации);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
// Устанавливаем тело БЕЗ BOM
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// 4. Отправка и обработка ответа
Попытка
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
Состояние = Ответ.КодСостояния;
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Если Состояние = 200 Тогда
// Успех! Парсим токен
Сообщить("Авторизация прошла успешно");
// Здесь должна быть логика извлечения токена из JSON
Иначе
Сообщить("Ошибка авторизации. Код: " + Состояние + ". Ответ: " + ТекстОтвета);
КонецЕсли;
Исключение
Сообщить("Ошибка связи с сервером: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
После получения успешного ответа (код 200) вы получите Access Token. Посмотрите на структуру ответа: обычно токен находится в поле access_token. Этот токен необходимо сохранять и передавать во всех последующих запросах к API в заголовке Authorization.
Помните:
Таким образом, мы выяснили, что секрет успешного подключения заключается в строгом соблюдении требований к протоколу HTTPS, исключении BOM из тела запроса и правильной подготовке данных в формате Base64.