// Обработчик URL-шаблона HTTP-сервиса, например POST /runtime-bridge/rpc. // Требует общий серверный модуль ДополнительныеРеквизитыReadOnly // (additional_attributes_readonly.bsl) в составе тестового расширения. Функция ОбработатьRPC(Запрос) Экспорт Попытка ДанныеЗапроса = ПрочитатьJSONИзСтроки(Запрос.ПолучитьТелоКакСтроку()); Метод = ДанныеЗапроса.method; Параметры = ДанныеЗапроса.payload; Если Метод = "additional_attributes.find" Тогда ТекстПоиска = ПолучитьПараметр(Параметры, "query", ""); ВключатьУдаленные = ПолучитьПараметр(Параметры, "include_deleted", Ложь); Результат = Новый Структура("status,properties", "found", ДополнительныеРеквизитыReadOnly.НайтиДополнительныеРеквизиты(ТекстПоиска, ВключатьУдаленные)); Если Результат.properties.Количество() = 0 Тогда Результат.status = "not_found"; КонецЕсли; ИначеЕсли Метод = "additional_attributes.storage.resolve" Тогда СсылкаСвойства = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(Новый УникальныйИдентификатор(Параметры.property_ref)); Маршрут = ДополнительныеРеквизитыReadOnly.МаршрутЗначенийДополнительногоРеквизита(СсылкаСвойства, Параметры.owner_ref); Результат = Новый Структура("status,property_ref,owner_ref,storage,scd_join", "confirmed", Параметры.property_ref, Параметры.owner_ref, Новый Структура("source_ref,source_kind,fields", Маршрут.source, "TabularSection", Новый Структура("object,property,value", Маршрут.object_field, Маршрут.property_field, Маршрут.value_field)), Новый Структура("source,alias,condition,value_expression,parameters", Маршрут.source, "ДополнительныеРеквизиты", Маршрут.query_join, "ДополнительныеРеквизиты.Значение", Новый Структура("Свойство", Маршрут.parameter))); Иначе Возврат ОтветJSON(405, Новый Структура("status,error", "invalid_argument", "Unsupported read-only bridge method.")); КонецЕсли; Возврат ОтветJSON(200, Результат); Исключение // Не передаем внутренний стек и сведения о подключении. Возврат ОтветJSON(400, Новый Структура("status,error", "error", "Invalid read-only bridge request.")); КонецПопытки; КонецФункции Функция ПолучитьПараметр(СтруктураПараметров, Имя, ЗначениеПоУмолчанию) Экспорт Значение = ЗначениеПоУмолчанию; Если СтруктураПараметров.Свойство(Имя, Значение) Тогда Возврат Значение; КонецЕсли; Возврат ЗначениеПоУмолчанию; КонецФункции Функция ПрочитатьJSONИзСтроки(ТекстJSON) Экспорт ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ТекстJSON); Попытка Возврат ПрочитатьJSON(ЧтениеJSON); Наконец ЧтениеJSON.Закрыть(); КонецПопытки; КонецФункции Функция ОтветJSON(КодСостояния, Данные) Экспорт ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, Данные); ТекстJSON = ЗаписьJSON.Закрыть(); Ответ = Новый HTTPСервисОтвет(КодСостояния); Ответ.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8"); Возврат Ответ; КонецФункции