gifts2017

HOWTO: создание и отладка HTTP-сервиса в 1С:Предприятие

Опубликовал Serg (serg_infostart) в раздел Программирование - Практика программирования

Статья о том, как можно быстро создать HTTP-сервис в 1С:Предприятие и как выполнять его отладку.

Начнем с конца: что в итоге должно получиться...

Создание HTTP-сервиса.

Предположим, что нам нужен HTTP-сервис, который по запросу вернет список пользователей.

Выглядеть он должен следующим образом: http://localhost/base/hs/info?action=getusers

Возвращать должен строку JSON (массив объектов JSON со свойствами: имя пользователя, id пользователя):

[
 { "name": "Администратор", "id": "563e7509-83bb-11e5-80c3-00505601174a" },
 { "name": "Гость", "id": "423a9d3d-88fc-11e5-80c3-00505601174a" } 
]

Чтобы это реализовать, создадим в конфигурации (или в расширении) объект HTTP-сервис. Как он будет называться – неважно, для простоты назовем его «Инфо». Корневой URL должен быть равен «info».

HTTP-service creation

Далее добавим к нему шаблон URL, для простоты назовем его «Основной». Значение шаблона должно быть равно «/*».

Шаблоны URL

К шаблону мы добавим метод GET: имя = «GET», HTTP-метод = «GET».

Method adding

Примечание. Имя метода рекомендуется назначать по имени HTTP-метода.

Создадим обработчик HTTP-метода GET.

Handle setting

По умолчанию процедура обработчика метода заполнена кодом, возвращающим стандартный успешный HTTP ответ (код 200).

Функция ОсновнойGET(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	Возврат Ответ;
КонецФункции

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

Функция ОсновнойGET(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	Если НРЕГ(Запрос.ПараметрыЗапроса.Получить("action")) = "getusers" Тогда
		Ответ.УстановитьТелоИзСтроки(ВернутьСписокПользователей());
	КонецЕсли;
	Возврат Ответ;
КонецФункции 

Функция ВернутьСписокПользователей()
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Пользователи.Ссылка
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	Пользователи.Недействителен = ЛОЖЬ";
	Выборка = Запрос.Выполнить().Выбрать();
	ОтветМассив = Новый Массив;
	Пока Выборка.Следующий() Цикл
		ОтветМассив.Добавить(Новый Структура("name,id",Выборка.Ссылка.Наименование,""+Выборка.Ссылка.УникальныйИдентификатор()));
	КонецЦикла;
	
	Ответ = Новый ЗаписьJSON;
	Ответ.УстановитьСтроку();
	ЗаписатьJSON(Ответ,ОтветМассив); // сериализует ОтветМассив в формат JSON
	Возврат Ответ.Закрыть();
КонецФункции

Проверяем результат:

Result

Отладка HTTP-сервиса.

Настройка подключения отладчика.

Для отладки HTTP-сервиса нужно включить (или убедиться в том, что включено) следующие флажки.

  1. Разрешить отладку HTTP-сервисов в меню публикации 1С:Предприятие (Конфигуратор / Администрирование / Публикация на веб сервере…).
    Включение отладки
    Адрес отладчика – адрес компьютера, где мы будем запускать конфигуратор (обратите внимание на синтаксис: «tcp://<адрес отладчика>»).
  2. Включить автоматическое подключение к HTTP-сервисам на сервере (Конфигуратор / Отладка / Подключение…).
    Set up autoconnection
    Set up autoconnection 2

Проверим, как это все работает.

Поставим точку останова в начале функции метода GET:

Breakpoint

Обновляем страничку с вызовом нашего сервиса.

Site open

Убеждаемся, что наш отладчик успешно подключился к сеансу HTTP-сервиса:

Check breakpoint catch

Check value of variables

Заключение.

В этой статье рассмотрен простейший пример для быстрого создания HTTP-сервиса с целью освоения механизмов работы с ним.

В заключении хотелось бы упомянуть про возможность создания HTTP-сервисов с параметрами URL, например:

Parts of link description 

Эта возможность настраивается в ШаблонеURL HTTP-сервиса.

Для вышеуказанного примера шаблон мог бы выглядеть так: «/users/{idПользователя}/*» или так «/{Раздел}/{id}/*».

Another template example

В функции обработчика метода этого шаблона параметры URL можно получить через свойство Запрос.ПараметрыURL, например так:

Запрос.ПараметрыURL[«idПользователя»]

Example for template params

Обратите внимание на последовательность обработки шаблонов HTTP­-сервиса.

В нашем примере использованы 2 шаблона:

  1. /*
  2. /users/{idПользователя}/*

При вызове метода http://10.211.55.3/base/hs/info/users/0b3dcecf-104e-11e6-9bdd-001c42ecfab6?action=disable сработает шаблон 1, т.к. параметры URL ему также соответствуют, а обрабатывается он первым. Чтобы этого не происходило, первый шаблон рекомендуется изменить на «/i/*» для однозначного соответствия URL шаблону.

Вызывать первый метод соответственно также придется с новым URL:

Check new template 

См. также

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

Комментарии

1. Михаил Зотов (ZOMI) 26.07.16 00:11
Значительная часть статьи украдена отсюда

Интересно почему нет никаких указаний что это не оригинал, а сперто. Даже если это коллеги делятся - как-то не принято выдавать за свой труд чужие статьи.


JohnyDeath; Rustig; +2 Ответить 3
2. Максим Кузнецов (Makushimo) 26.07.16 05:41
(1) ZOMI,
чуть было не плюсанул ))
3. Олег Дмитров (baracuda) 26.07.16 08:48
4. Василий Казьмин (awk) 26.07.16 10:23
(1) ZOMI, Прочитал - статьи разные. Список источников конечно указывать хорошо, но это на усмотрении модераторов - плюсанул...
5. Михаил Зотов (ZOMI) 26.07.16 10:32
(4) awk, конечно, разные. Но речь о том что большая часть из другой статьи. И видимо чужой. Так что плюсанули вы плагиатору.
6. Sergey Andreev (starik-2005) 26.07.16 11:57
(5) ZOMI, с учетом того, что скопипастена только часть "Заключение", а сама статья весьма уникальна, Ваше мнение несколько странно смотрится.
7. Михаил Зотов (ZOMI) 26.07.16 12:30
(6) starik-2005,

скопипастена только часть

нет, смотрите внимательнее.

Обычный плагиат.

а сама статья весьма уникальна


да, ну?

http://its.1c.ru/db/metod8dev/content/5756/hdoc
8. Serg (serg_infostart) 26.07.16 17:05
(1) ZOMI,
это оригинал... можете не сомневаться. Надеюсь, что автор статьи по ссылке это подтвердит. Так что плюсуйте, не стесняйтесь.
Так получилось, что он разместил ее там, слегка разбив на разделы. А я разместил ее здесь (как есть).
JohnyDeath; ZOMI; +2 Ответить 1
9. Sergey Andreev (starik-2005) 26.07.16 20:11
(7) ZOMI, здесь Вы противоречите своему первому посту, где сказали, что значительная часть статьи на кодерлайне, и якобы автор ее скопипастил оттуда, а на то, что с кодерлайна только заключение, Вы сцылку на 1С-ный сайт даете...

А с другой стороны, чем больше о веб-сервисах напишут, тем лучше жить, а то меня убивают люди, которые увидев код создания объявления и прокси, начинают грызть ногти и выдавать реплики о том, что первый раз такое видят.
TreeDogNight; h00k; serg_infostart; awk; +4 Ответить 2
10. Михаил Зотов (ZOMI) 26.07.16 22:50
(8) serg_infostart,
Надеюсь, что автор статьи по ссылке это подтвердит.


Да, это необходимо для таких скептиков как я.

(9) starik-2005,

ссылку на статью с ИТС я даю к замечанию об "уникальности" статьи. По мне так итс-ная статья более годная.
11. Дмитрий Жиляков (Zhilyakovdr) 27.07.16 09:14
(7) ZOMI, Не у всех и не везде есть доступ к ИТС, поэтому даже тупой копипаст бывает полезен.
12. Сергей Старых (tormozit) 27.07.16 22:23
Согласен с мнением, что высок уровень копирования другой статьи. Поэтому тоже считаю, что стоит указать на нее ссылку.
13. Сергей Старых (tormozit) 28.07.16 09:33
(9) На кодерлайне 3 статьи, которые склеены здесь в одну. В сумме скопировано на вскидку около 80%.
14. Serg (serg_infostart) 28.07.16 14:06
(13) если б она была первоисточником, то указал бы... А поскольку первоисточником является именно эта статья, правда опубликованная несколько позже той, то указывать не буду. Да по факту, это одна и та же статья, только в разных форматах - там она разбита на несколько частей, может чуть порезана. Мне кажется, что там она не удобна для чтения и переваривания. Тут лучше. Имхо.

(all) а по существу нет никаких замечаний, пожеланий, дополнений?
15. serko krav (serko8547) 26.08.16 17:17
Ув. Автор, прошу Вас поделиться опытом:
Я начал использовать http-сервисами недавно, и напоролся на такую проблему: Если в 1с завести пользователя - то мне ответ на любой Get или post запрос приходит Ошибка 401 (не авторизован). Как быть?
Был бы Вам очень благодарен, если Вы подскажете, как решить сию проблему )

авторизация в смысле запросом логина-пароли - программно, т.е. я не ручками ввожу логин-пароль, а как мне авторизоваться программно.
16. Serg (serg_infostart) 28.08.16 23:06
(15) serko8547, нужно передать авторизацию.
xhr.setRequestHeader('Authorization',"Basic " + btoa(escape('Администратор') + ":" + 'password'));
17. Евгений Маляров (unpete) 07.09.16 19:45
(16) serg_infostart,
btoa(escape('Администратор') + ":" + 'password')
Наверное, имелось в виду btoa(unescape(encodeURIComponent(('Администратор') + ":" + 'password')))

Вариант btoa(escape... сделает негодную строку для символов с кодами > 127
zarucheisky; serg_infostart; +2 Ответить 1
18. Serg (serg_infostart) 08.09.16 11:33
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа