Добавление нового HTTP-сервиса и его настройка в ERP 2.4
Сравнение 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-сервис готов, осталось запустить веб-сервер и опубликовать его! Вопросы публикации рассмотрены в этой статье.