В этом примере, чтобы проиндексировать последние цены товаров на заданную величину, нам понадобится воспользоваться другим шаблоном 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. Этот пример будет рассмотрен в следующем разделе «».