Как подключиться к чужому HTTP-сервису из 1С: Подробное практическое руководство

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

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

В этой статье мы подробно разберем, как правильно отправлять запросы к чужому HTTP-сервису из среды 1С:Предприятие. Мы проанализируем типичные ошибки, с которыми сталкиваются программисты, разберем структуру URL-адреса и напишем готовый шаблон кода для отправки GET-запросов с параметрами.

Анализ типичных ошибок при работе с HTTP-соединениями

Часто при первой попытке связать две базы 1С разработчики совершают несколько критических ошибок, из-за которых платформа выбрасывает исключения или возвращает пустые ответы. Давайте проанализируем эти ошибки, чтобы понимать их природу.

Ошибка №1: Неверное указание хоста в конструкторе соединения. Начинающие программисты часто пытаются передать весь URL-адрес целиком в первый параметр объекта HTTPСоединение. Например, пишут так: Новый HTTPСоединение("localhost/base/hs/Exchange"). Это грубая ошибка. Конструктор ожидает получить исключительно адрес хоста (домен или IP-адрес) без указания протоколов, портов и путей публикации.

Ошибка №2: Неправильное формирование пути ресурса. Запись вида Запрос.АдресРесурса = "?kod=0030" также является ошибочной. В данном случае 1С попытается обратиться к корню веб-сервера, полностью проигнорировав имя опубликованной базы и сам HTTP-сервис. В адресе ресурса обязательно должен содержаться относительный путь к публикации.

Ошибка №3: Использование неподходящих методов отправки. Для получения данных по методу GET иногда ошибочно используют метод ОтправитьДляОбработки(), который предназначен для POST-запросов с телом. Для простых запросов на получение информации гораздо логичнее и проще задействовать метод Получить() объекта HTTPСоединение.

Разбираем анатомию URL-запроса

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

http://localhost/base/hs/uznat?kod=0030

Этот адрес состоит из следующих ключевых сегментов, которые мы должны распределить по объектам 1С:

  1. Протокол (http:// или https://) — определяет способ шифрования данных. В самом коде 1С протокол явно не пишется, но от него зависит, будем ли мы использовать защищенное соединение SSL.
  2. Хост (localhost или IP-адрес, или имя домена) — это то точное место назначения, куда направляется запрос. Этот параметр передается в качестве первого аргумента в HTTPСоединение.
  3. Порт (80 для HTTP, 443 для HTTPS) — сетевой порт веб-сервера. Передается вторым параметром в соединение.
  4. Путь к ресурсу (/base/hs/uznat) — относительный путь к нашему HTTP-сервису внутри публикации веб-сервера.
  5. Параметры запроса (?kod=0030) — дополнительные данные, передаваемые серверу методом GET.

Важно помнить, что в объекте HTTPЗапрос свойство АдресРесурса должно содержать в себе как путь к ресурсу, так и параметры запроса, объединенные в одну строку: /base/hs/uznat?kod=0030.

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

Рассмотрим готовый к использованию шаблон кода для отправки GET-запроса. Данный код является универсальным и может быть размещен как во внешних обработках, так и в общих модулях конфигурации.


// Шаг 1. Подготовка параметров подключения
ИмяСервера = "localhost"; // Имя хоста без лишних символов
ПортПодключения = 80;       // Стандартный порт для HTTP
ИмяПользователя = "Администратор"; // Пользователь целевой базы 1С
ПарольПользователя = "123456";     // Пароль пользователя

// Шаг 2. Формирование строки ресурса
БазовыйПуть = "/base/hs/uznat"; // Путь к публикации сервиса
ПараметрыЗапроса = "?kod=0030";   // Передаваемые параметры
АдресРесурса = БазовыйПуть + ПараметрыЗапроса;

// Шаг 3. Создание объектов соединения и запроса
Соединение = Новый HTTPСоединение(ИмяСервера, ПортПодключения, ИмяПользователя, ПарольПользователя);
Запрос = Новый HTTPЗапрос(АдресРесурса);

// Установим заголовок, чтобы сервер понимал, что мы ожидаем ответ в формате JSON
Запрос.Заголовки.Вставить("Accept", "application/json");

Попытка
    // Шаг 4. Выполнение запроса методом GET
    Ответ = Соединение.Получить(Запрос);
    
    // Шаг 5. Анализ полученного ответа
    КодCостояния = Ответ.КодСостояния;
    
    Если КодCостояния = 200 Тогда
        // Запрос выполнен успешно, получаем текстовые данные
        ТекстОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
        Сообщить("Данные успешно получены!");
        Сообщить("Ответ сервера: " + ТекстОтвета);
    Иначе
        // Обработка ошибок авторизации или отсутствия ресурса (например, 401, 404)
        Сообщить("Сервер вернул код ошибки: " + КодCостояния);
        Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку("UTF-8"));
    КонецЕсли;
    
Исключение
    // Обработка критических ошибок связи (сервер недоступен, неверный хост и т.д.)
    ИнформацияОбОшибке = ИнформацияОбОшибке();
    Сообщить("Произошла ошибка при выполнении HTTP-запроса:");
    Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПопытки;

Дополнительные важные настройки для промышленной эксплуатации

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

1. Использование защищенного соединения HTTPS (SSL)

В реальных проектах обмен данными практически всегда происходит по защищенному протоколу HTTPS. Если вы попытаетесь отправить обычный запрос на HTTPS-хост, то получите ошибку соединения. Для поддержки SSL в 1С используется специальный объект ЗащищенноеСоединениеOpenSSL.

Давайте посмотрим, как модифицировать наше подключение для работы по HTTPS:


// Для работы по HTTPS обычно используется порт 443
ПортHTTPS = 443;

// Создаем объект защищенного соединения с дефолтными системными сертификатами
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// Передаем этот объект седьмым параметром в конструктор HTTPСоединение
Соединение = Новый HTTPСоединение(
    ИмяСервера, 
    ПортHTTPS, 
    ИмяПользователя, 
    ПарольПользователя, 
    , // Прокси 
    , // Таймаут
    ЗащищенноеСоединение
);

2. Кодирование параметров запроса (URL-encode)

Очень часто в GET-запросах требуется передавать текстовые строки, содержащие пробелы, кириллицу или специальные символы (например, наименование контрагента или артикул с дефисом). Если передать их в сыром виде, веб-сервер вернет ошибку 400 Bad Request.

Чтобы избежать подобных проблем, любые строковые параметры перед конкатенацией с адресом ресурса необходимо закодировать с помощью встроенной функции платформы КодироватьСтроку:


ИскомоеНаименование = "Рога и Копыта";
// Кодируем строку в формат URL-safe
ЗакодированноеИмя = КодироватьСтроку(ИскомоеНаименование, СпособКодированияСтроки.КодировкаURL);

// Теперь адрес ресурса будет безопасным для веб-сервера
АдресРесурса = "/base/hs/uznat?name=" + ЗакодированноеИмя;

3. Настройка таймаута ожидания

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

Настоятельно рекомендуется всегда указывать явный таймаут ожидания ответа в секундах (шестой параметр в конструкторе HTTPСоединение):


ТаймаутВСекундах = 15; // Ограничим ожидание 15 секундами

Соединение = Новый HTTPСоединение(
    ИмяСервера, 
    ПортПодключения, 
    ИмяПользователя, 
    ПарольПользователя, 
    , // Прокси
    ТаймаутВСекундах
);

4. Токенизированная авторизация (Bearer Token) вместо базовой

Передача логина и пароля напрямую в соединении (Basic Authentication) небезопасна и не всегда поддерживается современными API. Многие современные веб-сервисы требуют авторизацию по токену (например, JWT), который передается в заголовках запроса.

Если ваш HTTP-сервис требует токен авторизации, то в самом HTTPСоединение логин и пароль указывать не нужно. Авторизационные данные мы поместим непосредственно в заголовки объекта HTTPЗапрос:


// Создаем соединение без указания учетных данных
Соединение = Новый HTTPСоединение(ИмяСервера, ПортПодключения);

Запрос = Новый HTTPЗапрос(АдресРесурса);

// Формируем заголовок авторизации с токеном
ТокенДоступа = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"; // Пример токена
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);

Резюме

Мы подробно изучили процесс подключения к внешним HTTP-сервисам из среды 1С. Ключ к успеху кроется в аккуратном разделении адреса на хост и путь ресурса, а также в обязательном использовании современных стандартов безопасности (HTTPS) и кодировании URL-параметров. Придерживаясь описанных шаблонов и правил хорошего тона (таких как обязательная установка таймаутов), вы сможете построить надежную и быструю интеграцию между вашими информационными базами.

← На главную