Как исправить ошибку 58 («Незавершенная регистрация») при работе с API Яндекс.Директа из 1С?

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

При интеграции конфигураций 1С с сервисами Яндекс.Директа по протоколу OAuth 2.0 разработчики нередко сталкиваются с ситуацией, когда доступ к API в интерфейсе уже получен и подтвержден, но при выполнении тестового запроса сервер возвращает ошибку:

{"error":{"error_detail":"Необходимо заполнить для приложения заявку на доступ в интерфейсе Директа и дождаться её подтверждения","error_string":"Незавершенная регистрация","error_code":"58"}}

Разберем причины возникновения этой ошибки и выясним, как правильно составить HTTP-запрос в 1С для успешного взаимодействия с API Директа версии 5.

Анализ причин ошибки 58

Текст ошибки указывает на незавершенную регистрацию приложения, однако на практике причин такого поведения сервиса может быть несколько:

  1. Отсутствие заголовка Client-Login: если OAuth-токен получен аккаунтом агентства или управляющей компании, обращение к методам управления данными клиентов без заголовка Client-Login воспринимается API как попытка выполнить операцию от имени самого агентства. Если у агентского логина нет собственных рекламных кампаний, сервис выдает ошибку 58.
  2. Некорректная структура JSON-запроса: протокол API Директа версии 5 требует обязательного наличия структуры {"method": "...", "params": {...}}. Даже для методов без входных параметров поле params должно передаваться как пустой JSON-объект {}. Пропуск данного блока приводит к сбою обработки контекста запроса.
  3. Несоответствие тестового и рабочего контура: если доступ одобрен только для песочницы, обращение к боевому серверу api.direct.yandex.com вместо api-sandbox.direct.yandex.com вызовет отказ в доступе.
  4. Устаревший OAuth-токен: если приложение пересоздавалось в личном кабинете или менялся набор прав (Scope), старый токен становится недействительным для API Директа, даже если заявка подтверждена.

Рабочее решение: формирование корректного HTTP-запроса

Посмотрим на рабочий вариант отправки запроса в 1С, который решает проблему. Для этого добавим в заголовки логин клиента и скорректируем структуру передаваемого JSON-пакета:


КодировкаТекст = "UTF-8";
ТекстЗапроса = "{
|""method"":""checkDictionaries"",
|""params"":{}
|}";

Ресурс = "/json/v5/changes";
Сервер = "api.direct.yandex.com";

Защита = Новый ЗащищенноеСоединениеOpenSSL();
HttpСоединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен);
Заголовки.Вставить("Accept-Language", "ru");
Заголовки.Вставить("Client-Login", Логин);
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

HttpЗапрос = Новый HTTPЗапрос(Ресурс, Заголовки);
HttpЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса, КодировкаТекста.UTF8);

мОтвет = HttpСоединение.ОтправитьДляОбработки(HttpЗапрос);
Результат = мОтвет.ПолучитьТелоКакСтроку();

Рекомендации по интеграции 1С с API Яндекс.Директа

Разберем по шагам ключевые детали, которые позволят избежать ошибок при разработке сетевого обмена:

  1. Передача метода запроса: в 1С для выполнения POST-запросов можно использовать как HttpСоединение.ОтправитьДляОбработки(HttpЗапрос), так и метод HttpСоединение.Post(HttpЗапрос). Второй вариант более нагляден в программном коде.
  2. Инициализация SSL/TLS: современные версии веб-сервисов требуют защищенного протокола TLS версии 1.2 или выше. В 1С рекомендуется инициализировать соединение с использованием объекта ЗащищенноеСоединениеOpenSSL с явным указанием порта 443.
  3. Кодировка данных: используйте стандартный UTF-8 вместо устаревших или проприетарных форматов вроде CESU-8. При установке тела из строки применяйте значение системного перечисления КодировкаТекста.UTF8.
  4. Заголовок Host: платформа 1С автоматически подставляет заголовок Host на основании имени хоста, указанного при создании HTTPСоединение. Вручную добавлять его в коллекцию заголовков не требуется во избежание дублирования заголовка в HTTP-пакете.
  5. Проверка ответа сервера: API Яндекс.Директа может возвращать код состояния 200 OK даже при наличии логических ошибок авторизации или валидации. Обязательно десериализуйте тело ответа и проверяйте наличие секции error перед дальнейшей обработкой данных.
  6. Контроль баллов API: отслеживайте заголовок ответа Units, в котором передается информация об остатке доступных баллов и суточном лимите обращения к сервису.
← На главную