Современная экосистема 1С все чаще требует интеграции между различными информационными базами или внешними веб-ресурсами. HTTP-сервисы стали стандартом де-факто для обмена данными благодаря своей легкости, быстродействию и универсальности. Однако если инструкций по публикации собственных HTTP-сервисов в интернете предостаточно, то процесс настройки подключения к сторонним сервисам из кода 1С часто вызывает вопросы у начинающих разработчиков.
В этой статье мы подробно разберем, как правильно отправлять запросы к чужому HTTP-сервису из среды 1С:Предприятие. Мы проанализируем типичные ошибки, с которыми сталкиваются программисты, разберем структуру URL-адреса и напишем готовый шаблон кода для отправки GET-запросов с параметрами.
Часто при первой попытке связать две базы 1С разработчики совершают несколько критических ошибок, из-за которых платформа выбрасывает исключения или возвращает пустые ответы. Давайте проанализируем эти ошибки, чтобы понимать их природу.
Ошибка №1: Неверное указание хоста в конструкторе соединения. Начинающие программисты часто пытаются передать весь URL-адрес целиком в первый параметр объекта HTTPСоединение. Например, пишут так: Новый HTTPСоединение("localhost/base/hs/Exchange"). Это грубая ошибка. Конструктор ожидает получить исключительно адрес хоста (домен или IP-адрес) без указания протоколов, портов и путей публикации.
Ошибка №2: Неправильное формирование пути ресурса. Запись вида Запрос.АдресРесурса = "?kod=0030" также является ошибочной. В данном случае 1С попытается обратиться к корню веб-сервера, полностью проигнорировав имя опубликованной базы и сам HTTP-сервис. В адресе ресурса обязательно должен содержаться относительный путь к публикации.
Ошибка №3: Использование неподходящих методов отправки. Для получения данных по методу GET иногда ошибочно используют метод ОтправитьДляОбработки(), который предназначен для POST-запросов с телом. Для простых запросов на получение информации гораздо логичнее и проще задействовать метод Получить() объекта HTTPСоединение.
Прежде чем переходить к написанию кода, давайте четко разграничим, из каких частей состоит веб-адрес, к которому мы хотим обратиться. Возьмем для примера классический URL-адрес запроса к сервису:
http://localhost/base/hs/uznat?kod=0030
Этот адрес состоит из следующих ключевых сегментов, которые мы должны распределить по объектам 1С:
HTTPСоединение.Важно помнить, что в объекте HTTPЗапрос свойство АдресРесурса должно содержать в себе как путь к ресурсу, так и параметры запроса, объединенные в одну строку: /base/hs/uznat?kod=0030.
Рассмотрим готовый к использованию шаблон кода для отправки 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-запроса:");
Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПопытки;
Когда вы переносите код из тестовой среды в реальную рабочую базу, стандартного шаблона может оказаться недостаточно. Разберем важные нюансы, которые уберегут вашу систему от зависаний и сбоев.
В реальных проектах обмен данными практически всегда происходит по защищенному протоколу HTTPS. Если вы попытаетесь отправить обычный запрос на HTTPS-хост, то получите ошибку соединения. Для поддержки SSL в 1С используется специальный объект ЗащищенноеСоединениеOpenSSL.
Давайте посмотрим, как модифицировать наше подключение для работы по HTTPS:
// Для работы по HTTPS обычно используется порт 443
ПортHTTPS = 443;
// Создаем объект защищенного соединения с дефолтными системными сертификатами
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Передаем этот объект седьмым параметром в конструктор HTTPСоединение
Соединение = Новый HTTPСоединение(
ИмяСервера,
ПортHTTPS,
ИмяПользователя,
ПарольПользователя,
, // Прокси
, // Таймаут
ЗащищенноеСоединение
);
Очень часто в GET-запросах требуется передавать текстовые строки, содержащие пробелы, кириллицу или специальные символы (например, наименование контрагента или артикул с дефисом). Если передать их в сыром виде, веб-сервер вернет ошибку 400 Bad Request.
Чтобы избежать подобных проблем, любые строковые параметры перед конкатенацией с адресом ресурса необходимо закодировать с помощью встроенной функции платформы КодироватьСтроку:
ИскомоеНаименование = "Рога и Копыта";
// Кодируем строку в формат URL-safe
ЗакодированноеИмя = КодироватьСтроку(ИскомоеНаименование, СпособКодированияСтроки.КодировкаURL);
// Теперь адрес ресурса будет безопасным для веб-сервера
АдресРесурса = "/base/hs/uznat?name=" + ЗакодированноеИмя;
По умолчанию 1С может ожидать ответа от стороннего сервера неопределенно долго. Если удаленная база данных зависнет или перегрузится, сеанс пользователя в вашей текущей базе также намертво зависнет. Это критично для баз, работающих в режиме 24/7.
Настоятельно рекомендуется всегда указывать явный таймаут ожидания ответа в секундах (шестой параметр в конструкторе HTTPСоединение):
ТаймаутВСекундах = 15; // Ограничим ожидание 15 секундами
Соединение = Новый HTTPСоединение(
ИмяСервера,
ПортПодключения,
ИмяПользователя,
ПарольПользователя,
, // Прокси
ТаймаутВСекундах
);
Передача логина и пароля напрямую в соединении (Basic Authentication) небезопасна и не всегда поддерживается современными API. Многие современные веб-сервисы требуют авторизацию по токену (например, JWT), который передается в заголовках запроса.
Если ваш HTTP-сервис требует токен авторизации, то в самом HTTPСоединение логин и пароль указывать не нужно. Авторизационные данные мы поместим непосредственно в заголовки объекта HTTPЗапрос:
// Создаем соединение без указания учетных данных
Соединение = Новый HTTPСоединение(ИмяСервера, ПортПодключения);
Запрос = Новый HTTPЗапрос(АдресРесурса);
// Формируем заголовок авторизации с токеном
ТокенДоступа = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"; // Пример токена
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
Мы подробно изучили процесс подключения к внешним HTTP-сервисам из среды 1С. Ключ к успеху кроется в аккуратном разделении адреса на хост и путь ресурса, а также в обязательном использовании современных стандартов безопасности (HTTPS) и кодировании URL-параметров. Придерживаясь описанных шаблонов и правил хорошего тона (таких как обязательная установка таймаутов), вы сможете построить надежную и быструю интеграцию между вашими информационными базами.