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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ТекстЗаголовкаФормы = Параметры.ЗаголовокФормы;
	ЗаголовокПоУмолчанию = ПустаяСтрока(ТекстЗаголовкаФормы);
	Если НЕ ЗаголовокПоУмолчанию Тогда
		Заголовок = ТекстЗаголовкаФормы;
	КонецЕсли;
	
	ТекстЗаголовка = "";
	Если Параметры.КоличествоЗадач > 1 Тогда
		ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (%2)'"),
			?(ЗаголовокПоУмолчанию, НСтр("ru = 'Выбрано задач'"), ТекстЗаголовкаФормы),
			Строка(Параметры.КоличествоЗадач));
	ИначеЕсли Параметры.КоличествоЗадач = 1 Тогда
		ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 %2'"),
			?(ЗаголовокПоУмолчанию, НСтр("ru = 'Выбранная задача'"), ТекстЗаголовкаФормы),
			Строка(Параметры.Задача));
	Иначе
		Элементы.ДекорацияЗаголовок.Видимость = Ложь;
	КонецЕсли;
	Элементы.ДекорацияЗаголовок.Заголовок = ТекстЗаголовка;
	
	УстановитьТипыОбъектовАдресации();
	УстановитьСостояниеЭлементов();
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	Если ТипАдресации = 0 Тогда
		Если НЕ ЗначениеЗаполнено(Исполнитель) Тогда
			ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Не указан исполнитель задачи.'"),,,
				"Исполнитель", Отказ);
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	Если Роль.Пустая() Тогда
		ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Не указана роль исполнителей задачи.'"),,,
			"Роль", Отказ);
		Возврат;
	КонецЕсли;
	
	ЗаданыТипыОсновногоОбъектаАдресации = ИспользуетсяСОбъектамиАдресации
		И ЗначениеЗаполнено(ТипыОсновногоОбъектаАдресации);
	ЗаданыТипыДополнительногоОбъектаАдресации = ИспользуетсяСОбъектамиАдресации 
		И ЗначениеЗаполнено(ТипыДополнительногоОбъектаАдресации);
	
	Если ЗаданыТипыОсновногоОбъектаАдресации И ОсновнойОбъектАдресации = Неопределено Тогда
		ОбщегоНазначения.СообщитьПользователю(
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"),	
				ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Роль, "ТипыОсновногоОбъектаАдресации")),,,
				"ОсновнойОбъектАдресации", Отказ);
		Возврат;
	ИначеЕсли ЗаданыТипыДополнительногоОбъектаАдресации И ДополнительныйОбъектАдресации = Неопределено Тогда
		ОбщегоНазначения.СообщитьПользователю(
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"), 
				ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Роль, "ТипыДополнительногоОбъектаАдресации")),,,
				"ДополнительныйОбъектАдресации", Отказ);
		Возврат;
	КонецЕсли;
	
	Если НЕ ИгнорироватьПредупреждения 
		И НЕ БизнесПроцессыИЗадачиСервер.ЕстьИсполнителиРоли(Роль, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации) Тогда
		ОбщегоНазначения.СообщитьПользователю(
			НСтр("ru = 'На указанную роль не назначено ни одного исполнителя. (Чтобы проигнорировать это предупреждение, установите флажок.)'"),,,
			"Роль", Отказ);
		Элементы.ИгнорироватьПредупреждения.Видимость = Истина;
	КонецЕсли;	
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ИсполнительПриИзменении(Элемент)
	
	ТипАдресации = 0;
	ОсновнойОбъектАдресации = Неопределено;
	ДополнительныйОбъектАдресации = Неопределено;
	УстановитьТипыОбъектовАдресации();
	УстановитьСостояниеЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура РольПриИзменении(Элемент)
	
	ТипАдресации = 1;
	Исполнитель = Неопределено;
	ОсновнойОбъектАдресации = Неопределено;
	ДополнительныйОбъектАдресации = Неопределено;
	УстановитьТипыОбъектовАдресации();
	УстановитьСостояниеЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура ТипАдресацииПриИзменении(Элемент)
	УстановитьСостояниеЭлементов();
КонецПроцедуры

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

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

&НаКлиенте
Процедура Перенаправить(Команда)
	
	ОчиститьСообщения();
	Если НЕ ПроверитьЗаполнение() Тогда
		Возврат;
	КонецЕсли;
	Закрыть(ПараметрыЗакрытия());
	
КонецПроцедуры

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

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

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

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

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

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