Сравнение WEB-  и HTTP-сервисов в 1С Предприятии 8.3.

В 1с Предприятии имеются два схожих по применению типа: Web-сервисы и Http-сервисы. Web-сервисы появились раньше, они позволяли работать с Web-сервером и осуществлять ответы на запросы используя формат XML, но работая не с XML в чистом виде, а посредством XDTO (XML Data Transfer Objects). Проще говоря, объекты описываются некоторой схемой и, в дальнейшем, на ее основе, формируется объект XDTO, с которым уже можно работать привычным для 1с обращением к полям объекта через точку.

С одной стороны, есть некоторые затраты на описание пакетов XDTO, с другой стороны - некоторая стандартизация и удобство при программировании алгоритмов.

Через несколько лет после добавления  Web-сервисов, в платформу были добавлены Http-сервисы. Сами по себе механизмы похожи, оба работают с веб-сервером, оба умеют обрабатывать обращения и возвращать что-то в ответ. Так зачем это было сделано?

Как показала практика, Web-сервисы иногда являются довольно громоздкими для некоторых задач. Особенно, это проявляется в работе с мобильными приложениями. Да и в целом, часто, стороннему разработчику привычней и удобней получить данные в JSON. Отдельно стоит отметить что при работе с HTTP-сервисами вы работаете с функциями GET, POST и так далее, и имеете возможность легко менять не только тело ответа на запрос, но и его заголовки. То есть, это полноценная работа с методами стандарта HTTP и это действительно очень гибкий инструмент. Опять же, web-сервисы работают с теми же GET и POST-запросами, но они как бы скрыты надстройкой.  Как правило, чем ниже уровень на котором вы решаете задачу, тем больше у вас гибкости, и тем сложнее процесс программирования.

В нашем случае, как ни странно, программирование HTTP-сервиса оказывается сравнительно несложным делом.

1. Добавляем необходимые объекты в дополнение в ERP 2.4 и создаем тестовый отчет "Прайс-лист с штрих-кодами"

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

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

1. Создаем расширение

Назовем его СервисHTTP, назначение укажем "Дополнение":

 

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

Я предлагаю вставить этот отчет в нашу подсистему, чтобы все было в одном месте.

 

Добавим в расширение регистры сведений, по которым планируется получить данные. Это "Цены номенклатуры" и "Штрихкоды номенклатуры"

Далее добавляем в расширение реквизиты наших регистров:

В итоге, регистры расширения "Сервис HTTP" должны выглядеть следующим образом:

Одновременно, платформа сама добавит в расширение справочники, используемые в добавленных реквизитов:

 

Наконец, создадим наш отчет, с точно таким же запросом, который мы планируем выводить в HTTP-сервис:

В добавленном отчете щекаем на схему компоновки данных и добавляем набор данных - запрос:

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

 

 

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

В итоге запускаем конфигурацию, входим в нашу подсистему:

Формируем отчет и получаем что-то подобное:

Увиденное нас вполне устраивает, поэтому добавим этот запрос в тело HTTP-сервера.

3. Создаем HTTP-сервис.

Переходим в нашем дополнении на элемент HTTP-сервисы и добавляем новый.

 

Назовем его HS_Price, и введем строку hs_price в поле Корневой URL. Важно, Корневой URL будет использован в тексте ссылки при обращении к нашему сервису! Так же стоит отметить, что запрос в части корневого URL чувствителен к регистру! Причем, остальные части из которых собирается строка запроса можно вводить в любом регистре, но если вы в корневом URL  ввели hs_price, то и в строке запроса она должна быть именно таком виде.

Включим сервис в нашу подсистему:

Добавим Шаблон URL, и в поле "Шаблон" заменим текст "/*" на "/{НаименованиеВидаЦен}". Это так называемый обязательный параметр в запросе, который будет проверяться веб-сервером. Забегая немного вперед мы будем формировать URL строку запроса определенным образом, и указание в шаблоне данной строки говорит веб-серверу о том, что мы ждем этот параметр как обязательный, и если он не указан, то продолжать обработку нет смысла. Чуть позже мы разберем формат строки обращения.

Определим новый метод, который будет отрабатывать обращение к http-сервису:

 

Назовем его GetPrice, Http-метод оставим GET.  Нажимаем на кнопку с лупой и среда сама создаст нам процедуру:

По умолчанию тут есть стандартный ответ Http-сервиса. Код ответа 200 говорит об успешном выполнении запроса.

Закомментируем и переопределим его под условия нашей задачи. Сначала мы получим наш обязательный параметр. Так как мы указали в шаблоне в фигурных скобках, то к нам в обработчик попадет только строка запроса с правильно заданным параметром. Первый параметр в строке и будет считаться "НаименованиеВидаЦен".

Ссылка, которая принимается web-сервером к обработке, в общем случае, следующая:

Адрес_веб_сервера/Название_Базы_При_Публикации/hs/Обязательные_переметры_через_слэш/?action=имя_процедуры&необязательные_параметры_парами ключ_равно_значению_через_амперсанд

здесь hs- это признак того что вызывается Http-сервис. Для веб-сервиса используются буквы ws.

В нашем примере сервер ждет строку в следующем формате:

 

Таким образом, первой строкой мы пытается считать обязательный параметр. Так как веб-сервер пропустил ссылку, следовательно, он будет задан. На картинке с строкой запроса это значение параметра "Оптовая". Дальше мы пытаемся найти по наименованию заданный вид цен, и если не нашли - отдаем ответ с ошибкой. Выглядеть в браузере это будет так:

 

Далее внесем функционал собственно запроса к данным и формирования массива при обходе выборки:

 

Запрос у нас один в один такой же как в СхемеКомпоновкиДанных тестового отчета. Мы добавили только обход выборки. И теперь финальный штрих, форматируем наш массив JSON и возвращаем в теле запроса:

Вот и все, наш HTTP-сервис готов, осталось запустить веб-сервер и опубликовать его! Вопросы публикации рассмотрены в этой статье.