///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Форма выбора для полей типа "узел плана обмена".
//  
////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Обработка стандартных параметров.
	Если Не Параметры.ЗакрыватьПриВыборе Тогда
		РежимПодбора = Истина;
		Если Параметры.МножественныйВыбор Тогда
			МножественныйВыбор = Истина;
		КонецЕсли;
	КонецЕсли;
	
	Если ТипЗнч(Параметры.ПланыОбменаДляВыбора) = Тип("Массив") Тогда
		ИспользуемыеПланыОбмена = Новый Массив;
		Для каждого Элемент Из Параметры.ПланыОбменаДляВыбора Цикл
			Если ТипЗнч(Элемент) = Тип("Строка") Тогда
				ПланОбменаМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Элемент);
				Если ПланОбменаМетаданные = Неопределено Тогда
					ПланОбменаМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени("ПланОбмена." + Элемент);
				КонецЕсли;
			ИначеЕсли ТипЗнч(Элемент) = Тип("Тип") Тогда
				ПланОбменаМетаданные = Метаданные.НайтиПоТипу(Элемент);
			Иначе
				ПланОбменаМетаданные = Метаданные.НайтиПоТипу(ТипЗнч(Элемент));
			КонецЕсли;
			Если ПланОбменаМетаданные <> Неопределено Тогда
				ИспользуемыеПланыОбмена.Добавить(ПланОбменаМетаданные);
			КонецЕсли;
		КонецЦикла;
		ЗаполнитьПланыОбмена(ИспользуемыеПланыОбмена);
	Иначе
		ЗаполнитьПланыОбмена(Метаданные.ПланыОбмена);
	КонецЕсли;
	
	Если РежимПодбора Тогда
		Заголовок = НСтр("ru = 'Подбор узлов планов обмена'");
	КонецЕсли;
	Если МножественныйВыбор Тогда
		Элементы.УзлыПлановОбмена.РежимВыделения = РежимВыделенияТаблицы.Множественный;
	КонецЕсли;
	
	НайденныеСтроки = УзлыПлановОбмена.НайтиСтроки(Новый Структура("Узел", Параметры.ТекущаяСтрока));	
	Если НайденныеСтроки.Количество() > 0 Тогда
		Элементы.УзлыПлановОбмена.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыУзлыПлановОбмена

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

#КонецОбласти

#Область ОбработчикиКомандФормы

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ЗаполнитьПланыОбмена(ПланыОбмена)
	
	ТекстыЗапросов = Новый Массив;
	
	Для каждого ОбъектМетаданных Из ПланыОбмена Цикл
		
		Если ОбъектМетаданных = Неопределено Или Не Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ПравоДоступа("Просмотр", ОбъектМетаданных) Тогда
			Продолжить;
		КонецЕсли;
		
		ПланОбменаСсылка = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()).ПустаяСсылка();

		ТекстЗапроса = 
			"ВЫБРАТЬ РАЗРЕШЕННЫЕ
			|	&ПланОбменаПустаяСсылка КАК ПустаяСсылка,
			|	&ПланОбменаПредставление КАК ПланОбменаПредставление,
			|	ТаблицаПланаОбмена.Ссылка КАК Ссылка,
			|	ТаблицаПланаОбмена.Представление КАК Представление
			|ИЗ
			|	&ТаблицаПланаОбмена КАК ТаблицаПланаОбмена
			|ГДЕ
			|	НЕ ТаблицаПланаОбмена.ЭтотУзел";
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПланОбменаПустаяСсылка", 
			"ЗНАЧЕНИЕ(" + ОбъектМетаданных.ПолноеИмя() + ".ПустаяСсылка)"); // @query-part-2, @query-part-3
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПланОбменаПредставление", """" + ОбъектМетаданных.Представление() + """");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаПланаОбмена", ОбъектМетаданных.ПолноеИмя());
		Если ТекстыЗапросов.Количество() > 0 Тогда
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2
		КонецЕсли;	

		ТекстыЗапросов.Добавить(ТекстЗапроса);
		
		Если Параметры.ВыбиратьВсеУзлы Тогда
			НоваяСтрока = УзлыПлановОбмена.Добавить();
			НоваяСтрока.ПланОбмена              = ПланОбменаСсылка;
			НоваяСтрока.ПланОбменаПредставление = ОбъектМетаданных.Синоним;
			НоваяСтрока.Узел                    = ПланОбменаСсылка;
			НоваяСтрока.УзелПредставление       = НСтр("ru = '<Все информационные базы>'");
		КонецЕсли;
		
	КонецЦикла; 
	
	Если ТекстыЗапросов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС);
	Запрос = Новый Запрос(ТекстЗапроса);	
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = УзлыПлановОбмена.Добавить();
		НоваяСтрока.ПланОбмена              = Выборка.ПустаяСсылка;
		НоваяСтрока.ПланОбменаПредставление = Выборка.ПланОбменаПредставление;
		НоваяСтрока.Узел                    = Выборка.Ссылка;
		НоваяСтрока.УзелПредставление       = Выборка.Представление;
	КонецЦикла;
	
	УзлыПлановОбмена.Сортировать("ПланОбменаПредставление Возр");
	
КонецПроцедуры

#КонецОбласти
