// Общий модуль серверного HTTP-сервиса. Все экспортные методы только читают данные.
// Модуль предназначен для публикации в тестовой конфигурации, а не для выполнения
// из SQL-адаптера. Аутентификацию и разбор HTTP-запроса реализует модуль сервиса.

Функция НайтиДополнительныеРеквизиты(ТекстПоиска = "", ВключатьПомеченныеНаУдаление = Ложь) Экспорт

	Результат = Новый Массив;
	Выборка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.Выбрать();
	Пока Выборка.Следующий() Цикл
		Если Не ВключатьПомеченныеНаУдаление И Выборка.ПометкаУдаления Тогда
			Продолжить;
		КонецЕсли;
		Если ЗначениеЗаполнено(ТекстПоиска)
			И СтрНайти(НРег(Выборка.Наименование), НРег(ТекстПоиска)) = 0 Тогда
			Продолжить;
		КонецЕсли;

		ОбъектСвойства = Выборка.ПолучитьОбъект();
		СтрокаСвойства = Новый Структура;
		СтрокаСвойства.Вставить("ref", Строка(Выборка.Ссылка.УникальныйИдентификатор()));
		СтрокаСвойства.Вставить("description", Выборка.Наименование);
		СтрокаСвойства.Вставить("marked_for_deletion", Выборка.ПометкаУдаления);
		ДобавитьСвойствоЕслиЕсть(СтрокаСвойства, ОбъектСвойства, "Имя", "name");
		ДобавитьСвойствоЕслиЕсть(СтрокаСвойства, ОбъектСвойства, "ИдентификаторДляФормул", "identifier_for_formula");
		ДобавитьСвойствоЕслиЕсть(СтрокаСвойства, ОбъектСвойства, "НаборСвойств", "property_set");
		ДобавитьСвойствоЕслиЕсть(СтрокаСвойства, ОбъектСвойства, "ТипЗначения", "value_type");
		// Отдельно фиксируем наличие реквизита в объекте ПВХ. Это позволяет
		// SQL-разработке отличить пустое значение от отсутствующей семантики.
		СтрокаСвойства.Вставить("semantic_fields", Новый Структура(
			"name,identifier_for_formula,property_set,value_type",
			СтрокаСвойства.Свойство("name"),
			СтрокаСвойства.Свойство("identifier_for_formula"),
			СтрокаСвойства.Свойство("property_set"),
			СтрокаСвойства.Свойство("value_type")));
		Результат.Добавить(СтрокаСвойства);
	КонецЦикла;

	Возврат Результат;
КонецФункции

Функция МаршрутЗначенийДополнительногоРеквизита(Свойство, ВладелецМетаданных) Экспорт

	Если ТипЗнч(Свойство) <> Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") Тогда
		ВызватьИсключение "Свойство должно быть ссылкой ПВХ ДополнительныеРеквизитыИСведения.";
	КонецЕсли;
	Если ВладелецМетаданных <> "Справочник.СтруктурныеЕдиницы" Тогда
		ВызватьИсключение "Маршрут подтвержден только для Справочник.СтруктурныеЕдиницы.";
	КонецЕсли;

	// Текст предназначен для СКД и не исполняется сервисом. В этой
	// конфигурации значения подтверждённо находятся в табличной части владельца.
	Возврат Новый Структура(
		"source,object_field,property_field,value_field,query_join,parameter",
		"Справочник.СтруктурныеЕдиницы.ДополнительныеРеквизиты",
		"Ссылка",
		"Свойство",
		"Значение",
		"ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтруктурныеЕдиницы.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты "
		+ "ПО ДополнительныеРеквизиты.Ссылка = СтруктурныеЕдиницы.Ссылка "
		+ "И ДополнительныеРеквизиты.Свойство = &Свойство",
		Строка(Свойство.УникальныйИдентификатор())
	);
КонецФункции

Процедура ДобавитьСвойствоЕслиЕсть(Приемник, Источник, ИмяСвойства, ИмяПоля) Экспорт
	ЗначениеСвойства = Неопределено;
	Если Источник.Свойство(ИмяСвойства, ЗначениеСвойства) Тогда
		Приемник.Вставить(ИмяПоля, ПредставлениеДляJSON(ЗначениеСвойства));
	КонецЕсли;
КонецПроцедуры

Функция ПредставлениеДляJSON(ЗначениеСвойства) Экспорт
	Если ЗначениеСвойства = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") Или ТипЗнч(ЗначениеСвойства) = Тип("Массив") Тогда
		Возврат ЗначениеСвойства;
	КонецЕсли;
	Попытка
		УникальныйИдентификатор = ЗначениеСвойства.УникальныйИдентификатор();
		Возврат Новый Структура("ref,presentation", Строка(УникальныйИдентификатор), Строка(ЗначениеСвойства));
	Исключение
	КонецПопытки;
	Возврат Строка(ЗначениеСвойства);
КонецФункции
