При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда вроде бы простой и корректный код возвращает ошибку авторизации. Одним из таких примеров является работа с сервисом Kadnet API (интегрированным с платформой СКБ Техно). При отправке POST-запроса к методу проверки кадастровых номеров система может возвращать статус-код 401 Unauthorized.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем типичные промахи при составлении HTTP-запросов в 1С и настроим надежное защищенное соединение с сервером.
Статус-код 401 Unauthorized указывает на то, что сервер не смог аутентифицировать отправителя запроса. При работе с API Kadnet авторизация выполняется с помощью уникального ключа доступа (API-Key). Если сервер возвращает этот код, на это есть несколько причин:
Api-Key вместо правильного api-key приводит к тому, что парсер сервера просто не видит переданный токен.CheckNumbers.Частой ошибкой начинающих разработчиков является анализ только числового кода ответа (например, 401 или 500). Однако современные API в теле ответа обычно присылают подробное описание проблемы в формате JSON или XML. Рассмотрим, как правильно получить это описание в 1С.
Для чтения ответа необходимо использовать метод ПолучитьТелоКакСтроку() объекта HTTPОтвет, явно указав кодировку UTF-8. Это позволит быстро понять, почему именно сервер отклонил запрос.
// Получаем тело ответа для анализа ошибки
ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку("UTF-8");
Сообщить("Ответ сервера: " + ОтветВВидеСтроки);
Если в ответе содержится сообщение вроде "Ключ не найден" или "Invalid API Key", дело точно в неверном форматировании параметров или недействительности самого токена.
Проанализируем строку запроса. В исходном варианте ключ передавался следующим образом:
/v2/Requests/CheckNumbers?Api-Key=f04b7bf1-320d-43f7-b906-9d7a71998c38
Согласно официальной документации API СКБ Техно, имя параметра должно быть написано строго в нижнем регистре: api-key. Исправим этот фрагмент кода:
/v2/Requests/CheckNumbers?api-key=f04b7bf1-320d-43f7-b906-9d7a71998c38
Передача API-ключей по открытым каналам связи крайне небезопасна. Сервис Kadnet требует обязательного использования протокола HTTPS. Чтобы реализовать это в 1С, необходимо инициализировать объект HTTPСоединение с использованием класса ЗащищенноеСоединениеOpenSSL.
Рассмотрим, как правильно настроить подключение к хосту api.kadnet.ru (или его альтернативному зеркалу api.skb-techno.ru):
// Инициализируем защищенное SSL-соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.kadnet.ru", , , , , , ЗащищенноеСоединение);
Метод CheckNumbers предназначен для валидации кадастровых номеров. Он требует передачи данных в формате application/x-www-form-urlencoded. Это означает, что параметры тела запроса должны быть соединены знаком &, а их значения — закодированы (пройти URL-encode).
В 1С для кодирования строк используется функция КодироватьСтроку() с параметром СпособКодированияСтроки.URLEncoding. Разберем по шагам, как сформировать тело запроса:
// Параметры для отправки
КадастровыеНомера = "66:06:4501018:305;66:06:4501018:2131";
Комментарий = "тестовый прогон";
// Кодируем параметры в формат URL
ЗакодированныеНомера = КодироватьСтроку(КадастровыеНомера, СпособКодированияСтроки.URLEncoding);
ЗакодированныйКомментарий = КодироватьСтроку(Комментарий, СпособКодированияСтроки.URLEncoding);
// Собираем тело POST-запроса
ТелоЗапроса = "Query=" + ЗакодированныеНомера + "&Comment=" + ЗакодированныйКомментарий;
Объединим все исправления в один готовый к использованию рабочий алгоритм на платформе 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, рекомендуем выполнить следующие действия:
api.kadnet.ru, замените его в коде на api.skb-techno.ru. Все пути запросов и параметры при этом останутся прежними.CheckNumbers ожидает данные строго в кодировке UTF-8. Принудительное указание кодировки в методе УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8) гарантирует корректную интерпретацию кириллических символов (например, в поле комментария) на стороне сервера.