Обращение сотрудника / Модуль объекта

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

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

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

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

// См. УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа.
//
// Параметры:
//   Таблица - см. УправлениеДоступом.ТаблицаНаборыЗначенийДоступа
//
Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) Экспорт
	ЗаполнитьНаборыЗначенийДоступаПоУмолчанию(Таблица);	
КонецПроцедуры

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Обработчики событий бизнес-процесса.

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

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

Процедура ПриКопировании(ОбъектКопирования)
	ДатаЗавершения = '00010101000000';	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обработчики событий элементов карты маршрута.

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

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

Процедура ЗавершениеПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)
	ОтправитьПочтовоеСообщение();
	ДатаЗавершения = БизнесПроцессыИЗадачиСервер.ДатаЗавершенияБизнесПроцесса(Ссылка);
	Выполнено = Истина;
	Записать();	
КонецПроцедуры

Процедура СогласоватьЗаявкуПриВыполнении(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ)
	ЗадачаОбъект = Задача.ПолучитьОбъект();
	ЗадачаОбъект.ВыполнитьЗадачу();
КонецПроцедуры

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

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

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

Функция ДоступноВыполнение() Экспорт
	Возврат ДоступностьДействий(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("Выполнено"))["Выполнено"];
КонецФункции

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

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

#Область ДоступностьДействий

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

Функция ДоступноВыполнено(Данные)
	
	Если Данные.ЗадачаВыполнена Тогда
		Возврат Ложь;	
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

Функция ДоступноОтказать(Данные)
	Возврат Не Данные.ЗадачаВыполнена;	
КонецФункции

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

Процедура ИзменитьПредметЗадач()

	УстановитьПривилегированныйРежим(Истина);
	НачатьТранзакцию();
	Попытка
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя");
		ЭлементБлокировки.УстановитьЗначение("БизнесПроцесс", Ссылка);
		Блокировка.Заблокировать();
		
		Запрос = Новый Запрос(
			"ВЫБРАТЬ
			|	Задачи.Ссылка КАК Ссылка
			|ИЗ
			|	Задача.ЗадачаИсполнителя КАК Задачи
			|ГДЕ
			|	Задачи.БизнесПроцесс = &БизнесПроцесс");

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

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

Функция НаименованиеЗадачиДляВыполнения()
	Возврат Наименование;		
КонецФункции

Функция СрокИсполненияЗадачиДляВыполнения()
	Возврат СрокИсполнения;		
КонецФункции

Процедура ЗаполнитьНаборыЗначенийДоступаПоУмолчанию(Таблица)
	
	// Логика ограничения по умолчанию для
	// - чтения:    Автор ИЛИ Исполнитель (с учетом адресации) ИЛИ Проверяющий (с учетом адресации)
	// - изменения: Автор.
	
	// Если предмет не задан (т.е. бизнес-процесс без основания), тогда предмет не участвует в логике ограничения.
	
	// Чтение, Изменение: набор № 1.
	Строка = Таблица.Добавить();
	Строка.НомерНабора     = 1;
	Строка.Чтение          = Истина;
	Строка.Изменение       = Истина;
	Строка.ЗначениеДоступа = Автор;
	
	// Чтение: набор № 2.
	Строка = Таблица.Добавить();
	Строка.НомерНабора     = 2;
	Строка.Чтение          = Истина;
	Строка.ЗначениеДоступа = ГруппаИсполнителейЗадач;
	
КонецПроцедуры

Процедура ОтправитьПочтовоеСообщение()
	БизнесПроцессыЗаявокСотрудников.ОтправитьПочтовоеСообщение(ЭтотОбъект,
		Строка(ШаблонДокумента),
		ФайлыОтвета());
КонецПроцедуры

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

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

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

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