gifts2017

HTTP-сервисы для тех, кто ничего не понимает в WEB

Опубликовал Илья Головацкий (YAGolova) в раздел Обмен - Интеграция с WEB

Если вы ничего не понимаете в WEB технологиях и такие слова, как json, get, post и прочее для вас ничего не значат и вы просто заядлый 1С-ник до мозга костей, но вам кровь из носу надо подружить 1С со сторонними приложениями или сайтом, то эта статья для вас

Начну с того, что когда-то я был вынужден самостоятельно разбираться с Web-сервисами. Тогда как-то потихоньку мне удалось освоить это дело и понять, что и куда надо нажать, чтобы все заработало. Благо конфигурация, с которой пришлось работать, уже была напичкана Web-сервисами и можно было подглядеть и сделать по аналогии, а также в интернете мне удалось найти достаточно статей по этому делу. И так, на примерах (для меня это лучший способ изучения), я освоил это дело, и теперь меня они уже не пугают.

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

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

В дереве метаданных HTTP-сервисы располагаются в ветке Общие: 

Добавляется новый HTTP-сервис точно так же, как и любой другой объект метаданных. Имя и синоним как хотите. Тут важен только "Корневой URL" - это, собственно, и есть идентификатор HTTP-сервиса в данной базе, т.е. именно то, что вы напишете в этом свойстве, вы передадите стороннему разработчику (ну или себе) в качестве ссылки на сервис.

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

Дальше переходим на закладку Шаблоны URL и добавляем новый шаблон.

Тут важно само свойство Шаблон:

С помощью шаблона вы впоследствии сможете обратить к тем данным, которые вам передали. ИТАК: все данные, которые вы хотите получить извне, можно разделить на 2 блока - обязательные и не обязательные.

Обязательные данные/параметры запихиваем в шаблон, тем самым если тот, кто обращается к сервису, их не заполнил, то сервис априори выдаст ошибку, а вы при разработке текста модуля обработчика будете уверены, что эти данные есть. Как это делается: в строке Шаблон в фигурных скобках "{}", чередуя с со знаком "/", пишем имена переменных. Например, нам обязательно нужен артикул - тогда пишем /{artikul}. Если нам надо получить артикул, имя и имя пользователя, строка шаблона будет выглядеть так: /{artikul}/{name}/{user} и т.д. Каждый из таких параметров в тексте модуля обработчика можно будет получить так: Запрос.ПараметрыURL["<имя параметра>"]. Если обязательных нет, то шаблон выглядит так: /*.

Не обязательные данные, которые мы хотим получать через сервис, в шаблоне НЕ описываются. При построении ссылки, для обращения к сервису они описываются в конце ссылки после знака "?", разделяются символом амперсанда "&" и имеют структуру <имя параметра>=<значение параметра>. В тексте модуля обработчика к ним можно обратиться конструкцией: Запрос.ПараметрыЗапроса.Получить("<имя параметра>"). НО: важно помнить, раз они не обязательны, то их может и не быть, соответственно значение проверяем на Неопределено.

Далее добавляем новый метод для нашего шаблона. Тут важно свойство HTTP-метод. Их тут огромное количество, НО мы не будем вдаваться во все тонкости. Для реализации любой вашей задачи вам нужны только 2: GET и POST.

Как выбрать: Если того, что мы с вами описали в двух предыдущих абзацах, для работы вам достаточно, т.е. все нужные вам данные вы сможете получить с помощью обязательных и не обязательных параметров самого запроса, то берем GET. В этом случае в любом браузере, если вы правильно введете адресную строку, вы увидите результат действия своего HTTP-сервиса - ПРОФИТ! Если вдруг для работы вашего сервиса нужны данные в более сложном виде (xml например, или еще чего), то, что нельзя запихнуть в простую адресную строку, то берем POST. Из минусов такая легкая проверка через адресную строку браузера, как с GET, не прокатит, но на просторах интернета легко можно найти какие-нибудь сайты, на которых можно проверить сервисы методом POST (например, сайт https://www.hurl.it). В случае, если выбран метод POST, то у запроса помимо URL (адреса) появляется тело, в которое можно запихнуть все, что угодно, а в обработчике метода обратиться к нему через конструкцию Запрос.ПолучитьТелоКакСтроку(). У любого шаблона может быть как GET метод, так и POST. У них будут соответственно разные обработчики, а 1С-ка в зависимости от того, как был отправлен запрос, будет выбирать тот или иной метод.

Обработчик HTTP-сервиса - это функция, которая всегда возвращает значение типа HTTPСервисОтвет, который строится конструктором Новый HTTPСервисОтвет(<КодСостояния>). <КодСостояния> - это число, чтобы не мучаться с выбором что писать, пишем: 200 - если все хорошо и вы возвращаете какое то логичное значение, 400 - если ошибка и вы возврщаете описание ошибки. У данного типа есть различные методы (можно почитать в синтакс помошнике, там все понятно написано). Опять же, всегда можно вернуть все что нужно в виде строки - метод УстановитьТелоИзСтроки(). (одна небольшая хитрость: если вы возвращаете html и хотите чтобы браузер при вводе в адресную строку адреса вашего сервиса на экране красиво отобразил его, в свойстве ответ Заголовки напишите: Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8") - тем самым вы укажите, что это не просто набор символов, а HTML и его надо показать соответствующе)

После того как вы все сделаете, HTTP-сервис надо опубликовать. Делается это на компьютере с установленным веб-сервером (про настройки писать не буду, есть полно статей) через меню:

Администрирование - Публикация на веб сервере.

Там закладка HTTP-сервисы. Ставим галки и нажимаем "Опубликовать"

Итак, мы получили готовый HTTP-сервис. КАК к нему обратиться? Если у нас используется метод GET то в адресной строке браузера пишем: http://<имя веб сервера>/<имя базы>/hs/<корневой URL>/<обязательный параметр1>/<обязательный параметр2>?<имя не обязательного параметра 1>=<значение не обязательного параметра 1>&<имя не обязательного параметра 2>=<значение не обязательного параметра 2>.

Ну и, наконец, еще раз в картинках))):

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Юрий Лазаренко (TitanLuchs) 21.04.16 19:57
"404 - если ошибка и вы возврщаете описание ошибки."
404 - "это страница не найдена". Если http-сервис возвращает ответ, то страница по указанному URL уже однозначно найдена, запрос по этому URL обработан, но в процессе обработки алгоритм пришел к выводу, что параметры в URL указаны неверно (а иначе не было бы ошибки). Так что тут логичнее отправлять 400 или 500. Так отправитель запроса хотя бы поймет, что он указал правильный базовый URL.
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D­0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%­D0%B8%D1%8F_HTTP
2. Александр Закиров (sasha777666) 22.04.16 02:31
Отличная статья, была бы она год назад.....
3. Максим Кузнецов (Makushimo) 22.04.16 06:06
Лучше поздно, чем никогда.
Все понятно.
Спасибо!
4. Steve Gordon (SGordon1) 22.04.16 14:52
По аутентификации подскажите, под каким пользователем это должно работать, концепция так сказать какая должна быть?
5. Илья Головацкий (YAGolova) 22.04.16 15:44
(4) SGordon1, Служба сервера Предприятия 1с запускается от имени какого-то пользователя Windows, в базе 1С заводим пользователя и устанавливаем у него аутентификацию операционной системы и связываем с тем пользователем, от имени которого запускается сервер предприятия
Taxes; SGordon1; +2 Ответить 2
6. Илья Головацкий (YAGolova) 22.04.16 15:45
(1) TitanLuchs, Спасибо за уточнение и ссылочку, поправлю)
7. Данила Володькин (skif47) 22.04.16 16:11
Спасибо, ты помог мне сэкономить кучу времени!
8. Игорь Steelvan (Steelvan) 23.04.16 10:18
Чем табличку генерировали для примера ?
9. Xer shi (Xershi) 23.04.16 10:27
Если я умею пользоваться веб сервисом, то для чего мне нужен ашттп?
10. Sergey Andreev (starik-2005) 23.04.16 10:40
Хорошая статья. Дергать HTTP-сервисы можно с помощью простого расширения к гугл-хрому "Бумеранг" - и не надо никаких сторонних сайтов. Единственное, чего мне лично не хватает в статье - это содержимого файла default.vrd. Можете опубликовать, а то в Linux-системах 1С по-умолчанию публикует только саму базу без сервисов (из командной строки если это делать).
11. Юрий Лазаренко (TitanLuchs) 23.04.16 14:49
(9) Xershi, http-сервисы быстрее
12. Юрий Лазаренко (TitanLuchs) 23.04.16 14:50
(10) starik-2005, http можно и просто из строки адреса браузера дергать посредством get-запросов.
13. Sergey Andreev (starik-2005) 23.04.16 17:23
14. Юрий Лазаренко (TitanLuchs) 23.04.16 21:24
(13) starik-2005, в общем-то так я и написал. Но в 99.9% случаев достаточно get и строки адреса браузера.
15. Sergey Andreev (starik-2005) 23.04.16 22:29
(14) TitanLuchs, у разных людей разные случаи. Я вот, например, при интеграции маленькими пакетами не обмениваюсь - стараюсь сначала все подготовить, потом одним пакетом данные передать. А тут уже, сами понимаете, никаких GET. Да и вообще о запросах в цикле давно сказано, что глупости это ))
16. Артём Андриянов (CSiER) 25.04.16 06:24
(10) starik-2005, мне вот это расширение очень понравилось - https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo. Также Fiddler классная вещь - умеет и httpS проксировать через подмену сертификата, бесплатен, много статистики по запросам, можно формировать post и т.д.
17. Steve Gordon (SGordon1) 04.05.16 16:36
(5) YAGolova, Про аутентификацию - еще варианты имеются, а то у нас Служба сервера Предприятия 1с запускается с системной учетной записью на соседнем сервере и как бы трогать ее не хочется... А нельзя заставить пул приложений IIS аутентифицироваться?
18. Максим Кузнецов (Makushimo) 27.05.16 10:16
А расходует ли http-сервис лицензионный ключ 1С?
и каким образом?
19. Андрей Овсянкин (Evil Beaver) 27.05.16 10:28
(18) Makushimo, расходует. Один вызов = один сеанс, со всеми вытекающими.
20. Sergey Andreev (starik-2005) 27.05.16 21:00
(19) Evil Beaver, в веб-сервисах (SOAP) тоже сеанс стартует, но лицензию не жрет.
21. Code Null (CodeNull) 01.06.16 10:38
(5) YAGolova, что это даст? http-сервис станет доступен без авторизации и методы всегда будут выполняться под одним пользователем 1С?

Добавлю, что по-умолчанию 1С запрашивает стандартную Basic авторизацию в форму которой вводим логин и пароль пользователя 1С. В браузере FireFox есть проблема с авторизацией, если логин или пароль имеют русские буквы.
22. Сергей Курышов (sudmorsh) 01.06.16 16:50
Спасибо, ты помог мне сэкономить кучу времени и сил
23. bonv (bonv) 03.06.16 12:06
(19) Evil Beaver, для сервисов (HTTP, SOAP) это правило не работает. Технически клиентские лицензии не требуются. Юридически - нужно столько клиентских лицензии сколько одновременно запущенно сеансов.
24. serko krav (serko8547) 26.08.16 17:13
Ув. Автор, прошу Вас поделиться опытом:
Я начал использовать http-сервисами недавно, и напоролся на такую проблему: Если в 1с завести пользователя - то мне ответ на любой Get или post запрос приходит Ошибка 401 (не авторизован). Как быть?
Был бы Вам очень благодарен, если Вы подскажете, как решить сию проблему )

авторизация в смысле запросом логина-пароли - программно, т.е. я не ручками ввожу логин-пароль, а как мне авторизоваться программно.
25. Megas Master (megaster) 14.11.16 10:51
Спасибо автору! Прочитав статью - все стало предельно ясно и сразу запустил http сервис... до этого ерунда какая-то получалась
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа