Почему HTTP-запрос из 1С возвращает ошибку 403 и как это исправить?

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

При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда при отправке запроса через механизмы платформы сервер возвращает код состояния 403 (Forbidden). При этом аналогичная URL-строка, вставленная в адресную строку браузера, прекрасно работает и возвращает нужные данные. Разберем причину возникновения этой проблемы и рассмотрим способы её решения.

Выясним причину возникновения ошибки 403

Код состояния HTTP 403 свидетельствует о том, что сервер понял запрос, но отказывается его выполнять из-за ограничений доступа. Веб-серверы и средства защиты (WAF, DDoS-защита) анализируют входящие HTTP-заголовки. Если запрос поступает от стандартного HTTP-клиента 1С без указания сведений об исполняющем клиенте, защитные механизмы веб-ресурса воспринимают его как работу бота или автоматизированного скрипта и блокируют доступ.

Проанализируем основные факторы, вызывающие блокировку 403 Forbidden:

  1. Отсутствие заголовка User-Agent: По умолчанию объект HTTPЗапрос не передает информацию о браузере, что является главным маркером для большинства систем защиты.
  2. Отсутствие заглавных служебных заголовков AJAX: При обращениях к внутренним эндпоинтам (например, ajax_search) сервер может ожидать заголовок X-Requested-With со значением XMLHttpRequest.
  3. Использование открытого HTTP вместо HTTPS: Отправка запросов по незащищенному протоколу HTTP (порт 80), если сервер требует защищенного TLS-соединения.
  4. Некорректное URL-кодирование параметров: Наличие спецсимволов или кириллицы в строке запроса без использования функции КодироватьСтроку.

Установка заголовка User-Agent в 1С

Рассмотрим самое распространенное решение проблемы. Для того чтобы веб-сервер успешно принял запрос от 1С, необходимо явно передать заголовок User-Agent в объекте HTTPЗапрос.

Посмотрим на пример правильного формирования и отправки запроса:


ЗаголовкиЗапроса = Новый Соответствие;
ЗаголовкиЗапроса.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 100.0; Win64; x64)");

КодТерритории = "63";
Фамилия = "Иванов";
Имя = "Иван";
Отчество = "Иванович";
ДатаРождения = Дата(1990, 1, 1);

ТекстЗапроса = "ajax_search?system=ip&is%5Bextended%5D=1&is%5Bvariant%5D=1&is%5Bregion_id%5D%5B0%5D=" + КодТерритории 
	+ "&is%5Blast_name%5D=" + Фамилия 
	+ "&is%5Bfirst_name%5D=" + Имя 
	+ "&is%5Bpatronymic%5D=" + Отчество 
	+ "&is%5Bdate%5D=" + Формат(ДатаРождения, "ДЛФ=Д") 
	+ "&nocache=1";

Соединение = Новый HTTPСоединение("is.fssprus.ru");
Запрос = Новый HTTPЗапрос(ТекстЗапроса, ЗаголовкиЗапроса);

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

Сообщить(ТекстОтвета);

После добавления строки User-Agent сервер перестает блокировать соединение и возвращает ответ с кодом 200 (или страницу с капчей для подтверждения действия).

Дополнительные рекомендации по настройке HTTP-запросов

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

  1. Передача комплекта заголовков браузера: При работе с AJAX-запросами рекомендуется добавлять дополнительные заголовки в объект Соответствие:
    
    ЗаголовкиЗапроса.Вставить("X-Requested-With", "XMLHttpRequest");
    ЗаголовкиЗапроса.Вставить("Accept", "application/json, text/javascript, */*; q=0.01");
    
  2. Кодирование спецсимволов и кириллицы: Значения параметров GET-запроса (фамилия, имя, спецсимволы) следует обрабатывать с помощью функции КодироватьСтроку со способом кодирования СпособКодированияСтроки.URLКодирование, чтобы не нарушать структуру HTTP-пакета.
  3. Использование защищенного соединения SSL/TLS: Если сервис работает по протоколу HTTPS, при создании объекта HTTPСоединение необходимо передавать Новый ЗащищенноеСоединениеOpenSSL() в соответствующий параметр конструктора.
← На главную