Универсальный HTTP-сервис в стиле удаленного вызова процедур (RPC)
Представленная конфигурация 1С имеет в своем составе две подсистемы: <HTTP-сервер>, <HTTP-клиент>. Каждая из подсистем предназначена для внедрения в целевые конфигурации. Подсистема <HTTP-сервер> предназначена для реализации функционала HTTP-сервиса в стиле удаленного вызова процедур (RPC). Соответственно, подсистема <HTTP-клиент> предназначена для работы с этим HTTP-сервисом. Указанные две подсистемы позволяют упростить реализацию методов (функций) публикуемых на HTTP-сервисе и их вызов на клиенте. Подсистема <HTTP-сервер> упрощает создание непосредственно самого HTTP-сервиса и его методов (функций общих модулей, которые публикуются на HTTP-сервисе). Подсистема <HTTP-клиент> упрощает вызов на клиенте методов опубликованных на HTTP-сервисе. Т.е. программист освобождается от необходимости преобразовывать данные в/из JSON/XML – программист работает с методами HTTP-сервиса на клиенте почти как с обычными функциями. Главной особенностью механизма является возможность передавать между HTTP-сервисом и HTTP-клиентом объекты информационной базы (например: «СправочникОбъект.Сотр….», «ДокументОбъект.ПриемНаРа…», «Массив» и т.п., т.е. любой сериализуемый объект информационной базы) в качестве параметров и результата при выполнении методов, в том числе с отличиями в реквизитах как по типу так и составу (//infostart.ru/1c/articles/1899801/).
Разработка и отладка производились на технологической платформе «1С Предприятие» 8.3.10.2699.
Пример публикации метода (функции общего модуля) на HTTP-сервисе.
Пример вызова метода HTTP-сервиса на HTTP-клиенте.
Пример внедрения в целевые конфигурации подсистем и их использование на сквозном примере.
В файле «1Cv8_ExampleAccountSystem_(Исходный)_20240209_1414.dt» находится небольшая демонстрационная информационная база учета персонала.
Создадим на основании вышеуказанной информационной базы две информационные базы:
«ExampleAccountSystem_S» - информационная база, которая будут содержать в себе HTTP-сервис.
«ExampleAccountSystem_C» - информационная база, которая будет клиентом HTTP-сервиса.
Изменим имена конфигураций.
Добавим в информационную базу «ExampleAccountSystem_S» подсистему «HTTPСервер».
Установим права на элементы конфигурации вновь добавленной подсистемы.
Для этого установим фильтр по подсистеме <HTTPСервер>.
Установим на все элементы подсистемы <HTTPСервер> полные права. Не забудьте установить права, в том числе, на саму подсистему <HTTPСервер>.
Установим для подсистемы <HTTPСервер> признак включения в командный интерфейс.
Изменим HTTP-сервис. Зададим новое имя, синоним и корневой URL.
Заведем пользователя для доступа к HTTP-сервису.
Опубликуем HTTP-сервис на сервере.
Для этого заходим на сервер, где установлен IIS. Запускаем 1С от имени администратора.
Запустим IIS менеджер для настройки SSL.
HTTP-сервис опубликован!
Добавим в информационную базу «ExampleAccountSystem_C» подсистему «HTTPКлиент».
Установим права на элементы конфигурации вновь добавленной подсистемы.
Для этого установим фильтр по подсистеме <HTTPКлиент>.
Установим на все элементы подсистемы <HTTPКлиент> полные права. Не забудьте установить права, в том числе, на саму подсистему <HTTPКлиент>.
Установим для подсистемы <HTTPСервер> признак включения в командный интерфейс.
Запустим информационную базу <ExampleAccountSystem_C> в пользовательском режиме.
Выполним настройки для доступа к созданному нами HTTP-сервису (информационная база <ExampleAccountSystem_S>).
Создадим в справочнике <Системы> новый элемент справочника, который будет содержать информацию о текущей информационной системе. Вся необходимая информация заполняется по кнопке <Заполнить> командной панели формы элемента.
Лист <Модель данных> заполняется данными модели (конфигурации) текущей информационной системы в формате Xml.
Результат записи элемента справочника <Системы>.
Необходимо заполнить также константу <Эта система> значением только что созданного элемента справочника <Системы>.
После сохранения значения константы откроем справочник <Системы>. Теперь элемент справочника который мы определили как <Эта система> отмечен «галочкой».
Далее создаем в справочнике <Внешние HTTP-сервисы> запись с информацией необходимой для установки соединения с HTTP-сервисом.
Результат записи элемента справочника <Внешние HTTP-сервисы>.
Далее необходимо создать настройку для внешнего HTTP-сервиса. Настройка связывает внешний HTTP-сервис (элемент справочника <Внешние HTTP-сервисы>) с информацией о текущей системе (элемент справочника <Системы>), информацией о системе HTTP-сервиса (элемент справочника <Системы>), и профилем (элемент справочника <Профили>).
Далее необходимо зарегистрировать систему-клиент (см. реквизит <Внешняя система>) на HTTP-сервисе. Для этого выбираем в реквизит <Эта система> только что созданный элемент справочника <Example account system client> и нажимаем кнопку <Зарегистрировать>.
Если регистрация прошла успешно, то будет выдано сообщение.
Откроем и посмотрим информацию о системе после регистрации. Обратите внимание на реквизит <Регистрация (сервер)>. Значение этого реквизита показывает, когда была проведена регистрация текущей системы на HTTP-сервисе. Теперь HTTP-сервис знает о клиенте, в том числе о модели данных клиента. Это необходимо HTTP-сервису для сериализации/десериализации объектных значений между HTTP-клиентом и HTTP-сервером.
Перейдем в информационную базу HTTP-сервера. Откроем справочник <Системы>. В этом справочнике мы увидим такой же элемент, как и в информационной базе HTTP-клиента. Элемент справочника был записан в информационную базу HTTP-сервера при регистрации (кнопка <Зарегистрировать> в базе HTTP-клиента).
Создадим в справочнике <Системы> еще один элемент, который будет описывать учетную систему HTTP-сервера.
Установим этот элемент как значение константы <ЭтаСистема>.
Далее в информационной базе HTTP-сервера необходимо в справочнике <Профили> создать профиль для HTTP-клиента. Открываем справочник <Профили> и создаем новый элемент. На листе <Основная> задаем имя профиля и пароль.
На листе <Создан, изменен, восстановлен> необходимо ОБЯЗАТЕЛЬНО занести дату окончания регистрации. Если не указать эту дату, то профиль будет считаться не активным.
Записываем созданный профиль. При записи профиля необходимо будет подтвердить заданный пароль еще раз.
Переходим в информационную базу HTTP-клиента.
Получим на клиенте описание системы HTTP-сервиса. Для этого нажимаем кнопку <Получить> расположенную рядом с реквизитом <Внешняя система>.
Если процесс получения информации от внешней системы прошел успешно, то будет выдано сообщение и реквизит <Внешняя система> будет заполнен.
Теперь нужно получить только что созданный профиль с HTTP-сервера.
Нажимаем кнопку <Получить>, расположенную рядом с реквизитом <Профиль>.
Если все успешно, то будет выдано сообщение и в справочнике <Профили> будет создан/изменен элемент справочника полученный с HTTP-сервера. При этом реквизит <Профиль> в настройке внешнего HTTP-сервиса будет заполнен этим элементом.
Сохраним настройку. Подготовительные действия все выполнены.
Не забываем включить настройку и указать ее по умолчанию !!!
Переходим в информационную базу HTTP-сервера. Создадим в этой базе общий модуль, в который будем добавлять функции доступные для выполнения HTTP-клиенту.
Добавим в общий модуль самую простую функцию, которая будем возвращать нам количество сотрудников справочника <Сотрудники> информационной базы HTTP-сервера.
Общий модуль серверный. Добавим в него функцию <ПолучитьКоличество>. Функция будет нам возвращать количество элементов справочника <Сотрудники>. Функция должна быть экспортной. Для публикации функции <ПолучитьКоличество> в наш HTTP-сервис (<Personnel>) добавим функцию <РазрешенВызовИзHTTPСервиса>. Функцию с именем <РазрешенВызовИзHTTPСервиса> нужно добавлять в каждый общий модуль если планируется функции этого общего модуля публиковать на HTTP-сервисе. Основное назначение этой функции – проверить наличие токена, имени HTTP-сервиса и имени метода (имени функции). И на основании этих параметров сделать вывод возможен вызов функции общего модуля или нет. Функция должна вернуть <Истина> или <Ложь>. Соответственно <Истина> - вызов функции общего модуля разрешен, <Ложь> - запрещен.
Переходим в информационную базу HTTP-клиента. Проверим вызов метода HTTP-сервиса с клиента.
Запускаем на HTTP-клиенте обработку <Выполнить метод HTTP-сервиса>.
В обработке выбираем настройку внешнего HTTP-сервиса. Заносим версию, имя общего модуля и имя метода, который мы будем выполнять на HTTP-сервисе.
Нажимаем кнопку <Выполнить> и получаем результат выполнения метода на HTTP-сервисе.
На HTTP-клиенте на языке 1С вызов метода HTTP-сервиса выглядит вот так:
Добавим еще одну функцию на стороне HTTP-сервера. Функция <ПолучитьФИОПоТабельному> будет нам возвращать ФИО сотрудника по табельному номеру. Не забываем сделать эту функцию экспортной. Добавим публикацию этой функции в функцию <РазрешенВызовИзHTTPСервиса>.
Переходим в информационную базу HTTP-клиента. Проверим вызов метода HTTP-сервиса с клиента.
Запускаем на HTTP-клиенте обработку <Выполнить метод HTTP-сервиса>. В обработке выбираем настройку внешнего HTTP-сервиса. Заносим версию, имя общего модуля и имя метода, который мы будем выполнять на HTTP-сервисе. Добавляем строковый параметр, в который мы будем задавать табельный номер.
Нажимаем кнопку <Выполнить> и получаем результат выполнения метода на HTTP-сервисе.
На HTTP-клиенте на языке 1С вызов метода HTTP-сервиса выглядит вот так:
Усложним задачу. До текущего момента мы передавали на HTTP-сервис в виде параметров и получали как результат выполнения только значения простых типов. Но основное назначение, ради чего создавался данный механизм, это возможность передавать в качестве параметров и получать в качестве результата объектные данные.
В механизме используется моя разработка:
//infostart.ru/1c/articles/1899801/
Добавим в HTTP-сервис функцию которая будет возвращать <СправочникОбъект.Сотрудники> по заданному табельному номеру. Добавим публикацию этой функции в функцию <РазрешенВызовИзHTTPСервиса>.
Переходим в информационную базу HTTP-клиента. Проверим вызов метода HTTP-сервиса с клиента.
Запускаем на HTTP-клиенте обработку <Выполнить метод HTTP-сервиса>. В обработке выбираем настройку внешнего HTTP-сервиса. Заносим версию, имя общего модуля и имя метода, который мы будем выполнять на HTTP-сервисе. Добавляем строковый параметр, в который мы будем задавать табельный номер.
Нажимаем кнопку <Выполнить> и получаем результат выполнения метода на HTTP-сервисе.
Посмотрим на значение результата выполнения метода в отладчике.
Усложним задачу. Реализуем в информационной базе HTTP-клиент обновление списка сотрудников данными из информационной базы HTTP-сервер. Для этого в информационной базе HTTP-сервера реализуем в общем модуле функцию <ПолучитьВсехСотрудников>.
Проверим ее работу на HTTP-клиенте.
Нажимаем кнопку <Выполнить> и получаем результат выполнения метода на HTTP-сервисе.
Посмотрим на значение результата выполнения метода в отладчике. В отладчике видим, что мы получили на клиенте HTTP-сервиса массив объектов <СправочникОбъект.Сотрудники>.
Реализуем в информационной базе HTTP-клиент обновление списка сотрудников данными из информационной базы HTTP-сервер по кнопке <Обновить с сервера>.
Запускаем HTTP-клиента и открываем справочник <Сотрудники>.
Для проверки получения данных с HTTP-сервера удалим один элемент в справочнике <Сотрудники> и в одном из элементов удалим место рождения. Удаляем элемент - <Трудный Владимир Сергеевич>. В элементе <Непомнящий Олег Владимирович> удаляем место рождения.
Нажимаем кнопку <Обновить с HTTP-сервера>. Видим, что появился сотрудник <Трудный Владимир Сергеевич>, и в элементе <Непомнящий Олег Владимирович> появилась информация о месте рождения.
Еще усложним задачу. Сделаем справочник <Сотрудники> различным по структуре на сервере и клиенте. Для этого на сервере в справочник добавим реквизит <АдресМестаЖительства>.
Выведем реквизит на форму
Перейдем на HTTP-клиент.
Для проверки получения данных с HTTP-сервера удалим один элемент в справочнике <Сотрудники> и в одном из элементов удалим место рождения. Удаляем элемент - <Трудный Владимир Сергеевич>. В элементе <Непомнящий Олег Владимирович> удаляем место рождения.
Нажимаем кнопку <Обновить с HTTP-сервера>. Видим, что появился сотрудник <Трудный Владимир Сергеевич>, и в элемент <Непомнящий Олег Владимирович> появилась информация о месте рождения.
Т.е. объекты с отличиями в сервере и клиенте также можно успешно использовать при обмене.
The End.