РИБ с фильтром по подразделению / ФормаВыбораЗначений / Модуль формы

файл
//////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Пропускаем инициализацию, чтобы гарантировать получение формы при передаче параметра "АвтоТест".
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	СтруктураЗаполняемыхЗначений = Новый Структура("ТаблицаЗаполнения, КолонкаЗаполнения", 
													Параметры.ТаблицаЗаполнения, 
													Параметры.КолонкаЗаполнения);
		
	Заголовок = Параметры.ЗаголовокФормыВыбора;
	
	Запрос = Новый Запрос("ВЫБРАТЬ
		|	ТаблицаВыбранных.ЗначениеЭлемента КАК ЗначениеЭлемента,
		|	1 КАК Отметка
		|ПОМЕСТИТЬ ВыбранныеЗначения
		|ИЗ
		|	&ТаблицаВыбранных КАК ТаблицаВыбранных
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	ЗначениеЭлемента
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ВыбираемыйСправочник.Ссылка КАК Представление,
		|	ЕСТЬNULL(ВыбранныеЗначения.Отметка, 0) КАК Отметка
		|ИЗ
		|	Справочник.%ИмяСправочника% КАК ВыбираемыйСправочник
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВыбранныеЗначения КАК ВыбранныеЗначения
		|		ПО ВыбираемыйСправочник.Ссылка = ВыбранныеЗначения.ЗначениеЭлемента
		|ГДЕ
		|	ВыбираемыйСправочник.ПометкаУдаления = ЛОЖЬ
		|
		|УПОРЯДОЧИТЬ ПО
		|	ВыбираемыйСправочник.Наименование %РежимУпорядочивания%");
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "%ИмяСправочника%", Параметры.ВыбираемыйСправочник);
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "%РежимУпорядочивания%", Параметры.РежимУпорядочивания);
	
	ТаблицаВыбранныхЗначений = ПолучитьИзВременногоХранилища(Параметры.ТаблицаВыбранныхЗначений);
	ТаблицаВыбранныхЗначений.Колонки[Параметры.КолонкаЗаполнения].Имя = "ЗначениеЭлемента";
	Запрос.УстановитьПараметр("ТаблицаВыбранных", ТаблицаВыбранныхЗначений);
	
	РезультатЗапроса = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
	
	КоллекцияЭлементовДерева = СтруктураПредприятия.ПолучитьЭлементы();
	КоллекцияЭлементовДерева.Очистить();
	
	ОбщегоНазначения.ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(КоллекцияЭлементовДерева, РезультатЗапроса);
	
	РасчитатьСтатусВсехОтметокДереваЗначений(СтруктураПредприятия);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ КОМАНД ФОРМЫ

&НаКлиенте
Процедура СтруктураПредприятияОтметкаПриИзменении(Элемент)
	
	ИзменитьПометкуВыделеннойСтроки(СтруктураПредприятия, Элемент.Родитель.ТекущаяСтрока, Элемент.Родитель.ТекущиеДанные.Отметка);
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаВыбрать(Команда)
	
	ПараметрыЗакрытияФормы = Новый Структура();
	ПараметрыЗакрытияФормы.Вставить("АдресТаблицыВоВременномХранилище", СформироватьТаблицуВыбранныхЗначений());
	ПараметрыЗакрытияФормы.Вставить("ТаблицаЗаполнения", СтруктураЗаполняемыхЗначений.ТаблицаЗаполнения);
	ПараметрыЗакрытияФормы.Вставить("КолонкаЗаполнения", СтруктураЗаполняемыхЗначений.КолонкаЗаполнения);
	
	ОповеститьОВыборе(ПараметрыЗакрытияФормы);

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции работы с деревом значений

&НаСервере
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоВыбранныхЗначений, ТаблицаВыбранныхЗначений, ПометкаВладельца = Неопределено) Экспорт

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

&НаКлиентеНаСервереБезКонтекста
Процедура ИзменитьПометкуВыделеннойСтроки(ДеревоВыбранныхЗначений, ВыделеннаяСтрока, Отметка)
	
	ЭлементДерева = ДеревоВыбранныхЗначений.НайтиПоИдентификатору(ВыделеннаяСтрока);
	
	ИзменитьПометкуЭлементаДерева(ЭлементДерева, Отметка%2);
	
	Родитель = ЭлементДерева.ПолучитьРодителя();
	
	Пока Родитель <> Неопределено Цикл
		
		РассчитатьПометкуЭлементаДерева(Родитель);
		Родитель = Родитель.ПолучитьРодителя();
		
	КонецЦикла
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьПометкуЭлементаДерева(ЭлементДерева)
	
	Если ЭлементДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Отметка = 0;
	Предыдущая = -1;
	
	Для Каждого СтрокаДерева Из ЭлементДерева.ПолучитьЭлементы() Цикл
		
		Отметка = СтрокаДерева.Отметка;
		
		Если Отметка = 2 Или (Отметка + Предыдущая) = 1 Тогда
			ЭлементДерева.Отметка = 2;
			Возврат; // пометка подчиненного затемнена (2) или пометка подчиненного отличается от пометки предыдущего подчиненного
		КонецЕсли;
		
		Предыдущая = Отметка;
		
	КонецЦикла;
	
	ЭлементДерева.Отметка = Отметка; // пометка последнего подчиненного определяет общую пометку элемента
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ИзменитьПометкуЭлементаДерева(ЭлементДерева, Отметка)
	
	// Если у элемента есть подчиненные элементы, то изменение пометки распространяется на подчиненные элементы
	ЭлементДерева.Отметка = Отметка;
	ЭлементыДерева = ЭлементДерева.ПолучитьЭлементы();
	
	Для Каждого СтрокаДерева Из ЭлементыДерева Цикл
		ИзменитьПометкуЭлементаДерева(СтрокаДерева, ?(Отметка > 0, 1, 0));
	КонецЦикла;
	
КонецПроцедуры

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

////////////////////////////////////////////////////////////////////////////////
// Прочее

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

Связанные материалы