Как программно отправить HTTP-запрос к HTTP-сервису 1С из другой базы без ошибок

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

В современной разработке на платформе 1С:Предприятие 8.3 интеграция между различными информационными базами через HTTP-сервисы стала стандартом. Однако начинающие разработчики часто сталкиваются с техническими трудностями при настройке первого соединения. Типичная ситуация: сервис успешно открывается в браузере, но при попытке программного вызова из кода 1С возвращается ошибка «Ошибка работы с Интернет: Couldn't resolve host name» или «Не могу установить соединение».

В рамках данной статьи мы подробно разберем, как правильно настроить взаимодействие между двумя базами 1С, проанализируем типичные ошибки в структуре URL и рассмотрим примеры работающего кода.

Разбор основной причины ошибки «Couldn't resolve host name»

Ошибка Couldn't resolve host name (не удается разрешить имя хоста) чаще всего возникает из-за неправильного заполнения параметров конструктора объекта HTTPСоединение. Давайте проанализируем ситуацию: когда мы вводим адрес в браузере, мы пишем полную строку, например, http://localhost/InfoBase1/hs/hs1/sh1/. Однако в 1С логика разделения адреса иная.

Разберем, как 1С интерпретирует параметры:

  1. Хост (Сервер): Это только доменное имя или IP-адрес. В нем нельзя указывать протокол (http://) и нельзя указывать путь к базе или сервису.
  2. Порт: Указывается отдельно (обычно 80 для HTTP или 443 для HTTPS).
  3. Ресурс (Путь): Весь остальной путь, включая имя публикации базы и путь к конкретному шаблону HTTP-сервиса, передается уже в объект HTTPЗапрос.

Рассмотрим типичную ошибку из практики:

HTTPСоединение = Новый HTTPСоединение("http://localhost/InfoBase1", 80, ...);

Здесь 1С пытается найти сервер с именем http://localhost/InfoBase1, которого не существует в сети. Система ожидает увидеть там только localhost.

Шаг 1. Правильная инициализация HTTPСоединение

Для начала создадим объект соединения. Если вы работаете на локальном компьютере, сервером будет выступать localhost или 127.0.0.1. Если база опубликована на веб-сервере (IIS или Apache), используйте имя этого сервера.

Проанализируем пример корректного кода для подключения:


// Определяем параметры подключения
Сервер = "localhost"; // Только имя хоста!
Порт = 80; // Стандартный порт для http
Логин = "Администратор";
Пароль = "123";

// Если используется SSL (https), необходимо создать объект ЗащищенноеСоединениеOpenSSL
// Для обычного http этот параметр оставляем Неопределено
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль);

Важный момент: если вы используете HTTPS, обязательно добавьте объект защищенного соединения, иначе попытка подключения завершится неудачей. Однако для локальных тестов на http (порт 80) этот параметр лучше не указывать, чтобы избежать лишних проверок сертификатов.

Шаг 2. Формирование HTTPЗапрос

Теперь разберем, как правильно указать путь к вашему сервису. Весь путь, который в браузере идет после домена, мы помещаем в HTTPЗапрос. Структура пути обычно выглядит так: /ИмяПубликации/hs/КорневойURL/Шаблон/.

Рассмотрим пример формирования запроса:


// Формируем относительный путь к сервису
// Обратите внимание на ведущий слэш "/"
ПутьКСервису = "/InfoBase1/hs/hs1/sh1/"; 

Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");

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

// Если нужно отправить JSON в теле запроса (для POST или PUT)
ПараметрыСтруктура = Новый Структура("Артикул", "00001");
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыСтруктура);
СтрокаТела = ЗаписьJSON.Закрыть();

Запрос.УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Шаг 3. Выполнение метода и обработка ответа

Выясним, какой метод использовать. Если ваш HTTP-сервис настроен на получение данных (GET), используйте Соединение.ВызватьHTTPМетод("GET", Запрос) или упрощенный метод Соединение.Получить(Запрос). Если вы передаете данные на сервер, используйте POST или метод ОтправитьДляОбработки.

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


Попытка
    Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
    
    // Проанализируем код состояния
    КодСостояния = Ответ.КодСостояния;
    Если КодСостояния = 200 Тогда
        ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        Сообщить("Данные получены: " + ТекстОтвета);
    Иначе
        Сообщить("Ошибка сервера! Код состояния: " + КодСостояния);
    КонецЕсли;
Исключение
    // Сюда попадем, если сервер недоступен или ошибка в параметрах соединения
    Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;

Тонкости авторизации и заголовков

В ходе обсуждения часто возникает вопрос о передаче токенов или заголовков авторизации. В 1С есть два способа авторизоваться в базе-приемнике:

  1. Встроенная авторизация: Когда вы передаете логин и пароль в конструктор HTTPСоединение. Платформа сама сконвертирует их в заголовок Authorization: Basic ....
  2. Ручная установка заголовка: Если вы используете токены (например, JWT или Token). В этом случае в конструктор соединения логин/пароль не передаются, а используется Заголовки.Вставить("Authorization", "Bearer " + Токен).

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

Рекомендации по отладке

Проанализируем ситуацию, когда код написан верно, но данные не приходят. Чтобы понять, на чьей стороне проблема, выполните следующие шаги:

Таким образом, успех интеграции зависит от четкого разделения адреса на Хост и Ресурс, правильной настройки прав пользователя и корректной обработки кодов состояния HTTP-ответов. Использование этих правил позволит вам создавать надежные механизмы обмена данными между конфигурациями 1С.

← На главную