Как правильно передать символ $ в GET-запросе HTTP и избежать ошибки 404 в 1С

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

При интеграции 1С с внешними веб-сервисами программисты часто сталкиваются с ситуацией, когда запрос прекрасно работает в строке браузера, но возвращает ошибку 404 (Not Found) при попытке выполнить его из кода. Особенно часто это происходит, когда в адресе присутствуют специальные символы, такие как знак доллара $. В данной статье мы подробно разберем, почему возникает эта проблема, как правильно разделять URL-адрес и как работать со спецсимволами в платформе 1С:Предприятие.

Анализ проблемы: почему браузер работает, а 1С — нет?

Рассмотрим типичную ситуацию. Нам необходимо отправить запрос к ресурсу, адрес которого содержит знак $. В браузерной строке запрос выглядит так:

http://server.ru/api/resource/$action?param=value

Браузер автоматически кодирует спецсимволы (например, заменяя $ на %24), и сервер успешно отдает данные. Однако в 1С при использовании объектов HTTPСоединение и HTTPЗапрос разработчик получает 404. Первое подозрение падает на кодировку символа $, но, как показывает практика, корень проблемы часто кроется в архитектуре формирования объектов HTTP в 1С.

Ошибка разделения адреса на Хост и Путь

Проанализируем структуру объектов 1С. Для выполнения запроса нам нужны два основных объекта: HTTPСоединение и HTTPЗапрос. Важно понимать жесткое разделение зон ответственности между ними:

  1. HTTPСоединение отвечает за установку связи с физическим сервером (хостом).
  2. HTTPЗапрос описывает конкретный ресурс на этом сервере и параметры обращения к нему.

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


// ОШИБОЧНЫЙ КОД
Сервер = "b2b-demo.n3health.ru/nsi/fhir/term"; // Здесь лишний путь!
Соединение = Новый HTTPСоединение(Сервер, 80);
Запрос = Новый HTTPЗапрос("/ValueSet/1.2.643.5.1.13.13.11.1066/$versions?_format=json");
Ответ = Соединение.Получить(Запрос); // Результат: Код 404

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

Правильное формирование запроса

Разберем правильный алгоритм действий. Разделим адрес строго по правилам:

Посмотрим на пример корректного кода:


Сервер = "b2b-demo.n3health.ru";
Порт = 80;
ПутьКРесурсу = "/nsi/fhir/term/ValueSet/1.2.643.5.1.13.13.11.1066/$versions?_format=json";

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

// Если сервер требует специфические заголовки, добавляем их:
ЗапросHTTP.Заголовки.Вставить("Accept", "application/json");

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

Если Ответ.КодСостояния = 200 Тогда
    Сообщить("Запрос выполнен успешно!");
Иначе
    Сообщить("Ошибка: " + Ответ.КодСостояния);
КонецЕсли;

Работа со спецсимволом $ и кодирование строки

Символ $ часто встречается в современных API. Например, в стандарте FHIR (используемом в медицине) он обозначает вызов операции (Operations), а в протоколе OData — системные параметры (например, $filter или $top).

Нужно ли кодировать $ вручную с помощью функции КодироватьСтроку? Рассмотрим два сценария:

  1. Автоматическая обработка платформой: В последних версиях платформы 8.3 при передаче строки в HTTPЗапрос 1С достаточно корректно обрабатывает большинство символов. Однако, если сервер строго следует стандарту RFC 3986, он может ожидать символ в виде %24.
  2. Ручное кодирование: Если вы получаете ошибку даже при правильном разделении адреса, попробуйте закодировать часть пути, содержащую параметры.

Проанализируем использование функции КодироватьСтроку:


// Пример кодирования только части запроса
ПараметрВерсии = "$versions";
ЗакодированныйПараметр = КодироватьСтроку(ПараметрВерсии, СпособКодированияСтроки.КодированиеURL); 
// ЗакодированныйПараметр станет "%24versions"

Важный нюанс: не кодируйте всю строку URL целиком, иначе символы /, ? и & также превратятся в коды (%2F, %3F, %26), что сделает URL нечитаемым для сервера. Кодировать нужно только значения параметров или специфические части пути.

Особенности работы через VPN и прокси

Если запрос все равно не проходит, выясним ситуацию с окружением. Часто ресурсы с символом $ (как в примере с n3health) доступны только через VPN. В этом случае:

Отладка и сравнение запросов

Если проблема сохраняется, проанализируем разницу между "хорошим" запросом из браузера и "плохим" из 1С. Для этого рекомендуется использовать инструменты перехвата трафика (например, Fiddler).

Сравните следующие параметры:

  1. User-Agent: Браузеры всегда передают этот заголовок. Некоторые сервера блокируют запросы без него. Попробуйте добавить в 1С: ЗапросHTTP.Заголовки.Вставить("User-Agent", "Mozilla/5.0...");.
  2. Accept: Укажите серверу, в каком формате вы ждете ответ (JSON или XML).
  3. Регистр символов: Пути в URL на Linux-серверах чувствительны к регистру. Проверьте, что $versions не превратилось в $Versions.

Подводя итог, можно сказать, что символ $ сам по себе редко является причиной 404. В 90% случаев в 1С это следствие неправильной настройки HTTPСоединение, когда часть пути "утекает" в адрес хоста. Соблюдение строгой структуры формирования запроса и понимание принципов кодирования URL позволяют успешно интегрировать 1С с любыми современными веб-сервисами.

← На главную