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

Обмен - Интеграция с WEB

http

344
Если вы ничего не понимаете в 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>.

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

344

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. TitanLuchs 90 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
YAGolova; +1 Ответить
6. YAGolova 344 22.04.16 15:45 Сейчас в теме
(1) TitanLuchs, Спасибо за уточнение и ссылочку, поправлю)
2. sasha777666 265 22.04.16 02:31 Сейчас в теме
Отличная статья, была бы она год назад.....
3. Makushimo 152 22.04.16 06:06 Сейчас в теме
Лучше поздно, чем никогда.
Все понятно.
Спасибо!
4. SGordon1 22.04.16 14:52 Сейчас в теме
По аутентификации подскажите, под каким пользователем это должно работать, концепция так сказать какая должна быть?
5. YAGolova 344 22.04.16 15:44 Сейчас в теме
(4) SGordon1, Служба сервера Предприятия 1с запускается от имени какого-то пользователя Windows, в базе 1С заводим пользователя и устанавливаем у него аутентификацию операционной системы и связываем с тем пользователем, от имени которого запускается сервер предприятия
Taxes; SGordon1; +2 Ответить
17. SGordon1 04.05.16 16:36 Сейчас в теме
(5) Про аутентификацию - еще варианты имеются, а то у нас Служба сервера Предприятия 1с запускается с системной учетной записью на соседнем сервере и как бы трогать ее не хочется... А нельзя заставить пул приложений IIS аутентифицироваться?
21. CodeNull 01.06.16 10:38 Сейчас в теме
(5) что это даст? http-сервис станет доступен без авторизации и методы всегда будут выполняться под одним пользователем 1С?

Добавлю, что по-умолчанию 1С запрашивает стандартную Basic авторизацию в форму которой вводим логин и пароль пользователя 1С. В браузере FireFox есть проблема с авторизацией, если логин или пароль имеют русские буквы.
50. androgin 27.03.18 19:58 Сейчас в теме
(5) Пример: 4 роли в базе подключаются через http-сервис.
Если все они будут подключаться через системного пользователя - будет бардак (всем будут доступны одни и те же данные)!
Подключаться нужно под учетками пользователей 1С с учетом их ролей.
7. skif47 305 22.04.16 16:11 Сейчас в теме
Спасибо, ты помог мне сэкономить кучу времени!
8. Steelvan 23.04.16 10:18 Сейчас в теме
Чем табличку генерировали для примера ?
9. Xershi 388 23.04.16 10:27 Сейчас в теме
Если я умею пользоваться веб сервисом, то для чего мне нужен ашттп?
11. TitanLuchs 90 23.04.16 14:49 Сейчас в теме
(9) Xershi, http-сервисы быстрее
10. starik-2005 1415 23.04.16 10:40 Сейчас в теме
Хорошая статья. Дергать HTTP-сервисы можно с помощью простого расширения к гугл-хрому "Бумеранг" - и не надо никаких сторонних сайтов. Единственное, чего мне лично не хватает в статье - это содержимого файла default.vrd. Можете опубликовать, а то в Linux-системах 1С по-умолчанию публикует только саму базу без сервисов (из командной строки если это делать).
12. TitanLuchs 90 23.04.16 14:50 Сейчас в теме
(10) starik-2005, http можно и просто из строки адреса браузера дергать посредством get-запросов.
13. starik-2005 1415 23.04.16 17:23 Сейчас в теме
(12) TitanLuchs, GET - да, а POST - нет.
14. TitanLuchs 90 23.04.16 21:24 Сейчас в теме
(13) starik-2005, в общем-то так я и написал. Но в 99.9% случаев достаточно get и строки адреса браузера.
15. starik-2005 1415 23.04.16 22:29 Сейчас в теме
(14) TitanLuchs, у разных людей разные случаи. Я вот, например, при интеграции маленькими пакетами не обмениваюсь - стараюсь сначала все подготовить, потом одним пакетом данные передать. А тут уже, сами понимаете, никаких GET. Да и вообще о запросах в цикле давно сказано, что глупости это ))
16. CSiER 19 25.04.16 06:24 Сейчас в теме
(10) starik-2005, мне вот это расширение очень понравилось - https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo. Также Fiddler классная вещь - умеет и httpS проксировать через подмену сертификата, бесплатен, много статистики по запросам, можно формировать post и т.д.
18. Makushimo 152 27.05.16 10:16 Сейчас в теме
А расходует ли http-сервис лицензионный ключ 1С?
и каким образом?
19. Evil Beaver 5282 27.05.16 10:28 Сейчас в теме
(18) Makushimo, расходует. Один вызов = один сеанс, со всеми вытекающими.
20. starik-2005 1415 27.05.16 21:00 Сейчас в теме
(19) Evil Beaver, в веб-сервисах (SOAP) тоже сеанс стартует, но лицензию не жрет.
23. bonv 108 03.06.16 12:06 Сейчас в теме
(19) Evil Beaver, для сервисов (HTTP, SOAP) это правило не работает. Технически клиентские лицензии не требуются. Юридически - нужно столько клиентских лицензии сколько одновременно запущенно сеансов.
30. Makushimo 152 22.03.17 05:26 Сейчас в теме
(19) я поэкспериментировал с лицензиями, оказалось одно соединение = 1 лицензия.
со страницы html за разными ресурсами было сделано примерно 15 запросов. Это я считал, сколько раз в обработчике метода НТТР-сервиса сработает точка останова. Но при этом набрав 5 соединений, дальнейший рост их прекратился.
Это я к тому что не 15 лицензий сожрало, а всего 5.
Лицензии съедает веб сервер, который принимает запросы. Он открывает соединение и через него уже открывает сеансы для обращения к базе.

Или я чего-то не того нагородил?
31. CSiER 19 22.03.17 10:33 Сейчас в теме
(30), возможно, что использовались уже существующие соединения из пула ( https://its.1c.ru/db/v8doc#content:26:1:issogl2_3.12.2.элементpool ) - то есть 5 существующих соединений обработали 15 запросов (поэтому и лицензий ушло 5).
22. sudmorsh 54 01.06.16 16:50 Сейчас в теме
Спасибо, ты помог мне сэкономить кучу времени и сил
24. serko8547 96 26.08.16 17:13 Сейчас в теме
Ув. Автор, прошу Вас поделиться опытом:
Я начал использовать http-сервисами недавно, и напоролся на такую проблему: Если в 1с завести пользователя - то мне ответ на любой Get или post запрос приходит Ошибка 401 (не авторизован). Как быть?
Был бы Вам очень благодарен, если Вы подскажете, как решить сию проблему )

авторизация в смысле запросом логина-пароли - программно, т.е. я не ручками ввожу логин-пароль, а как мне авторизоваться программно.
25. megaster 47 14.11.16 10:51 Сейчас в теме
Спасибо автору! Прочитав статью - все стало предельно ясно и сразу запустил http сервис... до этого ерунда какая-то получалась
26. Prisian 31.01.17 09:48 Сейчас в теме
Спасибо за статью! В ней более понятно описано как использовать параметры. Еще бы хотелось увидеть как программно, без запроса у пользователя, авторизоваться в 1С. Чтобы сайт сам, автоматически, подключался к 1С под определенным пользователем, без запроса данных.
27. Дмитрий Рудаков 176 21.03.17 11:50 Сейчас в теме
Спасибо автору, только вот вопрос как через HTTP-сервисы отправлять и получать картинки ?
28. starik-2005 1415 21.03.17 12:36 Сейчас в теме
(27)
отправлять и получать картинки
Берете картинку и кодируете ее в base64, помещаете в тело (или в XML, который помещаете в тело) и отправляете. Ну и обратно - из тела берете base64 (или из XML), после чего декодируете и используете по назначению (или даже не по назначению).
29. Cyberhawk 108 21.03.17 21:15 Сейчас в теме
Благодарю, упоминание в статье указания в заголовке контент-типа "text/html" помогло возвращать картинки из базы 1С в виде готовой картинки в браузере
32. V.Stavinsky 179 22.03.17 12:02 Сейчас в теме
Спасибо, хорошая статья :)
33. Afanasyev.sv@mail.ru 26.04.17 16:34 Сейчас в теме
Спасибо за статью.

Понравились фразы вида:
"(для простого тупого 1С-ника)"
"чтобы вас в прогрессивном мире не засмеяли"
34. system-3000 20.05.17 15:34 Сейчас в теме
35. Yashazz 2292 28.05.17 11:57 Сейчас в теме
Хорошая статья. Всё понятно с первого раза. Ничего лишнего, всё по делу, внятно, лаконично, без популизма и "воды". Спасибо!
36. dimasts 23 08.07.17 11:32 Сейчас в теме
Как всё-таки без запроса авторизации заставить его работать? Чтобы можно было по ссылке обращаться и получать ответ.
37. CSiER 19 09.07.17 13:13 Сейчас в теме
(36)
Как всё-таки без запроса авторизации заставить его работать? Чтобы можно было по ссылке обращаться и получать отве

на время тестирования можно добавить реквизиты прямо в URL (для примера из статьи):
http://LOGIN:PASSWORD@localhost/GolovaNews/hs/СтатусыЗаказов/hrc225
другой вариант - настройка web-сервера.
38. dimasts 23 09.07.17 15:25 Сейчас в теме
(37)Причина в типе метода который я выбрал. Там по умолчанию GET стоял, а надо ставить POST, а ещё лучше любой, чтобы понять, какие запросы вообще приходят.
39. dimasts 23 09.07.17 15:27 Сейчас в теме
(37)За строку авторизации спасибо, долго искал этот шаблон – не знал как сформулировать поисковику мою потребность.
45. grin_64 36 07.12.17 08:20 Сейчас в теме
47. CSiER 19 07.12.17 13:47 Сейчас в теме
(45), просьба раскрыть комментарий подробнее (я про Excel вообще ничего не писал).
48. grin_64 36 07.12.17 17:33 Сейчас в теме
(47)Создал http-сервис. Из Excel отправляется GET запрос в 1С, возвращается JSON-ответ, парсится и т.д.
Если Excel 2010, то все в порядке, но начиная с 2013 на строке ".Open "GET", sURL, False" Excel останавливается по ошибке
Если убрать LOGIN:PASSWORD@, то открывается окно авторизации с логином и паролем 1С, что не очень гуд. Может, есть еще варианты?
Public Function GetHTTPResponse(ByVal sURL As String) As String
Dim oXMLHTTP
On Error Resume Next
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
With oXMLHTTP
.Open "GET", sURL, False
.setRequestHeader "Cache-Control", "no-store, no-cache"
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.41 Safari/537.36 OPR/35.0.2066.10 (Edition beta)"
.setRequestHeader "Accept-Encoding", "deflate"
.setRequestHeader "Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4"
.send
GetHTTPResponse = .ResponseText
End With
Set oXMLHTTP = Nothing
End Function
49. CSiER 19 12.12.17 15:58 Сейчас в теме
(48), как вариант - попробуйте установить fiddler, выполнить сценарий в обеих версиях Excel и сравнить результаты запросов в fiddler. Про формат URL можно посмотреть на вики.
40. sergei198821 23 24.07.17 15:54 Сейчас в теме
Спасибо, хорошо описано
41. KazanKokos 7 24.07.17 15:58 Сейчас в теме
спасибо. а по вебсервису есть такая статья? я с ним уже работал но хотелось бы также по полочкам разложить
42. starik-2005 1415 24.07.17 22:50 Сейчас в теме
(41) http://infostart.ru/public/440532/ - вот тут с примером на PHP, например.
43. Anton64 215 02.11.17 11:26 Сейчас в теме
(42)
(14)
Коллеги, подскажите, как определить адрес веб-сервера, на котором опубликованы http сервисы клиента? Это можно посмотреть в самой 1С или надо лезть в настройки веб-сервера? Спасибо.
44. CodeNull 02.11.17 14:45 Сейчас в теме
(43) "http сервисы клиента"? Сервисы предоставляет сервер, клиент только обращается к ним. Если у вас есть доступ к клиенту, то адрес сервиса может быть у него либо в настройках, либо в коде. Всё зависит от реализации.
46. vpaoli 25 07.12.17 10:05 Сейчас в теме
Все хорошо, описаны детали - что и как делать. Но к сожалению нет нормального описания самой задачи, которая данным методом решается. Вижу в методе http-сервиса создает отчет. Ну создали, и что дальше ...? Какова конечная цель и как она достигается ?
Описание любой новой технологии всегда полезно сопровождать конкретными примерами.
Оставьте свое сообщение