Больничный лист / Исключаемые периоды / Модуль формы

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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыИсключаемыеПериоды

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

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

&НаКлиенте
Процедура ИсключаемыеПериодыПриИзменении(Элемент)
	АвтозаполнениеПериодовОплаты = Ложь;
	ПодключитьОбработчикОжидания("ПроверитьНастройкиПользователя", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ИсключаемыеПериодыПередУдалением(Элемент, Отказ)
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	АвтозаполнениеПериодовОплаты = Ложь;
	ПодключитьОбработчикОжидания("ПроверитьНастройкиПользователя", 0.1, Истина);
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура Заполнить(Команда)
	ЗаполнитьНаСервере();
КонецПроцедуры

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

&НаКлиенте
Процедура СдвигатьПериодОплаты(Команда)
	СдвигатьПериодОплаты = Не СдвигатьПериодОплаты;
	Элементы.СдвигатьПериодОплаты.Пометка = СдвигатьПериодОплаты;
	АвтозаполнениеПериодовОплаты = Ложь;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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