Files
llm/plugins/1c/bridge/additional_attributes_http_handler.bsl
2026-08-14 09:40:51 +03:00

61 lines
4.7 KiB
Plaintext

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