При реализации интеграции 1С 7.7 с современными маркетплейсами, такими как Ozon, программисты часто сталкиваются с техническими сложностями, обусловленными почтенным возрастом платформы и строгими требованиями современных REST API. Одной из самых распространенных проблем является ошибка 405 (Method Not Allowed). В этой статье мы подробно разберем, почему она возникает, как правильно настроить объект WinHttpRequest и какие дополнительные нюансы нужно учесть, чтобы обмен данными заработал корректно.
Ошибка 405 Method Not Allowed означает, что сервер (в данном случае Ozon API) понимает запрос к конкретному адресу (URL), но отказывается выполнять его, так как использован неверный HTTP-метод. Рассмотрим ситуацию: в коде 1С 7.7 мы пытаемся получить список товаров с помощью метода GET, однако документация Ozon API прямо указывает, что практически все операции, включая получение данных, должны выполняться через метод POST.
Это происходит потому, что даже для простого получения списка товаров серверу может потребоваться передать фильтры или параметры пагинации в теле запроса в формате JSON. Протокол GET не подразумевает передачу тела запроса (body), поэтому разработчики API Ozon закрепили использование POST для обеспечения универсальности интерфейса.
Для исправления ошибки проанализируем начальный этап инициализации HTTP-соединения. Вместо привычного GET необходимо использовать POST. Также важно правильно указать полный путь к методу API.
Рассмотрим правильный вариант инициализации объекта:
пОбъект = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
// Используем актуальный домен и метод POST
СтрокаМетода = "https://api-seller.ozon.ru/v1/product/list";
пОбъект.Open("POST", СтрокаМетода, 0);
Обратите внимание на протокол: крайне рекомендуется использовать https вместо http, так как передача секретных ключей Api-Key по незашифрованному каналу является угрозой безопасности.
Для успешной авторизации и обработки запроса сервером необходимо передать правильный набор заголовков. Разберем основные из них:
application/json, так как мы передаем данные в формате JSON.В коде 1С 7.7 это выглядит следующим образом:
пОбъект.setRequestHeader("Client-Id", СокрЛП(ClientId));
пОбъект.setRequestHeader("Api-Key", СокрЛП(APIKEY));
пОбъект.setRequestHeader("Content-Type", "application/json");
Поскольку мы сменили метод на POST, сервер ожидает получить данные в теле запроса. Даже если вам не нужно применять фильтры и вы хотите получить полный список, вы обязаны отправить хотя бы пустой JSON-объект, представленный фигурными скобками {}.
Проанализируем пример отправки запроса:
ТекстЗапросаДжейСон = "{}";
Попытка
пОбъект.Send(ТекстЗапросаДжейСон);
Статус = пОбъект.Status;
Описание = пОбъект.StatusText;
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Если после этого изменения вы получили статус 200 OK, значит, основная проблема решена. Однако для полноценной работы в 1С 7.7 этого недостаточно.
Платформа 1С 7.7 работает в кодировке Windows-1251. В то же время API Ozon требует данные только в UTF-8. Если ваш JSON-запрос содержит только цифры и латиницу (как пустые скобки {}), запрос пройдет. Но как только вы добавите в фильтр русское название товара, сервер вернет ошибку 400 Bad Request.
Для преобразования строк в UTF-8 перед отправкой и обратно при получении ответа рекомендуется использовать объект ADODB.Stream. Разберем функцию для конвертации:
Функция ANSItoUTF8(Текст)
Stream = СоздатьОбъект("ADODB.Stream");
Stream.Type = 2; // adTypeText
Stream.Charset = "windows-1251";
Stream.Open();
Stream.WriteText(Текст);
Stream.Position = 0;
Stream.Charset = "utf-8";
Результат = Stream.ReadText();
Stream.Close();
Возврат Результат;
КонецФункции
Современные сервера Ozon блокируют соединения по устаревшим протоколам TLS 1.0 и 1.1. Если ваша 1С 7.7 запущена на старой версии Windows, вы можете столкнуться с ошибкой установления защищенного соединения. Чтобы принудительно заставить WinHttpRequest использовать TLS 1.2, необходимо установить специальную опцию перед отправкой запроса:
пОбъект.Option(9) = 2048; // Включение TLS 1.2
Эта настройка критически важна для работы с https на системах, где этот протокол не является приоритетным по умолчанию.
При получении ответа от API через свойство пОбъект.ResponseText в 1С 7.7 вы, скорее всего, увидите "кракозябры" вместо кириллицы. Это происходит из-за того, что объект пытается интерпретировать UTF-8 как ANSI. Чтобы получить читаемые данные, нужно работать с двоичным телом ответа ResponseBody.
Рассмотрим правильный алгоритм получения данных:
пОбъект.ResponseBody.ADODB.Stream.Пример кода для обработки ответа:
ДанныеБайт = пОбъект.ResponseBody;
Stream = СоздатьОбъект("ADODB.Stream");
Stream.Type = 1; // binary
Stream.Open();
Stream.Write(ДанныеБайт);
Stream.Position = 0;
Stream.Type = 2; // text
Stream.Charset = "utf-8";
ТекстОтвета = Stream.ReadText();
Stream.Close();
Сообщить(ТекстОтвета);
Интеграция 1С 7.7 с Ozon API требует внимательного отношения к деталям, которые в более новых версиях 1С (8.3) обрабатываются автоматически. Подведем итоги:
WinHttpRequest.ADODB.Stream.Следуя этим правилам, вы сможете построить надежную систему обмена данными между вашей учетной системой на базе 1С 7.7 и маркетплейсом.