Как исправить ошибку 401 Unauthorized при POST-запросе к API Kadnet в 1С

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

При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда вроде бы простой и корректный код возвращает ошибку авторизации. Одним из таких примеров является работа с сервисом Kadnet API (интегрированным с платформой СКБ Техно). При отправке POST-запроса к методу проверки кадастровых номеров система может возвращать статус-код 401 Unauthorized.

В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем типичные промахи при составлении HTTP-запросов в 1С и настроим надежное защищенное соединение с сервером.

Выясняем причину: почему возвращается ошибка 401

Статус-код 401 Unauthorized указывает на то, что сервер не смог аутентифицировать отправителя запроса. При работе с API Kadnet авторизация выполняется с помощью уникального ключа доступа (API-Key). Если сервер возвращает этот код, на это есть несколько причин:

  1. Неверный регистр параметров запроса. Веб-серверы СКБ Техно крайне чувствительны к регистру символов. Передача параметра как Api-Key вместо правильного api-key приводит к тому, что парсер сервера просто не видит переданный токен.
  2. Отсутствие безопасного соединения (SSL). Использование обычного HTTP вместо HTTPS при передаче конфиденциальных данных (таких как ключи авторизации) часто блокируется сервером или вызывает перенаправление, которое некорректно обрабатывается в 1С без явного включения SSL.
  3. Недействительный или заблокированный ключ. Сам токен может быть просрочен или не активирован для работы со специфическими методами вроде CheckNumbers.

Шаг 1. Отладка и чтение детального ответа сервера

Частой ошибкой начинающих разработчиков является анализ только числового кода ответа (например, 401 или 500). Однако современные API в теле ответа обычно присылают подробное описание проблемы в формате JSON или XML. Рассмотрим, как правильно получить это описание в 1С.

Для чтения ответа необходимо использовать метод ПолучитьТелоКакСтроку() объекта HTTPОтвет, явно указав кодировку UTF-8. Это позволит быстро понять, почему именно сервер отклонил запрос.


// Получаем тело ответа для анализа ошибки
ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку("UTF-8");
Сообщить("Ответ сервера: " + ОтветВВидеСтроки);

Если в ответе содержится сообщение вроде "Ключ не найден" или "Invalid API Key", дело точно в неверном форматировании параметров или недействительности самого токена.

Шаг 2. Исправление регистра параметра авторизации

Проанализируем строку запроса. В исходном варианте ключ передавался следующим образом:

/v2/Requests/CheckNumbers?Api-Key=f04b7bf1-320d-43f7-b906-9d7a71998c38

Согласно официальной документации API СКБ Техно, имя параметра должно быть написано строго в нижнем регистре: api-key. Исправим этот фрагмент кода:

/v2/Requests/CheckNumbers?api-key=f04b7bf1-320d-43f7-b906-9d7a71998c38

Шаг 3. Настройка защищенного соединения SSL

Передача API-ключей по открытым каналам связи крайне небезопасна. Сервис Kadnet требует обязательного использования протокола HTTPS. Чтобы реализовать это в 1С, необходимо инициализировать объект HTTPСоединение с использованием класса ЗащищенноеСоединениеOpenSSL.

Рассмотрим, как правильно настроить подключение к хосту api.kadnet.ru (или его альтернативному зеркалу api.skb-techno.ru):


// Инициализируем защищенное SSL-соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.kadnet.ru", , , , , , ЗащищенноеСоединение);

Шаг 4. Формирование тела POST-запроса и заголовков

Метод CheckNumbers предназначен для валидации кадастровых номеров. Он требует передачи данных в формате application/x-www-form-urlencoded. Это означает, что параметры тела запроса должны быть соединены знаком &, а их значения — закодированы (пройти URL-encode).

В 1С для кодирования строк используется функция КодироватьСтроку() с параметром СпособКодированияСтроки.URLEncoding. Разберем по шагам, как сформировать тело запроса:


// Параметры для отправки
КадастровыеНомера = "66:06:4501018:305;66:06:4501018:2131";
Комментарий = "тестовый прогон";

// Кодируем параметры в формат URL
ЗакодированныеНомера = КодироватьСтроку(КадастровыеНомера, СпособКодированияСтроки.URLEncoding);
ЗакодированныйКомментарий = КодироватьСтроку(Комментарий, СпособКодированияСтроки.URLEncoding);

// Собираем тело POST-запроса
ТелоЗапроса = "Query=" + ЗакодированныеНомера + "&Comment=" + ЗакодированныйКомментарий;

Полный пример корректного кода для работы с API Kadnet

Объединим все исправления в один готовый к использованию рабочий алгоритм на платформе 1С:


// Шаг 1. Определяем параметры подключения
АдресХоста = "api.kadnet.ru"; // Альтернативный вариант: api.skb-techno.ru
ApiKey = "f04b7bf1-320d-43f7-b906-9d7a71998c38"; // Укажите ваш действующий ключ

// Шаг 2. Настраиваем защищенное соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(АдресХоста, , , , , , ЗащищенноеСоединение);

// Шаг 3. Формируем заголовки HTTP-запроса
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

// Шаг 4. Формируем путь запроса (обратите внимание на нижний регистр "api-key")
ПутьКРесурсу = "/v2/Requests/CheckNumbers?api-key=" + ApiKey;

// Шаг 5. Инициализируем HTTP-запрос
Запрос = Новый HTTPЗапрос(ПутьКРесурсу, Заголовки);

// Шаг 6. Заполняем тело запроса
КадастровыеНомера = "66:06:4501018:305;66:06:4501018:2131";
Комментарий = "тестовый прогон";

ЗакодированныеНомера = КодироватьСтроку(КадастровыеНомера, СпособКодированияСтроки.URLEncoding);
ЗакодированныйКомментарий = КодироватьСтроку(Комментарий, СпособКодированияСтроки.URLEncoding);

СтрокаТела = "Query=" + ЗакодированныеНомера + "&Comment=" + ЗакодированныйКомментарий;
Запрос.УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8);

// Шаг 7. Отправляем запрос и получаем ответ
Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    КодCтатуса = Ответ.КодСостояния;
    ТелоОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
    
    Если КодCтатуса = 200 Тогда
        Сообщить("Запрос успешно обработан!");
        Сообщить("Результат: " + ТелоОтвета);
    Иначе
        Сообщить("Ошибка выполнения запроса. Код статуса: " + КодCтатуса);
        Сообщить("Детали ошибки: " + ТелоОтвета);
    КонецЕсли;
Исключение
    Сообщить("Ошибка подключения к серверу: " + ОписаниеОшибки());
КонецПопытки;

Рекомендации по дальнейшей работе и устранению неполадок

Если после внедрения защищенного соединения и исправления регистра параметра api-key вы продолжаете получать ошибку 401, рекомендуем выполнить следующие действия:

← На главную