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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// Задать настройки формы отчета.
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения
//         - Неопределено
//   КлючВарианта - Строка
//                - Неопределено
//   Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	
	Настройки.ФормироватьСразу = Истина;
	Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
	Настройки.События.ПриОпределенииИспользуемыхТаблиц = Истина;
	
КонецПроцедуры

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

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

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

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

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

// Параметры:
//  ДокументРезультат - ТабличныйДокумент
//  ДанныеРасшифровки - ДанныеРасшифровкиКомпоновкиДанных
//  СтандартнаяОбработка - Булево
//
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	ПараметрПоказыватьНедействительных = Настройки.ПараметрыДанных.Элементы.Найти(
		"ПоказыватьНедействительныхУчастников");
	ПараметрВключитьТолькоДействительных = Настройки.ПараметрыДанных.Элементы.Найти(
		"ВключитьТолькоДействительныхУчастников");
	
	ПараметрВключитьТолькоДействительных.Использование = Истина;
	ПараметрВключитьТолькоДействительных.Значение =
		Не ПараметрПоказыватьНедействительных.Использование
		Или Не ПараметрПоказыватьНедействительных.Значение;
	
	ПараметрПодразделение = Настройки.ПараметрыДанных.Элементы.Найти("Подразделение");
	ПараметрПодразделениеВСписке = Настройки.ПараметрыДанных.Элементы.Найти("ПодразделениеВСписке");
	ПараметрПодразделениеВИерархии = Настройки.ПараметрыДанных.Элементы.Найти("ПодразделениеВИерархии");
	ПараметрСкрыватьПользователейНижестоящихПодразделений = Настройки.ПараметрыДанных.Элементы.Найти(
		"СкрыватьПользователейНижестоящихПодразделений");
	
	Скрывать = ПараметрСкрыватьПользователейНижестоящихПодразделений.Использование
		И ПараметрСкрыватьПользователейНижестоящихПодразделений.Значение;
	
	Если Не ПараметрПодразделение.Использование И Скрывать Тогда
		ПараметрСкрыватьПользователейНижестоящихПодразделений.Использование = Ложь;
		Скрывать = Ложь;
	КонецЕсли;
	
	ПараметрПодразделениеВСписке.Значение = ПараметрПодразделение.Значение;
	ПараметрПодразделениеВСписке.Использование =
		ПараметрПодразделение.Использование И Скрывать;
	
	ПараметрПодразделениеВИерархии.Значение = ПараметрПодразделение.Значение;
	ПараметрПодразделениеВИерархии.Использование =
		ПараметрПодразделение.Использование И Не Скрывать;
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.НачатьВывод();
	ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	Пока ЭлементРезультата <> Неопределено Цикл
		ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	КонецЦикла;
	ПроцессорВывода.ЗакончитьВывод();
	
КонецПроцедуры

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли