1С и HTTP сервисы

Компания «1С» активно развивает платформу «1С:Предприятие» и с каждым релизом добавляет новые возможности. После старта развития ветки 8.3 новинок стало появляться особенно много и из-за постоянной занятости не успеваешь их все опробовать в деле. Не так давно я рассказывал и показывал как разработать полноценное мобильное приложение (да-да, на «1С:Предприятие»), а сегодня мне хотелось бы поговорить о создании HTTP-сервисов средствами платформы.

Возможность разработки HTTP-сервисов в составе конфигурации появилась еще в версии 8.3.5. За это время компонента несколько раз обновлялась, и сегодня ей вполне можно пользоваться, не опасаясь за наличие «детских» ошибок. Мне еще не доводилось применять функционал платформы «1С:Предприятие» для создания http-сервисов в реальных условиях, поэтому пока опыт ограничивается учебными проектами. Однако, я вижу перспективы применения механизма http-сервисов в одном из текущих рабочих проектов. В этом цикле небольших заметок попробую показать типовые примеры использования http-сервисов в конфигурациях для платформы «1С:Предприятие».

Создание простейшего http-сервиса в 1С:Предприятие 8.3

Сегодня мы рассмотрим пример самого простейшего http-сервиса, а затем будем его улучшать и усложнять. Цель урока – понять и прочувствовать простоту создания http-сервисов на базе платформы «1С:Предприятие 8.3».

Начнем, с формулировки задачи. Создаваемый в рамках заметки сервис должен уметь всего лишь две вещи: принимать GET запрос и отдавать ответ в формате JSON. Задача банальная и сделать что-то подобное на PHP/ASP .NET дело нескольких строчек кода. Забегая вперед, скажу, что в «1С:Предприятие» нам потребуется примерно столько же (ладно вам, не надо смеяться над странностями платформы 1С).

Про кейсы применения http-сервисов мы поговорим в отдельной заметке, а пока просто создадим новый http-сервис. Для удобства создадим новую информационную базу с пустой конфигурацией. Добавим в нее одну подсистему, которую назовем «ТестированиеHTTPСервисов». Теперь откроем в дереве конфигурации раздел «Общие», найдем в нем группу «HTTP-сервисы» и добавим первый веб сервис. В окне создания нового сервиса заполним поля:

  • Имя — ПервыйВебСервис;
  • Синоним — Первый веб сервис;
  • Корневой URL — our-services;

Обратите внимание на поле «Корневой URL». Указанное здесь наименование будет использоваться при обращении к сервису. Здесь не должно быть пробелов и желательно не использовать кириллицу. С этим разобрались, дальше переходим на закладку «Подсистемы» и добавляем http-сервис в единственную доступную подсистему.

Следующим шагом будет описание шаблона URL. Перейдем на соответствующую закладку и добавим шаблон с именем «ВывестиСписокУслуг». В инспекторе свойств найдем свойство «Шаблон» и напишем в нем «/list». Этим самым мы зададим путь, по которому будет происходить взаимодействие с http-сервисом. Шаблон может содержать специальные символы, позволяющие определить передаваемые параметры (как обязательные, так и нет), но для первого примера мы ограничимся простым «/list». При переходе по этому пути будет срабатывать наш единственный метод, и отдавать клиенту набор данных.

Отлично, шаблон есть, теперь дело за методом. Добавим для нашего шаблона, который назовем getServicesList. В инспекторе свойств нам необходимо указать HTTP-метод. Указанное значение определяет, на какие типы запросов будет реагировать наш метод. Текущая задача вполне позволяет обойтись методом «GET”.

Наш сервис почти готов, остается только прописать обработчик события для сконструированного метода getServicesList. Создать обработчик события можно через инспектор свойств. В теле обработчика пишем:

Функция ВывестиИндексgetServicesList(Запрос) МассивУслуг = Новый Массив; МассивУслуг.Добавить(Новый Структура(«title, description», «Услуга №1», «Описание услуги №1»)); МассивУслуг.Добавить(Новый Структура(«title, description», «Услуга №2», «Описание услуги №2»)); МассивУслуг.Добавить(Новый Структура(«title, description», «Услуга №3», «Описание услуги №3»)); МассивУслуг.Добавить(Новый Структура(«title, description», «Услуга №4», «Описание услуги №4»)); ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, МассивУслуг); СтрокаДляОтвета = ЗаписьJSON.Закрыть(); Ответ = Новый HTTPСервисОтвет(200); Ответ.Заголовки.Вставить(«Content-type», «application/json; charset=utf-8»); Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Возврат Ответ; КонецФункции

Разберем приведенный код чуть подробней. В самом начале я описываю массив, состоящий из структур. Этот массив нам нужен сугубо для демонстрации. Все его содержимое мы переведем в JSON и отдадим клиенту. Инициализируем объект типа ЗаписьJSON. Обязательно вызываем метод УстановитьСтроку(), т.к. нам необходимо получить текст JSON в строковую переменную. Далее вызываем глобальный метод ЗаписатьJSON(), которому передаем объект типа ЗаписьJSON и массив, который необходимо конвертнуть. Дальше получаем результат в переменную «СтрокаДляОтвета» и готовим HTTP-ответ.

В ответ мы добавляем (см. метод «УстановитьТелоИзСтроки») получившийся JSON. Все, код демонстрационного примера готов и можно переходить к тестам.

Публикация HTTP-сервиса в 1С:Предприятие 8.3

Опубликуем созданный HTTP-сервис для тестирования результатов проделанной работы. Для простейшего теста в вашей систем должен быть установлен веб-сервер. У меня роль веб-сервиса выполняет Apache. Шаги, необходимые для установки/настройки веб-сервера мы пропустим, а перейдем к вопросу публикации HTTP-сервиса.

Для публикации необходимо перейти в меню «Администрирование» и выбрать пункт «Публикация на веб-сервере». В появившемся окне заполняем:

  • Имя – имя нашего решения. Оно будет использоваться в URL при доступе к опубликованной ИБ. Например, если указать здесь test, то ваша ИБ будет доступна по адресу http://localhost/test. Меня устраивает вариант test.
  • Веб-сервер — Заполняется автоматически. У меня в качестве веб-сервера используется Apache 2.2;
  • Каталог – путь к директории, в которую будет помещен конфигурационный файл публикуемой ИБ;
  • Снимаем флажки «Публиковать тонкий клиент и веб-клиент», «Публиковать стандартный интерфейс OData», «Публиковать WEB-сервисы по умолчанию»;
  • На вкладке HTTP-сервисы отмечаем флаг «Публиковать HTTP-сервисы по умолчанию» и в табличной части отмечаем созданный сервис.

Нажимаем кнопку «Опубликовать», платформа предложит перезапустить веб-сервер – соглашаемся.

Тестируем HTTP-сервис

Для тестирования созданного http-сервиса запустим какой-нибудь браузер и попробуем обратиться к нему. Если вы повторяли все мои действия, то путь должен получиться таким:

http://localhost:9090/services/hs/our-services/list

Стоит обратить внимание на порт 9090, который указан через двоеточие после имени хоста. Если вы ставили Apache с настройками по умолчанию, то у вас он будет слушать 80-й порт, следовательно, ничего указывать не нужно. В итоге URL будет таким:

http://localhost/services/hs/our-services/list

Попробуйте перейти по нему, и если все работает корректно, вы получите страницу с данными в JSON формате:

На этом рассмотрение демонстрационного примера можно заканчивать, но мне хотелось бы напоследок разобрать URL на составляющие элементы, чтобы было понятно почему мы получили именно такую ссылку.

Итак, первая часть должна быть понятна – localhost. Это имя хоста, на котором установлен веб-сервер. Дальше указывается ссылка (services) на опубликованную ИБ. Следом идет hs, этот элемент пути указывает, что нас интересует взаимодействие с http-сервисом. Последние два элемента – корневой URL нашего сервиса и шаблон URL.

Вместо заключения

«1С:Предприятие 8.3» позволяет создавать простые HTTP-сервисы с минимум трудозатрат в чем вы и должны были убедиться после прочтения этой небольшой заметки. Функциональная возможность существенно расширяет варианты применения платформы. В следующих заметках мы поговорим о практических кейсах применения технологии и рассмотрим реализацию различных решений на практике.

В технологической платформе версии 8.3.5 была реализована возможность автоматически формировать REST интерфейс OData для всего прикладного решения. Таким образом у нас появилась возможность предоставить полный доступ стороннему приложению к базе 1С буквально за пару кликов.

Данный механизм предназначен для решения нескольких часто встречающихся задач:

  • Выгрузка/загрузка данных в/из прикладного решения;
  • Интеграция с интернет-сайтами (интернет-магазинами);
  • Наращивание функциональности прикладного решения без изменения конфигурации;
  • Интеграция с другими корпоративными системами (иногда и без дополнительного программирования).

REST интерфейс OData можно использовать для обмена данными между базами 1С, но так как для этого уже существуют другие, более удобные, механизмы, то основное предназначение REST интерфейса OData видится в интеграции со сторонними системами.

И это действительно удобно, если учесть, что клиенты OData существуют на всех основных платформах, соответствующие библиотеки можно скачать .

В этой статья я попробую подробно рассказать о том, что такое REST интерфейс OData и как его можно использовать.

Публикация REST интерфейса OData

Для использования интерфейса OData его нужно опубликовать, а для этого нам потребуется веб-сервер — Apache 2.2 или IIS (начиная с версии платформы 8.3.8 еще и Apache 2.4). Затем, нужно зайти в меню «Администрирование»->»Публикация на веб-сервере…».

В открывшемся окне заполняем нужные поля и жмем «Опубликовать»:

Публикация интерфейса OData

После этого нужно будет определить состав интерфейса OData, т.е. указать — какие объекты конфигурации в него входят, а какие нет (изначально в составе нет ни одного объекта).

Сделать это можно примерно так:

1 2 3 4 5 6 7 &НаСервере Процедура УстановитьODataНаСервере() тМассив = Новый Массив; тМассив.Добавить(Метаданные.Справочники.Товары); УстановитьСоставСтандартногоИнтерфейсаOData(тМассив); КонецПроцедуры

На Инфостарте есть отличная обработка на эту тему.

Если конфигурация работает в режиме совместимости с версией 8.3.4 и ниже, то установить состав интерфейса OData нельзя — в это случае автоматически доступны все объекты конфигурации.

Все, стандартный интерфейс OData настроен, запущен и ожидает клиентских подключений.

Пример использования

Для различных операций используются различные HTTP-методы:

  • Получение данных — GET;
  • Создание объектов — POST;
  • Обновление данных — PATCH/PUT (в зависимости от того, сколько свойств объекта нужно обновить);
  • Удаление данных — DELETE.

Проверить состав стандартного интерфейса можно, получив описание этого самого интерфейса при помощи браузера:

Результат:

Описание интерфейса OData

Для проверки получения данных, введем вот такой запрос:

где:

  • HTTPTest — имя при публикации;
  • odata/standard.odata/ — обязательная часть, признак обращения к интерфейсу OData;
  • Catalog_Товары — имя ресурса сформированное по правилу (об этом чуть ниже);
  • ?$format=json — необязательный параметр обращения к ресурсу.

Результат выполнения запроса выглядит так:

Результат выполнения запроса

Правила доступа к ресурсам

Имя ресурса формируется по следующему правилу:

ПрефиксИмени_ИмяОбъектаКонфигурации_СуффиксИмени.

С помощью стандартного интерфейса OData можно получить доступ к следующим объектам (ПрефиксИмени):

  • Справочник — Catalog;
  • Документ — Document;
  • Журнал документов — DocumentJournal;
  • Константа — Constant;
  • План обмена — ExchangePlan;
  • План счетов — ChartOfAccounts
  • План видов расчета — ChartOfCalculationTypes;
  • План видов характеристик — ChartOfCharacteristicTypes;
  • Регистр сведений — InformationRegister;
  • Регистр накопления — AccumulationRegister;
  • Регистр расчета — CalculationRegister;
  • Регистр бухгалтерии — AccountingRegister;
  • Бизнес-процесс — BusinessProcess;
  • Задача — Task.

ИмяОбъектаКонфигурации — свойство «Имя» объекта конфигурации так, как оно задано в конфигураторе.

СуффиксИмени — нужен для уточнения имени ресурса, необязателен, может принимать следующие значения:

  • Имя табличной части объекта;
  • Имя виртуальной таблицы объекта;
  • RowType — строка табличной части объекта;
  • RecordType — отдельная запись регистра.

Параметры обращения к ресурсам

После формирования имени ресурса нужно определить параметры обращения к ресурсу, некоторые из параметров доступны только начиная с релиза платформы 8.3.8.1652:

  • $format — указывает формат возвращаемых данных, вариантов два:
    • $format=atom — данные в формате atom-xml;
    • $format=json — данные в формате json;
  • $metadata — возвращает описание стандартного интерфейса OData (используется без указания суффикса имени, пример на одном из изображений выше);
  • $filter — отбор при получении данных (более подробно ниже);
  • $select — перечисление свойств сущности, которые попадут в результат запроса;
  • $top — ограничение количества возвращаемых записей (8.3.8.1652);
  • $skip — убирает из результата запроса указанное количество записей (8.3.8.1652);
  • $count — возвращает количество записей в выборке запроса (8.3.8.1652);
  • $inlinecount=allpage(=none) — добавляет в результат запроса информацию о количестве записей (8.3.8.1652);
  • $orderby=<Реквизит1> asc, <Реквизит2> desc — сортировка результата запроса (8.3.8.1652);
  • alloweOnly — только разрешенные (используется без знака «$»).

Арифметические и логические операции

Для задания отбора параметром $filter могут быть использованы следующие операции, логические:

и арифметические:

Кроме этого, для обозначения приоритета операции могут использоваться «скобки».

Формируя условия отбора важно не забывать о том, что логические и арифметические операции имеют разный приоритет, при этом операции с одинаковым приоритетом исполняются слева направо. Ниже приведен список логических и арифметических операций в порядке уменьшения приоритета:

  • ( ) — повышение приоритета операции;
  • / — навигация;
  • «-» — арифметическое отрицание;
  • not — логическое отрицание;
  • mul — умножение;
  • div — деление;
  • add — сложение;
  • sub -вычитание;
  • gt — больше;
  • ge — больше или равно;
  • lt — меньше;
  • le — меньше или равно;
  • eq — равно;
  • ne — не равно;
  • and — логическое «И»;
  • or — логическое «ИЛИ».

Функции

При формировании условий запроса (filter) или формировании реквизита по которому выполняется сортировка (orderby) могут применяться следующие функции. Все функции доступны только начиная с релиза 8.3.8.1652.

Строковые функции:

Строковые функции

Функции работы с датами:

Функции работы с датами

Прочие функции:

Прочие функции

Коды ошибок

При возникновении ошибочных ситуаций возвращается ответ с HTTP-статусом 4XX или 5XX. Статус 5XX означает ошибку на стороне сервера (само собой исправлять эту ошибку нужно тоже на сервере), а вот статус 4XX означает ошибку на нашей, клиентской, стороне и в ряде случаев вместе со статусом может быть предан код ошибки и информационное сообщение. Ниже перечислены внутренние коды ошибок и их описание:

Коды ошибок

На этом все, обзор основных моментов использования технологии OData в 1С завершен. Надеюсь что данный материал Вам помог.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

В дополнение к автоматическому REST интерфейсу прикладного решения в платформе существует возможность создания собственных произвольных HTTP-сервисов в прикладном решении.

Разработчик самостоятельно, с помощью встроенного языка, формирует ответ на запрос. При этом есть удобный доступ к телу, заголовкам и строке исходного запроса, а также есть возможность формировать код, тело и заголовки ответа по своему усмотрению.

По сравнению с имеющимися в платформе SOAP web-сервисами, HTTP-сервисы имеют ряд преимуществ:

  • Простота программирования клиента таких сервисов;
  • Потенциально меньший объем передаваемых данных;
  • Потенциально меньшая вычислительная нагрузка;
  • HTTP-сервисы ориентированы на «ресурсы», в то время как SOAP сервисы ориентированы на «действия».

Первые три фактора особенно важны для приложений, работающих на мобильных устройствах.

Можно использовать HTTP-сервисы как «легкие» RPC-сервисы, не требующие сложной подготовки XML-пакетов. Методы могут идентифицироваться в URL, а параметры могут передаваться в опциях запроса, или в его теле. В последнем случае такие сервисы уже вплотную приближаются как SOAP, проигрывая ему в четкости спецификации, но выигрывая в гибкости.

По своему «конструктивному исполнению» HTTP-сервисы очень напоминают web-сервисы, имеющиеся в платформе. Точно так же есть специальный объект конфигурации HTTP сервис. Такие объекты добавляются в ветку Общие — HTTP-сервисы:

Каждый HTTP-сервис может содержать в себе один или несколько шаблонов. Для каждого шаблона можно создать один или несколько методов, выполняющих обработку данных:

Шаблон задаёт путь, по которому может происходить обращение к HTTP-сервису. В шаблоне можно использовать определённый набор символов, в том числе параметризованные сегменты вида {какой-то текст}.

Для каждого метода указывается, во-первых, обрабатываемый HTTP метод, а также создаётся процедура на встроенном языке, которая и будет выполнять обработку данных. Также можно указать, что будет обрабатываться не какой-то конкретный, а любой HTTP-метод из доступных.

При обращении к такому HTTP-сервису платформа сначала попытается сопоставить URL, по которому произошло обращение, с одним из имеющихся шаблонов и методов. Если сопоставить не удалось, то платформа выдаст код ответа 404 Not Found. Если подходящий метод будет найден, то платформа начнёт выполнение его обработчика, передав в него все имеющиеся в запросе данные в виде объекта встроенного языка HТТРСервисЗапрос:

Из этого объекта можно легко получить, например, параметры, содержащиеся в исходном URL, и использовать их для извлечения из базы нужных данных.

Полученные данные можно вернуть в разных форматах. Например, их можно преобразовать в XML, как на картинке выше, или даже просто в текстовую строку с разделителями.

Ответ сервиса формируется специальным объектом встроенного языка HТТРСервисОтвет, в тело которого можно поместить подготовленные данные.

Публикация HTTP-сервисов выполняется аналогично тому, как публикуются web-сервисы. Также аналогичным образом для них работает аутентификация, использование разделения данных и отладка.

Технологии интеграции 1С:Предприятия 8.3

Авторы: Е.Ю. Хрусталева

В платформе версии 8.3.5 появилась возможность создавать HTTP-сервисы. Как и «старые» SOAP web-сервисы, HTTP-сервис позволяет получать/изменять данные, но при этом, как утверждает компания 1С, HTTP-сервисы потенциально позволяют упростить создание клиентских приложений, уменьшить объем передаваемых данных и вычислительную нагрузку, все это особенно для мобильных устройств.

В этой статья я постараюсь рассказать о том, как создавать, отлаживать и использовать HTTP-сервисы в 1С.

Начнем с того, что для создания HTTP-сервиса нам необходим веб-сервер, например Apache 2.2 (начиная с версии 8.3.8 и Apache 2.4 подойдет). Описывать установку веб-сервера думаю нет необходимости.

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

Итак, создаем новый HTTP-сервис:

Новый HTTP-сервис

Корневой URL — важный параметр, входит в адрес по которому сервис будет доступен после публикации.

В соответствующем разделе создаем новый шаблон URL и метод:

Шаблоны URL и методы

У шаблона URL есть единственное свойство — шаблон. Этим свойством можно задать путь по которому будет происходить обращение к HTTP-сервису. В шаблоне можно использовать параметризованные сегменты, как на рисунке ниже (об их использовании ниже).

Свойства шаблона

При обращении к HTTP-сервису, платформа пытается сопоставить адрес, по которому произошло обращение с одним из имеющихся шаблонов и методов. Если сопоставить удалось, то будет выполнен обработчик метода, если же сопоставить не удалось, то будет возвращен код ответа 404.

Свойства метода

Перейдем к примеру обработчика метода, в нем я возвращаю содержимое переменной «Запрос», которая передается в обработчик:

Публикация и проверка HTTP-сервиса

Наш HTTP-сервис готов к публикации, в этом нет ничего сложного (вероятно потребуется запустить конфигуратор от имени администратора):

Публикация HTTP-сервиса

  • localhost — адрес сервера;
  • HTTPTest — имя указанное при публикации;
  • hs — обязательный сегмент пути, дающий понять, что работаем мы именно с HTTP-сервисом;
  • Obmen — корневой URL HTTP-сервиса;
  • test-paramenter/Test — путь к методу внутри сервиса, определяется шаблоном;
  • GetInfo — название метода;
  • ?param=value — необязательный пример передачи методу параметров.

Результат выполнения метода

Параметры URL, параметры запроса и заголовки представлены в виде фиксированных структур.

Вероятнее всего, при обращение к HTTP-сервису нужно будет авторизоваться (если в базе есть хоть один пользователь), есть несколько способов решения этой проблемы.

Первый — изменить файл default.vrd, который находится в каталоге публикации. В этом файле нужно дополнить строку подключения к базе, например, было:

ib=»File=&quot;C:\Base\TEST&quot;;»,

стало:

ib=»File=&quot;C:\Base\TEST&quot;;Usr=Логин;Pwd=Пароль».

В этом случае любые обращения к HTTP-сервису не будут требовать логина и пароля.

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

В других языках программирования аналогично.

Кроме этого можно использовать windows-авторизацию.

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

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

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

Во-вторых, в конфигураторе, в меню «Отладка»->»Подключение…» нужно настроить автоматическое подключение:

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

И, наконец, в-третьих, нужно перезапустить веб-сервер.

Кроме этого для полноценной отладки могут потребоваться сторонние программы, так как браузер всегда старается использовать метод GET. Для тестирования всех остальных HTTP-методов можно использовать бесплатный Fiddler2 (http://www.telerik.com/fiddler).

О чем это здесь рассказывают

На этот раз мы поговорим о механизме платформы 1С:Предприятие — HTTP-сервисы. Подробнее Вы можете прочитать на официальном сайте или посмотреть примеры на Infostart. Там и вывод графиков, и передача данных, RSS-лента. Кто-то даже реализовал мини-CMS на HTTP-сервисах! =) Мы же рассмотрим создание самого примитивного HTTP-сервиса с минимально полезной функцией.

Механизм HTTP-сервисов открыл довольно обширные возможности по интеграции, расширению функционала, оптимизации существующих приложений и т.д. Чем то это похоже на WebAPI в .NET, но, конечно же, имеет куда больше ограничений и «заточено» под более узкий спектр задач. Список всего того, что можно сделать с помощью HTTP-сервисов настолько большой, что в публикации не хватит места, чтобы сохранить его!

Поэтому в статье мы создадим небольшой сервис, который будет использоваться для вывода простейшей HTML-странички. На ней будут выполняться асинхронные запросы к методам этого сервиса для получения данных. Сразу покажу окончательный результат.

Небольшой, но результат!

Конфигуратор — наше все!

Откроем конфигуратор и добавим новый HTTP-сервис. В нашем случае у сервиса будут три метода:

  1. «MainPage» — метод типа GET, который возвращает HTML-страницу с минимальным внесением изменений в разметку (о об этом чуть позже). Страницу Вы уже видели выше.
  2. «Products» — метод типа POST, который принимает в теле запроса параметр «query» с текстом, по которому будет выполняться поиск товаров в базе по наименованию. В качестве ответа формируется список найденных товаров в формате JSON.
  3. «Info» — метод типа POST, который в теле запроса принимает параметр «GUID» значение уникального идентификатора товара, а в ответ формирует список значений реквизитов товара (артикул, полное наименование, код и описание).

В конфигураторе это выглядит следующим образом:

В описании корня HTTP-сервиса самой важной настройкой является свойство «Корневой URL», которое отвечает за формирование URL-адреса, по которому мы будем обращаться ко всем методам этого сервиса.

Далее идут свойства шаблонов URL («GetProducts», «Info» и «MainPage»). Шаблоны также отвечают за формирование URL, по которому мы будем обращаться к методам, но уже для каждого отдельного HTTP-метода сервиса. Если мы посмотрим на скриншоты выше, то понять принцип формирования адреса для каждого из методов не составит особого труда:

Для каждого шаблона URL был добавлен метод. Для одного шаблона может быть несколько методов, но в нашем примере схема сервиса упрощенная. Для каждого шаблона добавлено по одному методу без описания каких-либо дополнительных параметров в шаблоне URL.

На скриншотах выше Вы могли видеть свойства методов «GetProducts», «GetInfo» и «get». Первые два имеют тип POST и просто так к ним обратиться по их URL в браузере нельзя. По адресам этих методов нужно отправить соответствующие параметры методом POST, об этих параметрах мы говорили в самом начале. Метод «get» шаблона «MainPage» имеет тип «GET» и при обращении возвращает сформированную HTML-страницу. К этому методу мы можем обратиться непосредственно в адресной строке браузера.

Шаблон HTML-страницы хранится в общем макете с типом HTML-документ. При обращении к методу мы программно получаем текст страницы и возвращаем его в качестве ответа:

Функция MainPageget(Запрос) МакетСтраницыПоиска = ПолучитьОбщийМакет(«ГлавнаяСтраница»); Ответ = Новый HTTPСервисОтвет(200); // Для корректного отображения веб-страницы установим тип содержимого как HTML Ответ.Заголовки.Вставить(«Content-Type»,»text/html; charset=utf-8″); // Получаем исходный код страницы и делаем подмену имени сервера // в ссылках на методы HTTP-сервиса, чтобы AJAX-запросы отработали // корректно ТекстСтраницы = МакетСтраницыПоиска.ПолучитьТекст(); ТекстСтраницы = СтрЗаменить(ТекстСтраницы, «{ServerName}», Константы.ИмяСервера.Получить()); ТекстСтраницы = СтрЗаменить(ТекстСтраницы, «{DatabaseName}», Константы.ИмяБазы.Получить()); Ответ.УстановитьТелоИзСтроки(ТекстСтраницы); Возврат Ответ; КонецФункции

В ответе обязательно нужно указать тип возвращаемого содержимого, иначе браузер отобразит HTML-разметку страницы. Обработчики для методов «GetProducts» и «GetInfo» показаны на следующем листинге:

Функция ProductsGetProducts(Запрос) Ответ = Новый HTTPСервисОтвет(200); // Обрабатываем присланный текст запроса для поиска номенклатуры ТекстПоискаНоменклатуры = «»; Попытка ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку(«UTF-8»); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ТелоЗапроса); ИмяСвойства = Неопределено; ЗначениеСвойства = Неопределено; Пока ЧтениеJSON.Прочитать() И (ИмяСвойства = Неопределено ИЛИ ЗначениеСвойства = Неопределено) Цикл Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда // Начинаем обрабатывать объект со строкой запроса ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда ИмяСвойства = ЧтениеJSON.ТекущееЗначение; ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда ЗначениеСвойства = ЧтениеJSON.ТекущееЗначение; КонецЕсли; КонецЦикла; Исключение // Если при обработке возникает ошибка, то считем, что отбор не был установлен КонецПопытки; Если ИмяСвойства = «query» И ЗначениеЗаполнено(ЗначениеСвойства) Тогда ТекстПоискаНоменклатуры = Строка(ЗначениеСвойства); КонецЕсли; // Получаем список номенклатуры для отправки на страницу в формате JSON Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ ПЕРВЫЕ 10 | Номенклатура.Ссылка КАК Ссылка, | Номенклатура.Код КАК Код, | Номенклатура.Наименование КАК Наименование, | Номенклатура.Артикул КАК Артикул, | Номенклатура.ПолноеНаименование КАК ПолноеНаименование, | Номенклатура.Описание КАК Описание |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Наименование ПОДОБНО &Наименование | |УПОРЯДОЧИТЬ ПО | Наименование»; Запрос.УстановитьПараметр(«Наименование», «%»+ТекстПоискаНоменклатуры+»%»); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Попытка ВремФайл = ПолучитьИмяВременногоФайла(«json»); ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.ОткрытьФайл(ВремФайл, «UTF-8»); ЗаписьJSON.ЗаписатьНачалоМассива(); Пока Выборка.Следующий() Цикл ЗаписьJSON.ЗаписатьНачалоОбъекта(); ЗаписьJSON.ЗаписатьИмяСвойства(«GUID»); ЗаписьJSON.ЗаписатьЗначение(Строка(Выборка.Ссылка.УникальныйИдентификатор())); ЗаписьJSON.ЗаписатьИмяСвойства(«Name»); ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Выборка.Наименование)); ЗаписьJSON.ЗаписатьКонецОбъекта(); КонецЦикла; ЗаписьJSON.ЗаписатьКонецМассива(); ЗаписьJSON.УстановитьСтроку(); ЗаписьJSON.Закрыть(); Текст = Новый ТекстовыйДокумент; Текст.Прочитать(ВремФайл, «UTF-8»); СтрокаJSON = Текст.ПолучитьТекст(); Исключение СтрокаJSON = «Ошибка: » + ОписаниеОшибки(); КонецПопытки; Ответ.УстановитьТелоИзДвоичныхДанных(Новый ДвоичныеДанные(ВремФайл)); Попытка УдалитьФайлы(ВремФайл); Исключение КонецПопытки; Возврат Ответ; КонецФункции Функция Infoget(Запрос) Ответ = Новый HTTPСервисОтвет(200); // Обрабатываем присланный в теле запроса GUID товара ТекстGUID = «»; Попытка ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку(«UTF-8»); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ТелоЗапроса); ИмяСвойства = Неопределено; ЗначениеСвойства = Неопределено; Пока ЧтениеJSON.Прочитать() И (ИмяСвойства = Неопределено ИЛИ ЗначениеСвойства = Неопределено) Цикл Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда // Начинаем обрабатывать объект со строкой запроса ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда ИмяСвойства = ЧтениеJSON.ТекущееЗначение; ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда ЗначениеСвойства = ЧтениеJSON.ТекущееЗначение; КонецЕсли; КонецЦикла; Исключение // Если при обработке возникает ошибка, то считем, что отбор не был установлен КонецПопытки; Если ИмяСвойства = «GUID» И ЗначениеЗаполнено(ЗначениеСвойства) Тогда ТекстGUID = Строка(ЗначениеСвойства); КонецЕсли; СтрокаJSON = «{ }»; НоменклатураGUID = Неопределено; Попытка НоменклатураGUID = Новый УникальныйИдентификатор(ТекстGUID); Исключение КонецПопытки; // Если GUID корректный, то формируем ответ в формате JSON со значениями // реквизитов номенклатуры Если ЗначениеЗаполнено(НоменклатураGUID) Тогда Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(НоменклатураGUID); Попытка ВремФайл = ПолучитьИмяВременногоФайла(«json»); ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.ОткрытьФайл(ВремФайл, «UTF-8»); ЗаписьJSON.ЗаписатьНачалоМассива(); ЗаписьJSON.ЗаписатьНачалоОбъекта(); ЗаписьJSON.ЗаписатьИмяСвойства(«Art»); ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Номенклатура.Артикул)); ЗаписьJSON.ЗаписатьИмяСвойства(«FullName»); ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Номенклатура.ПолноеНаименование)); ЗаписьJSON.ЗаписатьИмяСвойства(«Code»); ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Номенклатура.Код)); ЗаписьJSON.ЗаписатьИмяСвойства(«Descr»); ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Номенклатура.Описание)); ЗаписьJSON.ЗаписатьКонецОбъекта(); ЗаписьJSON.ЗаписатьКонецМассива(); ЗаписьJSON.УстановитьСтроку(); ЗаписьJSON.Закрыть(); Текст = Новый ТекстовыйДокумент; Текст.Прочитать(ВремФайл, «UTF-8»); СтрокаJSON = Текст.ПолучитьТекст(); Ответ.УстановитьТелоИзДвоичныхДанных(Новый ДвоичныеДанные(ВремФайл)); Исключение Ответ.УстановитьТелоИзСтроки(СтрокаJSON); КонецПопытки; Иначе Ответ.УстановитьТелоИзСтроки(СтрокаJSON); КонецЕсли; Возврат Ответ; КонецФункции

Код далеко не идеален и такой же примитивный, как и весь сервис 🙂 1C:Совместимо с таким подходом мы вряд ли получим.

Расписывать выполняемые обработчиками действия особого смысла нет, т.к. по оставленным комментариям в коде логика работы должна быть ясна.

Это и есть вся реализация HTTP-сервиса. Давайте посмотрим какой функционал скрывается на HTML-странице и как он реализован.

DEFAULT.HTML

Главная страница нашего HTTP-сервиса содержим элемент SELECT для выбора товара и поиска по вводу. О том как удалось элемент SELECT сделать редактируемым рассказывать здесь не буду, об этом Вы можете прочитать в статье «Редактируемый SELECT» в соседнем блоге. Здесь же предлагаю рассмотреть выполнение асинхронных вызовов методов HTTP-сервиса со страницы с помощью AJAX. Если Вам интересен полный текст разметки страницы и используемый JavaScript-код, то в верху страницы есть ссылка на файл тестовой конфигурации с описываемым примером.

И так, первый асинхронный вызов обращается к методу «GetProducts» для получения списка товаров по введенной строке запроса. Запрос выполняется каждый раз при изменении текста в поле ввода. С использованием JQuery асинхронный запрос выполняется проще простого:

$.ajax({ type: «POST», contentType: «application/json;charset=utf-8», url: «http://{ServerName}/{DatabaseName}/hs/PrimitiveService/products», data: «{ «query»: «» + query + «» }», dataType: «json», success: function (queryResult) { try { for (var i = 0; i < queryResult.length; i++) { var item = queryResult; originalSelect.editableSelect(‘add’, function () { $(this).attr(‘data-value’, item.GUID); $(this).text(item.Name); }) } } catch (e) { alert(‘Wow! Error!!!’); } } });

В качестве ответа мы ожидаем текст в формате JSON, поэтому параметр «dataType» установлен в «json». В параметре «data» описываем произвольный объект со свойством «query» и текстовым значением, введенным для поиска на странице. В параметре «url» указан адрес метода HTTP-сервиса. Если запрос выполнен успешно, то вызывается событие «success», а в вызываемой функции первым параметром передается объект, полученный от сервера. Далее в функции выполняется обработка полученных данных и заполнение списка выбора.

Второй асинхронный запрос используется при изменении товара. Запрос обращается по адресу метода «GetInfo» и при успешном выполнении помещает полученные значения на страницу. Листинг кода запроса следующий:

$.ajax({ type: «POST», contentType: «application/json;charset=utf-8», url: «http://{ServerName}/{DatabaseName}/hs/PrimitiveService/info», data: «{ «GUID»: «» + GUID + «» }», dataType: «json», success: function (queryResult) { try { var Code = queryResult.Code; var FullName = queryResult.FullName; var Art = queryResult.Art; var Descr = queryResult.Descr; $(‘#ArtValue’).text(Art); $(‘#CodeValue’).text(Code); $(‘#DescrValue’).text(Descr); $(‘#CodeFullNameValue’).text(FullName); } catch (e) { // Обработка ошибки } } });

При необходимости Вы можете подробнее изучить тему работы с JavaScript, JQuery и AJAX на сайте metanit.com, рекомендую.

Мы реализовали простой HTTP-сервис и продемонстрировали работы с ним сторонними средствами. Всю мощь нового механизма сложно раскрыть в одной статье, но я надеюсь, что благодаря этому материалу у Вас появится интерес для изучения этой темы. Интеграция, интерфейсы и оптимизация — это лишь малая часть тех задач, которые можно решить с их помощью.

Исходный код примера Вы можете найти в репозитории на GitHub.

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

Спасибо за внимание и до скорых встреч!

Другие ссылки

  • На что действительно способны HTTP-сервисы

Отдельно выделю серию статей от Дмитрия Сидоренко:

  • HTTP Сервисы: Путь к своему сервису. Часть 1

  • HTTP Сервисы: Путь к своему сервису. Часть 2

  • HTTP Сервисы: Путь к своему сервису. Часть 3

  • HTTP Сервисы: Путь к своему сервису. Часть 4

Это отличный путь в мир HTTP-сервисов!

Добавить комментарий

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