Top.Mail.Ru
Заказать консультацию
специалиста 1С
Отправить заявку

Нажимая на кнопку, вы даете согласие на обработку своих персональных данных и соглашаетесь с политикой конфиденциальности.

HTTP-сервисы (обмен, JSON)

Ретунский Александр Посмотреть все статьи >> Технический архитектор франчайзинговой сети «ИнфоСофт»
07.07.2023
1855
Время прочтения - 8 мин.
Заказать консультацию

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

В рамках данной статьи будет продемонстрирован пример использования HTTP-сервиса для интеграции справочника «Контрагенты» между двумя информационными базами.


Выбор технологии:

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

Сравнительный анализ между технологиями для решения поставленной задачи - оперативный обмен и когда источником интеграционного процесса является сторонние приложение, продемонстрирован в таблице:

Параметр

HTTP-сервис

Web-сервис

Интеграция через файл

Скорость передачи данных

Мгновенная

Мгновенная

Требует времени обработки файла

Инициатором общения выступает клиент

+

+

-

Объем передаваемых данных от источника к приемнику (в том числе и код)

Минимальный объем

Объем больше, чем у HTTP-сервиса

Объем больше, чем у HTTP-сервиса

Вычислительная нагрузка

Минимальная нагрузка

Нагрузка больше, чем у HTTP-сервиса

Нагрузка больше, чем у HTTP-сервиса


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

Присутствует база-источник, в ней регистрируется потенциальные контрагенты. На определенном этапе работы кто-то из лидов переходит в разряд клиентов, и мы хотим автоматически перенести информацию о контрагенте в базу-приемник.


Требования к рабочему окружению:

1. Веб-сервер (Apache (https://httpd.apache.org/download.cgi/)  или IIS (https://www.iis.net/downloads) ). Пример установки веб-сервера: https://apache-windows.ru/ .

2. Платформа 1С с установленным расширением веб-сервера.

Протокол HTTP:

Перед тем как начать разбирать пример работы с HTTP-запросами и HTTP-сервисами в 1С, разберем, как вообще происходит обмен информацией по протоколу HTTP (HyperText Transfer Protocol — протокол передачи гипертекста).

Программа-клиент посылает на сервер HTTP-запрос (Request), веб-сервер принимает запрос, обрабатывает его и возвращает клиентской программе HTTP-ответ (Response). И запрос, и ответ представляют собой обычный текст, состоящий из нескольких частей.

Структуру HTTP-запроса можно представить в следующем виде:

- Строка запроса

- Заголовки запроса

- Строка-разделитель

- Тело запроса

Строка запроса – указывает метод передачи, URL-адрес, к которому нужно обратиться, и версию протокола HTTP.

Заголовки запроса – описывают тело сообщений, передают различные параметры и др. сведения и информацию.

Строка-разделитель – пустая строка, отделяющая тело запроса от заголовков запроса.

Тело запроса – это сами данные, которые передаются в запросе. Тело сообщения – это необязательный параметр и может отсутствовать. Тело/ запроса передается в формате JSON.

Ответ от сервера можно представить в следующем виде:

- Статус-строка

- Заголовки ответа

- Строка-разделитель

- Тело ответа

Формат статус-строки: ВерсияHTTP СтатусКод ФразаОбъяснение

Статус-код, применяется для определения результата выполнения запроса. Элемент Статус-Код представляет собой 3-значное число.

Первая цифра Статус-Кода предназначена для определения класса ответа. Программа-клиент может не знать всех возможных Статус-кодов, но по стандарту должна уметь отреагировать на ответ в соответствии с классом Статус-кода. В настоящее время существует 5 классов ответов.

Код

Класс

Назначение

1хх     

Информационный

Информирование о процессе передачи.

В HTTP/1.0 — сообщения с такими кодами должны игнорироваться.

В HTTP/1.1 — клиент должен быть готов принять этот класс сообщений как обычный ответ, но ничего отправлять серверу не нужно.

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

2хх     

Успех

Информирование о случаях успешного принятия и обработки запроса клиента. В зависимости от статуса сервер может ещё передать заголовки и тело сообщения.

3хх

Перенаправление

Сообщает клиенту, что для успешного выполнения операции необходимо сделать другой запрос (как правило по другому URI). Из данного класса пять кодов: 301, 302, 303, 305 и 307 – относятся непосредственно к перенаправлениям (редирект).

Адрес, по которому клиенту следует произвести запрос, сервер указывает в заголовке Location. При этом допускается использование фрагментов в целевом URI.

4хх

Ошибка клиента           

Указание ошибок со стороны клиента. При использовании всех методов, кроме HEAD, сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя.

5хх

Ошибка сервера           

Информирование о случаях неудачного выполнения операции по вине сервера. Для всех ситуаций, кроме использования метода HEAD, сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю.

Подпишитесь на дайджест!
Подпишитесь на дайджест, и получайте ежемесячно подборку полезных статей.

Нажимая на кнопку, вы даете согласие на обработку своих персональных данных и соглашаетесь с политикой конфиденциальности.

Итак, мы разобрались в том, как в целом работает HTTP-сервисы. Теперь перейдем к тому, как можно реализовать с его помощью обмен.

Информационная база получателя:

1.      Справочник – «Контрагенты», реквизиты:

- Код (строка(9)),

- Наименование(строка(100)),

- Телефон (строка(100)),

- ЭлектроннаяПочта(строка(100);

2. HTTP-сервис Customers:

1.png

3. Новый шаблон URL - PostCustomerInfo для сервиса Customers. Шаблон /PostCustomerInfo:

2.png

4. Новый метод POST - PostCustomerInfoCreateUpdate для шаблона URL - PostCustomerInfo

3.png

5. Метод – PostCustomerInfoCreateUpdate:

Функция PostCustomerInfoCreateUpdate(Запрос)
    //1.получаем тело запроса
Сообщение = Запрос.ПолучитьТелоКакСтроку("UTF-8");
//2.десериализуем данные о клиенте из JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Сообщение);
ДанныеКлиента = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
     //3.ищем клиента
 КодКлиента = "";
Если ДанныеКлиента.Свойство("Код", КодКлиента) Тогда
 Клиент = Справочники.Контрагенты.НайтиПоКоду(КодКлиента);
Если НЕ ЗначениеЗаполнено(Клиент) Тогда
      Клиент = Справочники.Контрагенты.СоздатьЭлемент();
Иначе
      Клиент = Клиент.ПолучитьОбъект();
КонецЕсли;   
ЗаполнитьЗначенияСвойств(Клиент, ДанныеКлиента);
       Клиент.Записать();
             Ответ = Новый HTTPСервисОтвет(200);
Иначе
       //4.если нет свойства Код, то что-то не то передали
Ответ = Новый HTTPСервисОтвет(402);
 Возврат Ответ;
КонецЕсли;
   
Возврат Ответ;
КонецФункции

6. Опубликуем http-сервис:

4.png

Информационная база отправителя:

В базе-отправителя добавляем код для передачи данных по контрагентам (вызывается при записи карточки справочника – «Контрагенты»):

// создаем новое HTTP соединение с указанием сервера
HTTP = Новый HTTPСоединение("localhost",,,,,,,);
          //создадим структуру
ДанныеОКлиенте = Новый
Структура("Код,Наименование,Телефон,ЭлектроннаяПочта",
Объект.Код, Объект.Наименование, Объект.Телефон, Объект.ЭлектроннаяПочта);
                                                             //сериализуем в json
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеОКлиенте);
СтрокаДляТела = ЗаписьJSON.Закрыть();
          //получим временный файл для передачи в теле POST-запроса
ФайлТелаЗапроса = ПолучитьИмяВременногоФайла();
//запишем в файл содержимое тела запроса (текст)
ТекстФайл = Новый ТекстовыйДокумент;
ТекстФайл.УстановитьТекст(СтрокаДляТела);
ТекстФайл.Записать(ФайлТелаЗапроса, КодировкаТекста.UTF8);
//получим размер данных для передачи в заголовок
ФайлНаОтправку = Новый Файл(ФайлТелаЗапроса);
РазмерФайлаНаОтправку = XMLСтрока(ФайлНаОтправку.Размер());
                      //заголовок создадим в виде соответствия
                  ЗаголовокЗапросаHTTP = Новый Соответствие();
//передаем в заголовках размер и тип данных на отправку
ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаНаОтправку);
 ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-  8");
    //создадим заголовок запроса
ЗапросHTTP = Новый HTTPЗапрос("InfoBase2/hs/Customers/PostCustomerInfo", ЗаголовокЗапросаHTTP);
                      //загрузить строку в тело
ЗапросHTTP.УстановитьИмяФайлаТела(ФайлТелаЗапроса);
    //отсылаем POST-запрос на обработку.
ОтветHTTP = HTTP.ОтправитьДляОбработки(ЗапросHTTP);


В данной статье был рассмотрен подробный пример реализации обмена между информационными базами через HTTP-сервис.  Опираясь на этот пример вы можете реализовать другие интеграционные процессы в своей инфраструктуре.

Потребность в использовании HTTP-сервисе для интеграционного процесса:

1) Существует ограничение на использование файлового обмена или общих файловых хранилищ, в том числе и облачных хранилищ.

2) В обмене данными участвуют разнородные платформы — это могут быть разные языки программирования, различный софт.

3) Существует необходимость высокой доступности данных, а счет идет на миллисекунды.

4) Инициатором общения выступает база-источник, а значит стандартные файловые обмены 1С могут не подойти, так как они имеют ограниченный функционал.


Заказать консультацию специалиста 1С
Оставьте заявку и наши эксперты проконсультируют вас по данной статье.
Отправить заявку

Нажимая на кнопку, вы даете согласие на обработку своих персональных данных и соглашаетесь с политикой конфиденциальности.

Рассказать друзьям
Для разработчиков 1С
Вам может быть интересно: