При интеграции платформы 1С с внешними REST API государственных сервисов (в частности, ФССП) разработчики часто сталкиваются со ситуацией: запрос через COM-объект WinHttp.WinHttpRequest или cURL проходит успешно, однако при использовании штатного объекта HTTPСоединение сервер возвращает HTTP-код ответа 403 Forbidden (Доступ к ресурсу запрещен).
В этой статье мы подробно проанализируем причины такого поведения сетевого стека 1С, выясним, почему веб-серверы и защитные экраны (WAF) блокируют обращения из программы, и разберем правильные варианты реализации GET и POST запросов.
Проанализируем сетевой трафик, который генерирует платформа 1С при работе с объектом HTTPЗапрос. По умолчанию встроенный HTTP-клиент 1С автоматически подставляет в HTTP-заголовки идентификатор своего клиентского приложения вида User-Agent: 1C+Enterprise.
Серверы защиты и балансировщики нагрузки (например, Nginx или межсетевые экраны государственного ресурса api-ip.fssprus.ru) настраиваются на фильтрацию автоматических ботов и парсеров. Если в заголовке передан клиент 1C+Enterprise, система безопасности расценивает такой запрос как нежелательный и мгновенно отклоняет его с кодом 403.
Для решения этой проблемы необходимо явно переопределить заголовок User-Agent в объекте HTTPЗапрос, указав любое нейтральное значение (например, строку, имитирующую обращение из браузера).
Ещё одна распространенная ошибка при отправке GET-запросов из 1С — попытка передать параметры через метод УстановитьТелоИзСтроки(). Согласно спецификации протокола HTTP и реализации сетевого стека 1С, тело в GET-запросах не передаётся и игнорируется сервером.
Все параметры для GET-запроса должны формироваться строго в строке URL и присваиваться свойству АдресРесурса объекта HTTPЗапрос.
Рассмотрим, как правильно сформировать GET-запрос к API ФССП (например, к эндпоинту физических лиц) с защитой от блокировки 403.
HTTPЗапрос и задаем ему свойство АдресРесурса.User-Agent со значением стандартного браузера.ЗащищенноеСоединениеOpenSSL.Получить() у объекта 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. В этом случае параметры передаются в теле запроса в формате JSON.
HTTPЗапрос и помещаем JSON-строку в тело вызовом метода УстановитьТелоИзСтроки() с указанием кодировки UTF-8.Content-Type, accept и правильный User-Agent.ОтправитьДляОбработки() или 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.КодСостояния;
Разберем важные нюансы работы с сервисом ФССП после успешного выполнения запросов:
task.task необходимо сделать паузу (3–5 секунд) и отправить GET-запрос к эндпоинту `/result?token=ВАШ_ТОКЕН&task=ИД_ЗАДАЧИ`.