HTTP-сервисы для тех, кто ничего не понимает в 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>.

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

55 Comments

  1. TitanLuchs

    «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

    Reply
  2. sasha777666

    Отличная статья, была бы она год назад…..

    Reply
  3. Makushimo

    Лучше поздно, чем никогда.

    Все понятно.

    Спасибо!

    Reply
  4. SGordon1

    По аутентификации подскажите, под каким пользователем это должно работать, концепция так сказать какая должна быть?

    Reply
  5. YAGolova

    (4) SGordon1, Служба сервера Предприятия 1с запускается от имени какого-то пользователя Windows, в базе 1С заводим пользователя и устанавливаем у него аутентификацию операционной системы и связываем с тем пользователем, от имени которого запускается сервер предприятия

    Reply
  6. YAGolova

    (1) TitanLuchs, Спасибо за уточнение и ссылочку, поправлю)

    Reply
  7. skif47

    Спасибо, ты помог мне сэкономить кучу времени!

    Reply
  8. Steelvan

    Чем табличку генерировали для примера ?

    Reply
  9. Xershi

    Если я умею пользоваться веб сервисом, то для чего мне нужен ашттп?

    Reply
  10. starik-2005

    Хорошая статья. Дергать HTTP-сервисы можно с помощью простого расширения к гугл-хрому «Бумеранг» — и не надо никаких сторонних сайтов. Единственное, чего мне лично не хватает в статье — это содержимого файла default.vrd. Можете опубликовать, а то в Linux-системах 1С по-умолчанию публикует только саму базу без сервисов (из командной строки если это делать).

    Reply
  11. TitanLuchs

    (9) Xershi, http-сервисы быстрее

    Reply
  12. TitanLuchs

    (10) starik-2005, http можно и просто из строки адреса браузера дергать посредством get-запросов.

    Reply
  13. starik-2005

    (12) TitanLuchs, GET — да, а POST — нет.

    Reply
  14. TitanLuchs

    (13) starik-2005, в общем-то так я и написал. Но в 99.9% случаев достаточно get и строки адреса браузера.

    Reply
  15. starik-2005

    (14) TitanLuchs, у разных людей разные случаи. Я вот, например, при интеграции маленькими пакетами не обмениваюсь — стараюсь сначала все подготовить, потом одним пакетом данные передать. А тут уже, сами понимаете, никаких GET. Да и вообще о запросах в цикле давно сказано, что глупости это ))

    Reply
  16. CSiER

    (10) starik-2005, мне вот это расширение очень понравилось — https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo. Также Fiddler классная вещь — умеет и httpS проксировать через подмену сертификата, бесплатен, много статистики по запросам, можно формировать post и т.д.

    Reply
  17. SGordon1

    (5) Про аутентификацию — еще варианты имеются, а то у нас Служба сервера Предприятия 1с запускается с системной учетной записью на соседнем сервере и как бы трогать ее не хочется… А нельзя заставить пул приложений IIS аутентифицироваться?

    Reply
  18. Makushimo

    А расходует ли http-сервис лицензионный ключ 1С?

    и каким образом?

    Reply
  19. Evil Beaver

    (18) Makushimo, расходует. Один вызов = один сеанс, со всеми вытекающими.

    Reply
  20. starik-2005

    (19) Evil Beaver, в веб-сервисах (SOAP) тоже сеанс стартует, но лицензию не жрет.

    Reply
  21. CodeNull

    (5) что это даст? http-сервис станет доступен без авторизации и методы всегда будут выполняться под одним пользователем 1С?

    Добавлю, что по-умолчанию 1С запрашивает стандартную Basic авторизацию в форму которой вводим логин и пароль пользователя 1С. В браузере FireFox есть проблема с авторизацией, если логин или пароль имеют русские буквы.

    Reply
  22. sudmorsh

    Спасибо, ты помог мне сэкономить кучу времени и сил

    Reply
  23. bonv

    (19) Evil Beaver, для сервисов (HTTP, SOAP) это правило не работает. Технически клиентские лицензии не требуются. Юридически — нужно столько клиентских лицензии сколько одновременно запущенно сеансов.

    Reply
  24. serko8547

    Ув. Автор, прошу Вас поделиться опытом:

    Я начал использовать http-сервисами недавно, и напоролся на такую проблему: Если в 1с завести пользователя — то мне ответ на любой Get или post запрос приходит Ошибка 401 (не авторизован). Как быть?

    Был бы Вам очень благодарен, если Вы подскажете, как решить сию проблему )

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

    Reply
  25. megaster

    Спасибо автору! Прочитав статью — все стало предельно ясно и сразу запустил http сервис… до этого ерунда какая-то получалась

    Reply
  26. Prisian

    Спасибо за статью! В ней более понятно описано как использовать параметры. Еще бы хотелось увидеть как программно, без запроса у пользователя, авторизоваться в 1С. Чтобы сайт сам, автоматически, подключался к 1С под определенным пользователем, без запроса данных.

    Reply
  27. Rudakov_D

    Спасибо автору, только вот вопрос как через HTTP-сервисы отправлять и получать картинки ?

    Reply
  28. starik-2005

    (27)

    отправлять и получать картинки

    Берете картинку и кодируете ее в base64, помещаете в тело (или в XML, который помещаете в тело) и отправляете. Ну и обратно — из тела берете base64 (или из XML), после чего декодируете и используете по назначению (или даже не по назначению).

    Reply
  29. Cyberhawk

    Благодарю, упоминание в статье указания в заголовке контент-типа «text/html» помогло возвращать картинки из базы 1С в виде готовой картинки в браузере

    Reply
  30. Makushimo

    (19) я поэкспериментировал с лицензиями, оказалось одно соединение = 1 лицензия.

    со страницы html за разными ресурсами было сделано примерно 15 запросов. Это я считал, сколько раз в обработчике метода НТТР-сервиса сработает точка останова. Но при этом набрав 5 соединений, дальнейший рост их прекратился.

    Это я к тому что не 15 лицензий сожрало, а всего 5.

    Лицензии съедает веб сервер, который принимает запросы. Он открывает соединение и через него уже открывает сеансы для обращения к базе.

    Или я чего-то не того нагородил?

    Reply
  31. CSiER

    (30), возможно, что использовались уже существующие соединения из пула ( https://its.1c.ru/db/v8doc#content:26:1:issogl2_3.12.2.элементpool ) — то есть 5 существующих соединений обработали 15 запросов (поэтому и лицензий ушло 5).

    Reply
  32. V.Stavinsky

    Спасибо, хорошая статья 🙂

    Reply
  33. Afanasyev.sv@mail.ru

    Спасибо за статью.

    Понравились фразы вида:

    «(для простого тупого 1С-ника)»

    «чтобы вас в прогрессивном мире не засмеяли»

    Reply
  34. system-3000

    Коротко, ясно, четко.

    Reply
  35. Yashazz

    Хорошая статья. Всё понятно с первого раза. Ничего лишнего, всё по делу, внятно, лаконично, без популизма и «воды». Спасибо!

    Reply
  36. dimasts

    Как всё-таки без запроса авторизации заставить его работать? Чтобы можно было по ссылке обращаться и получать ответ.

    Reply
  37. CSiER

    (36)

    Как всё-таки без запроса авторизации заставить его работать? Чтобы можно было по ссылке обращаться и получать отве

    на время тестирования можно добавить реквизиты прямо в URL (для примера из статьи):

    http://LOGIN:PASSWORD@localhost/GolovaNews/hs/СтатусыЗаказов/hrc225

    другой вариант — настройка web-сервера.

    Reply
  38. dimasts

    (37)Причина в типе метода который я выбрал. Там по умолчанию GET стоял, а надо ставить POST, а ещё лучше любой, чтобы понять, какие запросы вообще приходят.

    Reply
  39. dimasts

    (37)За строку авторизации спасибо, долго искал этот шаблон – не знал как сформулировать поисковику мою потребность.

    Reply
  40. sergei198821

    Спасибо, хорошо описано

    Reply
  41. KazanKokos

    спасибо. а по вебсервису есть такая статья? я с ним уже работал но хотелось бы также по полочкам разложить

    Reply
  42. starik-2005

    (41) http://infostart.ru/public/440532/ — вот тут с примером на PHP, например.

    Reply
  43. Anton64

    (42)

    (14)

    Коллеги, подскажите, как определить адрес веб-сервера, на котором опубликованы http сервисы клиента? Это можно посмотреть в самой 1С или надо лезть в настройки веб-сервера? Спасибо.

    Reply
  44. CodeNull

    (43) «http сервисы клиента»? Сервисы предоставляет сервер, клиент только обращается к ним. Если у вас есть доступ к клиенту, то адрес сервиса может быть у него либо в настройках, либо в коде. Всё зависит от реализации.

    Reply
  45. grin_64

    (37)Начиная в Excel 2013 http://LOGIN:PASSWORD@localhost/http не работает…

    Reply
  46. vpaoli

    Все хорошо, описаны детали — что и как делать. Но к сожалению нет нормального описания самой задачи, которая данным методом решается. Вижу в методе http-сервиса создает отчет. Ну создали, и что дальше …? Какова конечная цель и как она достигается ?

    Описание любой новой технологии всегда полезно сопровождать конкретными примерами.

    Reply
  47. CSiER

    (45), просьба раскрыть комментарий подробнее (я про Excel вообще ничего не писал).

    Reply
  48. grin_64

    (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

    Reply
  49. CSiER

    (48), как вариант — попробуйте установить fiddler, выполнить сценарий в обеих версиях Excel и сравнить результаты запросов в fiddler. Про формат URL можно посмотреть на вики.

    Reply
  50. androgin

    (5) Пример: 4 роли в базе подключаются через http-сервис.

    Если все они будут подключаться через системного пользователя — будет бардак (всем будут доступны одни и те же данные)!

    Подключаться нужно под учетками пользователей 1С с учетом их ролей.

    Reply
  51. gosizo

    спасибо за статью

    Reply
  52. ZloyProger

    (37) Доброго времени суток, Коллега. Извиняюсь за некропостинг, но по поводу авторизации уточнить хотел — имеем дефолтно (в принципе особо ничего не химичил с настройками, поставил и всё, виндовс-аутентификацию и прочее не трогал) настроенный IIS, создал в конфигурации http-сервис Test, у него задал шаблон url для описания своих обязательных параметров и добавил метод Get (обработчик метода созданный конструктором не менял, т.е. там просто возврат 200 кода по умолчанию, чтобы я ни передал), опубликовал всё, пытаюсь в строке браузера писать http://www:123@localhost/demo_buh/hs/Test/пар1/пар2/пар3/пар4 (www — пользователь базы с адм. правами, 123 — соответственно пароль) и получаю 404 ошибку что ничего не найдено… Просто http://localhost/demo_buh работает, открывает аутентификацию пользователя и после ввода пароля открывает базу. Собственно ЧЯДНТ? Должно ли в каталоге веб-публикации на диске появится что-либо после публикации? (сейчас только default.vrd и web.config)

    Reply
  53. CSiER

    (53) Здравствуйте. В .vrd файле должны появиться настройки работы с базой (строка подключения к базе, опубликованные сервисы, параметры пула соединений и т.п.). 404 ошибка в данном случае выглядит странно — будет ли запрос аутентификации при попытке открыть URL http://localhost/demo_buh/hs/Test/пар1/пар2/пар3/пар4 ?

    Reply
  54. ZloyProger

    (54) Добрый день, спасибо за отклик, Коллега. Всё оказалось в разы проще, чем думал, знаете как самый страшный сон программиста — он написал код, но что-то не работает и он уже часа 3 сидит, скурил 2 пачки, выпил 2 литра кофе — ничего.. зовет коллег на помощь и тут он видит самую наитупейшую семантическую ошибку и с ужасом ждёт, когда же её увидят коллеги 🙂 Ссылка РЕГИСТРОЧУВСТВИТЕЛЬНА блин!! Ну и неплохо после публикации перезапускать IIS тоже говорят помогает)

    Reply
  55. vkozak

    Спасибо за грамотную и лаконичную статью. Помогла быстро разобраться.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *