// Обработчик 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");
	Возврат Ответ;
КонецФункции
