Как правильно отправить GET-запрос из 1С и передать параметры в URL?

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

Работа с внешними веб-сервисами через HTTP-запросы — одна из самых частых задач современного программиста 1С. Однако начинающие разработчики часто сталкиваются с ситуацией, когда запрос вроде бы уходит и даже возвращает код состояния 200 OK, но целевой скрипт на сервере не получает переданные данные или возвращает ошибку бизнес-логики. Разберем на конкретном примере, как правильно сконструировать запрос, чтобы сервер корректно обработал ваши параметры.

Анализируем типичную ошибку при формировании запроса

Рассмотрим ситуацию: нам необходимо обратиться к PHP-скрипту по адресу http://www.outline3d.ru/povray/link_by_uid.php?uid=F279138C6C4244818D4137EAE33E148B. Часто новички пытаются инициализировать соединение, указывая полный путь в адресе сервера. Проанализируем ошибочный код:


// ОШИБОЧНЫЙ ПРИМЕР
сайт = "www.outline3d.ru/povray/link_by_uid.php"; 
HTTPСоединение = Новый HTTPСоединение(сайт);

Запрос = Новый HTTPЗапрос("?uid=F279138C6C4244818D4137EAE33E148B");
Ответ = HTTPСоединение.Получить(Запрос);

В данном случае платформа 1С не сможет корректно разрешить имя хоста, так как объект HTTPСоединение ожидает только адрес сервера (домен или IP), а не путь к конкретному файлу. Если же указать в соединении домен, а в запросе попытаться передать только параметры (начиная со знака вопроса), сервер может выдать ошибку 404 Not Found или проигнорировать параметры, так как не указан путь к исполняемому скрипту.

Шаг 1: Правильное разделение URL

Выясним основное правило: при работе с объектами платформы HTTPСоединение и HTTPЗапрос URL должен быть строго разделен на две части:

  1. Хост (Сервер): Только доменное имя (например, www.outline3d.ru) или IP-адрес. Указывается в конструкторе HTTPСоединение.
  2. Ресурс (Путь и параметры): Все, что идет после первого слеша, включая путь к папкам, имя скрипта и параметры запроса (начиная с ?). Указывается в конструкторе HTTPЗапрос.

Посмотрим на исправленный вариант формирования кода:


// ПРАВИЛЬНЫЙ ПРИМЕР
Сервер = "www.outline3d.ru"; 
ПутьКРесурсу = "/povray/link_by_uid.php";
ПараметрыЗапроса = "?uid=F279138C6C4244818D4137EAE33E148B";

HTTPСоединение = Новый HTTPСоединение(Сервер);
Запрос = Новый HTTPЗапрос(ПутьКРесурсу + ПараметрыЗапроса);

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

Шаг 2: Интерпретация ответа сервера

Проанализируем ситуацию, когда Ответ.КодСостояния равен 200, но в теле ответа приходит сообщение об ошибке, например, "Render not found". Важно понимать, что код 200 означает лишь то, что HTTP-запрос был успешно доставлен до веб-сервера, и скрипт (в нашем случае PHP) отработал без фатальных системных ошибок.

Однако если скрипт не нашел в своей базе данных переданный uid, он все равно вернет статус 200, но в тексте ответа напишет причину неудачи. Поэтому всегда проверяйте содержимое ответа:


Если Ответ.КодСостояния = 200 Тогда
    ТекстРезультата = Ответ.ПолучитьТелоКакСтроку();
    // Проверяем наличие бизнес-ошибки в тексте
    Если Найти(ТекстРезультата, "not found") > 0 Тогда
        Сообщить("Сервер ответил успешно, но данные не найдены: " + ТекстРезультата);
    Иначе
        Сообщить("Данные получены: " + ТекстРезультата);
    КонецЕсли;
Иначе
    Сообщить("Ошибка связи с сервером! Код: " + Ответ.КодСостояния);
КонецЕсли;

Шаг 3: Работа с защищенным соединением (HTTPS)

В современных реалиях большинство сайтов работают по протоколу HTTPS. Если ваш целевой URL начинается с https://, то простая инициализация HTTPСоединение не сработает или приведет к ошибке. Нам необходимо использовать объект ЗащищенноеСоединениеOpenSSL.

Разберем, как модифицировать код для работы с защищенным протоколом:


Защита = Новый ЗащищенноеСоединениеOpenSSL();
// В конструкторе добавляем параметр защиты
HTTPСоединение = Новый HTTPСоединение(Сервер, , , , , , Защита);

Без этого параметра 1С попытается подключиться по обычному 80 порту (HTTP), в то время как сервер будет ожидать зашифрованного трафика на 443 порту.

Шаг 4: Заголовки и User-Agent

Некоторые сервера настроены так, что они блокируют запросы, если в них не указан заголовок User-Agent. По умолчанию 1С оставляет его пустым, что выдает в вас "бота" и может привести к блокировке или некорректному ответу. Рекомендуется имитировать запрос от обычного браузера.

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


Запрос = Новый HTTPЗапрос(ПутьКРесурсу + ПараметрыЗапроса);
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
Запрос.Заголовки.Вставить("Accept", "text/html,application/xhtml+xml");

Шаг 5: Кодирование параметров запроса

Если ваш uid или другие параметры содержат спецсимволы, пробелы или кириллицу, их обязательно нужно кодировать в формат URL-safe. В 1С для этого используется функция КодироватьСтроку.

Рассмотрим пример:


ЗначениеПараметра = "UID с пробелом и символом &";
ЗакодированноеЗначение = КодироватьСтроку(ЗначениеПараметра, СпособКодированияСтроки.КодировкаURL);
ПутьСПараметрами = "/script.php?uid=" + ЗакодированноеЗначение;

Итоговый правильный алгоритм работы

Подведем итог и соберем идеальный шаблон для GET-запроса:

  1. Выделяем чистый домен для HTTPСоединение.
  2. Создаем объект ЗащищенноеСоединениеOpenSSL, если сайт работает через HTTPS.
  3. Формируем полный путь к скрипту, включая параметры, предварительно прогнанные через КодироватьСтроку.
  4. Устанавливаем необходимые заголовки (как минимум User-Agent).
  5. Выполняем метод Получить().
  6. Анализируем и код состояния (200, 404, 500), и фактическое содержимое тела ответа.

Соблюдение этих правил позволит вам избежать большинства "детских" ошибок при интеграции 1С с внешними веб-системами и обеспечит стабильную передачу данных.

← На главную