Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Получить данные о ценах на конкретный товар
Дальше: HTTP-сервисы в расширениях
Проиндексировать цены на товары

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

Итак, добавим у нашего HTTP-сервиса объект Шаблон URL ПроиндексироватьЦены с шаблоном /percent/{Процент}. Затем у этого объекта добавим подчиненный метод POST, в качестве HTTP-метода оставим предложенное по умолчанию значение POST. Далее создадим обработчик этого метода.

В модуле нашего HTTP-сервиса будет создан шаблон функции-обработчика ПроиндексироватьЦеныPOST(). Заполним эту функцию следующим образом (листинг 1.73).

Листинг 1.73. Функция «ПроиндексироватьЦеныPOST»

Функция ПроиндексироватьЦеныPOST(Запрос)

 

Попытка

 

// Получить из запроса параметр URL Процент.

Процент = Запрос.ПараметрыURL.Получить("Процент");

Если Процент = Неопределено Тогда

Ответ = Новый HTTPСервисОтвет(400);

Ответ.УстановитьТелоИзСтроки("Не задан параметр Процент");

Ответ.Заголовки.Вставить("Content-type", "application/json");

Возврат Ответ;

КонецЕсли;

 

Коэффициент = 1 + Число(Процент)/100;

// Сформировать запрос к регистру сведений.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| ЦеныТоваровСрезПоследних.Период КАК Период,

| ЦеныТоваровСрезПоследних.Товар КАК Товар,

| ЕСТЬNULL(ЦеныТоваровСрезПоследних.Цена, 0) КАК Цена

|ИЗ

| РегистрСведений.ЦеныТоваров.СрезПоследних(, ) КАК ЦеныТоваровСрезПоследних";

 

Выборка = Запрос.Выполнить().Выбрать();

 

// В цикле обхода выборки записать в JSON и добавить в регистр сведений последние цены товаров.

// Создать объект записи и записать строковое значение в строку JSON.

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

 

// Записать начало корневого объекта.

Запись.ЗаписатьНачалоОбъекта();

Пока Выборка.Следующий() Цикл

НоваяЦена = Выборка.Цена * Коэффициент;

 

Запись.ЗаписатьИмяСвойства(Строка(Выборка.Товар));

Запись.ЗаписатьНачалоОбъекта();

Запись.ЗаписатьИмяСвойства("Период");

Запись.ЗаписатьЗначение(Строка(ТекущаяДата()));

Запись.ЗаписатьИмяСвойства("Цена");

Запись.ЗаписатьЗначение(НоваяЦена);

Запись.ЗаписатьКонецОбъекта();

 

// Подготовить менеджер записи.

ЗаписьРегистра = РегистрыСведений.ЦеныТоваров.СоздатьМенеджерЗаписи();

 

// Установить ключевые поля менеджера записи.

ЗаписьРегистра.Период = ТекущаяДата();

ЗаписьРегистра.Товар = Выборка.Товар;

ЗаписьРегистра.Цена = НоваяЦена;

 

// Записать новую запись в базу данных.

ЗаписьРегистра.Записать();

КонецЦикла;

// Записать конец корневого объекта.

Запись.ЗаписатьКонецОбъекта();

 

// Записать результат записи в строку JSON.

Результат = Запись.Закрыть();

 

// Сформировать ответ, возвращаемый HTTP-сервисом.

Ответ = Новый HTTPСервисОтвет(200);

 

// Установить тело ответа из строки Результат.

Ответ.УстановитьТелоИзСтроки(Результат);

 

Исключение

 

// Вывести стуктурированную информацию об исключении.

Ответ = Новый HTTPСервисОтвет(500);

Информация = ИнформацияОбОшибке();

Сообщение = Информация.Описание;

Если Информация.Причина <> Неопределено Тогда

Сообщение = Сообщение + ":" + Информация.Причина.Описание;

КонецЕсли;

Ответ.УстановитьТелоИзСтроки(Сообщение);

 

КонецПопытки;

 

Ответ.Заголовки.Вставить("Content-type", "application/json");

Возврат Ответ;

 

КонецФункции

Прокомментируем код функции.

Родительский объект функции-обработчика – шаблон URL ПроиндексироватьЦены, описанный с помощью шаблона /percent/{Процент}. Этот шаблон содержит непараметризованный сегмент percent и параметризованный сегмент {Процент}. Это означает, что любые символы, которые могут присутствовать в URL запроса к сервису после символов «/percent/», будут трактоваться как параметр URL Процент, который можно получить из переданного в функцию параметра Запрос.

Поэтому сначала в обработчике мы делаем попытку получить значение параметра Процент (Запрос.ПараметрыURL.Получить("Процент")) и анализируем его. Если этот параметр URL не определен, то мы прекращаем работу функции и возвращаем ответ сервиса с кодом состояния 400, сообщающим об ошибке запроса.

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

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

Затем с помощью менеджера записи записываем новые цены товаров на текущую дату в регистр сведений.

После этого создаем объект HTTPСервисОтвет с кодом состояния 200, с помощью метода УстановитьТелоИзСтроки() устанавливаем тело ответа HTTP-сервиса из строки Результат и возвращаем ответ сервиса в переменной Ответ.

Если же при попытке получить значение параметра URL из запроса возникает ошибка, то генерируется исключение. С помощью метода глобального контекста ИнформацияОбОшибке() мы получаем структурированную информацию об исключении и возвращаем ответ сервиса с кодом состояния 500, сообщающим о причине ошибки.

Чтобы посмотреть результат работы HTTP-сервиса по индексации цен товаров в прикладном решении, надо обратиться к нему с помощью собственного HTTP-запроса и выполнить на сервере метод POST. Этот пример будет рассмотрен в следующем разделе «».

Назад: Получить данные о ценах на конкретный товар
Дальше: HTTP-сервисы в расширениях