Больничный лист / Периоды простоя / Модуль формы

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПериодыПростояПриИзменении(Элемент)
	АвтозаполнениеПериодовОплаты = Ложь;
	ПроверитьЗаполнение();
КонецПроцедуры

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

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

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

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

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

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

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

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

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