(не используется) заявка кабинет сотрудника / Форма бизнес-процесса / Модуль формы

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

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

&НаКлиенте
Перем ОткрытаФормаВыбораИсполнителя;  // Признак того, что исполнитель выбирается из формы, а не быстрым вводом.
&НаКлиенте
Перем КонтекстВыбора;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Для нового объекта выполняем код инициализации формы в ПриСозданииНаСервере.
	// Для существующего - в ПриЧтенииНаСервере.
	Если Объект.Ссылка.Пустая() Тогда
		ИнициализацияФормы();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ОбновитьДоступностьКомандОстановки();
	
КонецПроцедуры

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

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

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

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	ПроверитьДатуЗавершенияОтложенногоПроцесса(ТекущийОбъект, Отказ);
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	Оповестить("Запись_Задание", ПараметрыЗаписи, Объект.Ссылка);
	Оповестить("Запись_ЗадачаИсполнителя", ПараметрыЗаписи, Неопределено);
	Если ПараметрыЗаписи.Свойство("Старт") И ПараметрыЗаписи.Старт Тогда
		ПодключитьОбработчикОжидания("ОбновитьФорму", 0.2, Истина);
	КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

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

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

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

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

&НаКлиенте
Процедура ПредметНажатие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ПоказатьЗначение(,Объект.Предмет);
	
КонецПроцедуры

&НаКлиенте
Процедура ИнфоНадписьЗаголовокОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ОткрытьНастройкуОтложенногоСтарта();
КонецПроцедуры

&НаКлиенте
Процедура ИсполнительНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	БизнесПроцессыИЗадачиКлиент.ВыбратьИсполнителя(Элемент, Объект.Исполнитель);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура СрокИсполненияПриИзменении(Элемент)
	Если Объект.СрокИсполнения = НачалоДня(Объект.СрокИсполнения) Тогда
		Объект.СрокИсполнения = КонецДня(Объект.СрокИсполнения);
	КонецЕсли;
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура Остановить(Команда)
	
	БизнесПроцессыИЗадачиКлиент.ОстановитьБизнесПроцессИзФормыОбъекта(ЭтотОбъект);
	ОбновитьДоступностьКомандОстановки();
	
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьБизнесПроцесс(Команда)
	
	БизнесПроцессыИЗадачиКлиент.ПродолжитьБизнесПроцессИзФормыОбъекта(ЭтотОбъект);
	ОбновитьДоступностьКомандОстановки();
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьОтложенныйСтарт(Команда)
	ОткрытьНастройкуОтложенногоСтарта();
КонецПроцедуры

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьСвойстваГруппеСостояний(Форма)

	ОтображатьГруппу = Форма.Объект.Завершен Или ОбъектСтартован(Форма);
	Форма.Элементы.ГруппаСостояние.Видимость = ОтображатьГруппу;
	
	Если НЕ ОтображатьГруппу Тогда
		Возврат;
	КонецЕсли;
	
	МассивСтрок = Новый Массив;
	Высота = 1;
	
	Если Форма.Объект.Завершен Тогда
		ДатаЗавершенияСтрокой = ?(Форма.ИспользоватьДатуИВремяВСрокахЗадач, 
			Формат(Форма.Объект.ДатаЗавершения, "ДЛФ=DT"), Формат(Форма.Объект.ДатаЗавершения, "ДЛФ=D"));
		СтрокаТекста = ?(Форма.Объект.Выполнено, 
			НСтр("ru = 'Задание выполнено %1.'"), 
			НСтр("ru = 'Задание отменено %1.'"));
		ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаТекста, ДатаЗавершенияСтрокой);
		МассивСтрок.Добавить(ТекстСостояния);
		
		Для каждого Элемент Из Форма.Элементы Цикл
			Если ТипЗнч(Элемент) <> Тип("ПолеФормы") И ТипЗнч(Элемент) <> Тип("ГруппаФормы") Тогда
				Продолжить;
			КонецЕсли;
			Элемент.ТолькоПросмотр = Истина;
		КонецЦикла;	
		
	ИначеЕсли Форма.Объект.Стартован Тогда
		ТекстСостояния = ?(Форма.ИзменятьЗаданияЗаднимЧислом, 
			НСтр("ru = 'Изменения формулировки, важности, автора, а также перенос сроков исполнения и проверки задания вступят в силу немедленно для ранее выданной задачи.'"), 
			НСтр("ru = 'Изменения формулировки, важности, автора, а также перенос сроков исполнения и проверки задания не будут отражены в ранее выданной задаче.'"));
		МассивСтрок.Добавить(ТекстСостояния);
		Высота = 2;
		
	ИначеЕсли Форма.Отложен Тогда
		ДатаОтложенногоСтартаСтрокой = ?(Форма.ИспользоватьДатуИВремяВСрокахЗадач, 
			Формат(Форма.ДатаОтложенногоСтарта, "ДЛФ=DT"), Формат(Форма.ДатаОтложенногоСтарта, "ДЛФ=D"));
		ТекстСостояния = НСтр("ru = 'Задание будет запущено'") + " ";
		МассивСтрок.Добавить(ТекстСостояния);
		МассивСтрок.Добавить(Новый ФорматированнаяСтрока(ДатаОтложенногоСтартаСтрокой,,,, "ОткрытьНастройкуОтложенногоСтарта"));
	КонецЕсли;
	
	Форма.ИнфоНадписьЗаголовок = Новый ФорматированнаяСтрока(МассивСтрок);
	Форма.Элементы.ИнфоНадписьЗаголовок.МаксимальнаяВысота = Высота;
	
КонецПроцедуры

&НаСервере
Процедура ПроверитьДатуЗавершенияОтложенногоПроцесса(ПроверяемыйОбъект, Отказ)

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

&НаКлиенте
Процедура ОткрытьНастройкуОтложенногоСтарта()

	Если КлючевыеРеквизитыФормыЗаполнены() Тогда
		БизнесПроцессыИЗадачиКлиент.НастроитьОтложенныйСтарт(Объект.Ссылка, Объект.СрокИсполнения);
	КонецЕсли;

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

&НаКлиенте
Функция КлючевыеРеквизитыФормыЗаполнены()

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

&НаКлиентеНаСервереБезКонтекста
Функция ОбъектСтартован(Форма)
	Возврат Форма.Объект.Стартован ИЛИ Форма.Отложен;
КонецФункции

&НаСервере
Процедура УстановитьРеквизитыОтложенногоСтарта()

	ДатаОтложенногоСтарта = БизнесПроцессыИЗадачиСервер.ДатаОтложенногоСтартаПроцесса(Объект.Ссылка);
	Отложен = (ДатаОтложенногоСтарта <> '00010101');
	
КонецПроцедуры

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

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