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

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

#Область ОписаниеПеременных

// СтандартныеПодсистемы.УправлениеДоступом
Перем СтарыеЗаписи; // Массив из СправочникСсылка.ГруппыИсполнителейЗадач - состав группы исполнителей до изменения.
// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

// СтандартныеПодсистемы.УправлениеДоступом

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

Функция СписокПолей()
	
	МетаданныеРегистра = Метаданные();
	
	Поля = Новый Массив;
	Поля.Добавить(МетаданныеРегистра.Измерения.РольИсполнителя.Имя);
	Поля.Добавить(МетаданныеРегистра.Измерения.Исполнитель.Имя);
	Поля.Добавить(МетаданныеРегистра.Измерения.ОсновнойОбъектАдресации.Имя);
	Поля.Добавить(МетаданныеРегистра.Измерения.ДополнительныйОбъектАдресации.Имя);
	Поля.Добавить(МетаданныеРегистра.Реквизиты.ГруппаИсполнителейЗадач.Имя);
	
	Возврат СтрСоединить(Поля, ",");
	
КонецФункции

// СтандартныеПодсистемы.УправлениеДоступом

Функция ИзмененныеГруппыИсполнителейЗадач() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("НовыеЗаписи", Выгрузить());
	Запрос.Текст =
	"ВЫБРАТЬ
	|	НовыеЗаписи.РольИсполнителя,
	|	НовыеЗаписи.Исполнитель,
	|	НовыеЗаписи.ОсновнойОбъектАдресации,
	|	НовыеЗаписи.ДополнительныйОбъектАдресации,
	|	НовыеЗаписи.ГруппаИсполнителейЗадач
	|ПОМЕСТИТЬ НовыеЗаписи
	|ИЗ
	|	&НовыеЗаписи КАК НовыеЗаписи
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Итог.ГруппаИсполнителейЗадач
	|ИЗ
	|	(ВЫБРАТЬ РАЗЛИЧНЫЕ
	|		Различия.ГруппаИсполнителейЗадач КАК ГруппаИсполнителейЗадач
	|	ИЗ
	|		(ВЫБРАТЬ
	|			ИсполнителиЗадач.РольИсполнителя КАК РольИсполнителя,
	|			ИсполнителиЗадач.Исполнитель КАК Исполнитель,
	|			ИсполнителиЗадач.ОсновнойОбъектАдресации КАК ОсновнойОбъектАдресации,
	|			ИсполнителиЗадач.ДополнительныйОбъектАдресации КАК ДополнительныйОбъектАдресации,
	|			ИсполнителиЗадач.ГруппаИсполнителейЗадач КАК ГруппаИсполнителейЗадач,
	|			-1 КАК ВидИзмененияСтроки
	|		ИЗ
	|			РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач
	|		ГДЕ
	|			&УсловияОтбора
	|		
	|		ОБЪЕДИНИТЬ ВСЕ
	|		
	|		ВЫБРАТЬ
	|			НовыеЗаписи.РольИсполнителя,
	|			НовыеЗаписи.Исполнитель,
	|			НовыеЗаписи.ОсновнойОбъектАдресации,
	|			НовыеЗаписи.ДополнительныйОбъектАдресации,
	|			НовыеЗаписи.ГруппаИсполнителейЗадач,
	|			1
	|		ИЗ
	|			НовыеЗаписи КАК НовыеЗаписи) КАК Различия
	|	
	|	СГРУППИРОВАТЬ ПО
	|		Различия.РольИсполнителя,
	|		Различия.Исполнитель,
	|		Различия.ОсновнойОбъектАдресации,
	|		Различия.ДополнительныйОбъектАдресации,
	|		Различия.ГруппаИсполнителейЗадач
	|	
	|	ИМЕЮЩИЕ
	|		СУММА(Различия.ВидИзмененияСтроки) <> 0) КАК Итог
	|ГДЕ
	|	Итог.ГруппаИсполнителейЗадач <> ЗНАЧЕНИЕ(Справочник.ГруппыИсполнителейЗадач.ПустаяСсылка)";
	
	УсловияОтбора = "Истина";
	Для каждого ЭлементОтбора Из Отбор Цикл
		Если ЭлементОтбора.Использование Тогда
			УсловияОтбора = УсловияОтбора + "
			|И ИсполнителиЗадач." + ЭлементОтбора.Имя + " = &" + ЭлементОтбора.Имя;
			Запрос.УстановитьПараметр(ЭлементОтбора.Имя, ЭлементОтбора.Значение);
		КонецЕсли;
	КонецЦикла;
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловияОтбора", УсловияОтбора);
	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ГруппаИсполнителейЗадач");
	
КонецФункции

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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