Почему возникает ошибка 403 при GET и POST запросах к API ФССП из 1С и как её исправить?

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

При интеграции платформы 1С с внешними REST API государственных сервисов (в частности, ФССП) разработчики часто сталкиваются со ситуацией: запрос через COM-объект WinHttp.WinHttpRequest или cURL проходит успешно, однако при использовании штатного объекта HTTPСоединение сервер возвращает HTTP-код ответа 403 Forbidden (Доступ к ресурсу запрещен).

В этой статье мы подробно проанализируем причины такого поведения сетевого стека 1С, выясним, почему веб-серверы и защитные экраны (WAF) блокируют обращения из программы, и разберем правильные варианты реализации GET и POST запросов.

Главная причина ошибки 403: Блокировка заголовка User-Agent

Проанализируем сетевой трафик, который генерирует платформа 1С при работе с объектом HTTPЗапрос. По умолчанию встроенный HTTP-клиент 1С автоматически подставляет в HTTP-заголовки идентификатор своего клиентского приложения вида User-Agent: 1C+Enterprise.

Серверы защиты и балансировщики нагрузки (например, Nginx или межсетевые экраны государственного ресурса api-ip.fssprus.ru) настраиваются на фильтрацию автоматических ботов и парсеров. Если в заголовке передан клиент 1C+Enterprise, система безопасности расценивает такой запрос как нежелательный и мгновенно отклоняет его с кодом 403.

Для решения этой проблемы необходимо явно переопределить заголовок User-Agent в объекте HTTPЗапрос, указав любое нейтральное значение (например, строку, имитирующую обращение из браузера).

Вторая ошибка: Некорректная передача параметров в GET-запросах

Ещё одна распространенная ошибка при отправке GET-запросов из 1С — попытка передать параметры через метод УстановитьТелоИзСтроки(). Согласно спецификации протокола HTTP и реализации сетевого стека 1С, тело в GET-запросах не передаётся и игнорируется сервером.

Все параметры для GET-запроса должны формироваться строго в строке URL и присваиваться свойству АдресРесурса объекта HTTPЗапрос.

Пошаговое решение для GET-запроса

Рассмотрим, как правильно сформировать GET-запрос к API ФССП (например, к эндпоинту физических лиц) с защитой от блокировки 403.

  1. Формируем строку URL вместе с параметрами запроса (токен авторизации, ФИО, дата рождения, регион).
  2. Создаем объект HTTPЗапрос и задаем ему свойство АдресРесурса.
  3. Устанавливаем заголовок User-Agent со значением стандартного браузера.
  4. Создаем защищенное соединение через ЗащищенноеСоединениеOpenSSL.
  5. Выполняем метод Получить() у объекта HTTPСоединение.

Пример корректного кода для GET-запроса:


Сервер = "api-ip.fssprus.ru";
Ресурс = "/api/v1.0/search/physical";
СтрокаПараметров = "?token=ZHtMJ2L0GOE3®ion=0&firstname=%D0%9A%D0%98%D0%A0%D0%98%D0%9B%D0%9B&secondname=%D0%98%D0%93%D0%9E%D0%A0%D0%95%D0%92%D0%98%D0%A7&lastname=%D0%9C%D0%98%D0%A2%D0%A0%D0%9E%D0%A4%D0%90%D0%9D%D0%9E%D0%92&birthdate=08.04.1981";

HTTPЗапрос = Новый HTTPЗапрос;
HTTPЗапрос.АдресРесурса = Ресурс + СтрокаПараметров;

// Ключевой момент: переопределяем User-Agent, чтобы избежать блокировки 403
HTTPЗапрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");

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

ОтветHTTP = HTTP.Получить(HTTPЗапрос);

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

Пошаговое решение для POST-запроса (групповой поиск)

Для группового поиска или отправки сложных данных используется метод POST. В этом случае параметры передаются в теле запроса в формате JSON.

  1. Подготавливаем строку JSON с токеном и массивом параметров поиска.
  2. Инициализируем HTTPЗапрос и помещаем JSON-строку в тело вызовом метода УстановитьТелоИзСтроки() с указанием кодировки UTF-8.
  3. Устанавливаем заголовки Content-Type, accept и правильный User-Agent.
  4. Отправляем запрос с помощью метода ОтправитьДляОбработки() или POST().

Пример корректного кода для POST-запроса:


Сервер = "api-ip.fssprus.ru";
Ресурс = "/api/v1.0/search/group";

СтрокаJSON = "{
|	""token"": ""ZHtMJ2L0GOE3"",
|	""request"": [
|		{
|			""type"": 1,
|			""params"": {
|				""firstname"": ""КИРИЛЛ"",
|				""lastname"": ""МИТРОФАНОВ"",
|				""secondname"": """",
|				""region"": ""0"",
|				""birthdate"": """"
|			}
|		}
|	]
|}";

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

HTTPЗапрос.Заголовки.Вставить("accept", "application/json");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");

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

ИмяВыходногоФайла = ПолучитьИмяВременногоФайла();
ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос, ИмяВыходногоФайла);

КодСостояния = ОтветHTTP.КодСостояния;

Особенности работы с асинхронным API ФССП

Разберем важные нюансы работы с сервисом ФССП после успешного выполнения запросов:

← На главную