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 не будет опубликован. Обязательные поля помечены *