Отпуск сотрудников / Сведения об отпуске / Модуль формы

файл

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

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

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

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

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

&НаКлиенте
Процедура ДатаНачалаОсновногоОтпускаПриИзменении(Элемент)
	
	ДатаНачалаОсновногоОтпускаПриИзмененииНаСервере();
	
КонецПроцедуры

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

&НаКлиенте
Процедура КоличествоДнейОсновногоОтпускаПриИзменении(Элемент)
	
	КоличествоДнейОсновногоОтпускаПриИзмененииНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ПредоставитьКомпенсациюОсновногоОтпускаПриИзменении(Элемент)
	
	ПредоставитьКомпенсациюОсновногоОтпускаПриИзмененииНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура КоличествоДнейКомпенсацииОсновногоОтпускаПриИзменении(Элемент)
	
	КоличествоДнейКомпенсацииОсновногоОтпускаПриИзмененииНаСервере();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ДополнительныеОтпускаДатаНачалаПриИзмененииНаСервере(ИдентификаторСтроки)
	
	УстановитьОтпускВРабочихДняхПоДоговору();
	Строка = ДополнительныеОтпуска.НайтиПоИдентификатору(ИдентификаторСтроки);
	
	ОписаниеВидаОтпуска = ОстаткиОтпусков.ОписаниеВидаОтпуска(Строка.ВидОтпуска, ОтпускВРабочихДняхПоДоговору);
	Строка.КоличествоДней = УчетРабочегоВремениРасширенный.ДлительностьИнтервала(Сотрудник, Строка.ДатаНачала, Строка.ДатаОкончания, ОписаниеВидаОтпуска.СпособРасчетаПоКалендарнымДням, ОписаниеВидаОтпуска.ЕжегодныйОтпуск);
	ОбновитьРабочийГодДополнительногоОтпуска(Строка);
	
КонецПроцедуры

&НаСервере
Процедура ДополнительныеОтпускаДатаОкончанияПриИзмененииНаСервере(ИдентификаторСтроки)
	
	Строка = ДополнительныеОтпуска.НайтиПоИдентификатору(ИдентификаторСтроки);
	
	ОписаниеВидаОтпуска = ОстаткиОтпусков.ОписаниеВидаОтпуска(Строка.ВидОтпуска, ОтпускВРабочихДняхПоДоговору);
	Строка.КоличествоДней = УчетРабочегоВремениРасширенный.ДлительностьИнтервала(Сотрудник, Строка.ДатаНачала, Строка.ДатаОкончания, ОписаниеВидаОтпуска.СпособРасчетаПоКалендарнымДням, ОписаниеВидаОтпуска.ЕжегодныйОтпуск);
	СдвинутьПериодыОтпусков(Строка.ВидОтпуска, Строка.ДатаНачала, Строка.ДатаОкончания);
	ОбновитьРабочийГодДополнительногоОтпуска(Строка);
	
КонецПроцедуры

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

	ОбновитьРабочийГодДополнительногоОтпуска(Строка);
	
КонецПроцедуры

&НаСервере
Процедура ДополнительныеОтпускаКоличествоДнейКомпенсацииПриИзмененииНаСервере(ИдентификаторСтроки)
	
	Строка = ДополнительныеОтпуска.НайтиПоИдентификатору(ИдентификаторСтроки);
	ОбновитьРабочийГодДополнительногоОтпуска(Строка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

		ПериодДополнительногоОтпуска = ОстаткиОтпусков.РабочийПериодОтпуска(СтруктураПараметров);
		
		Строка.НачалоПериодаЗаКоторыйПредоставляетсяОтпуск	= ПериодДополнительногоОтпуска.РабочийГодС;
		Строка.КонецПериодаЗаКоторыйПредоставляетсяОтпуск	= ПериодДополнительногоОтпуска.РабочийГодПо;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Функция ДатаНачалаСледующегоОтпуска()
	
	ПериодОтпуска = ОбщийПериодОтпуска(ЭтаФорма);
	Если Не ЗначениеЗаполнено(ПериодОтпуска.Окончание) Тогда 
		Возврат '00010101';
	КонецЕсли;
	
	Возврат ПериодОтпуска.Окончание + 86400;
	
КонецФункции

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

&НаСервере
Процедура СдвинутьПериодыОтпусков(ВыбранныйВидОтпуска, ВыбраннаяДатаНачала, ВыбраннаяДатаОкончания)
	
	Если Не ЗначениеЗаполнено(ВыбранныйВидОтпуска)
		Или Не ЗначениеЗаполнено(ВыбраннаяДатаНачала) Или Не ЗначениеЗаполнено(ВыбраннаяДатаОкончания) Тогда
		Возврат
	КонецЕсли;
	
	ОсновнойОтпуск = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыОтпусков.Основной");
	
	ОтпускаСотрудника = ДополнительныеОтпуска.Выгрузить(, "ВидОтпуска, ДатаНачала, КоличествоДней");
	
	НоваяСтрока = ОтпускаСотрудника.Добавить();
	НоваяСтрока.ВидОтпуска = ОсновнойОтпуск;
	НоваяСтрока.ДатаНачала = ДатаНачалаОсновногоОтпуска;
	НоваяСтрока.КоличествоДней = КоличествоДнейОсновногоОтпуска;
	
	ОтпускаСотрудника.Сортировать("ДатаНачала");
	Отбор = Новый Структура("ВидОтпуска, ДатаНачала, КоличествоДней");
	НоваяДатаНачала = ВыбраннаяДатаОкончания + 86400;
	Для Каждого ОтпускСотрудника Из ОтпускаСотрудника Цикл
		Если Не ЗначениеЗаполнено(ОтпускСотрудника.ДатаНачала) Или Не ЗначениеЗаполнено(ОтпускСотрудника.КоличествоДней) Тогда 
			Продолжить;
		КонецЕсли;
		Если ОтпускСотрудника.ДатаНачала <= ВыбраннаяДатаНачала Тогда 
			Продолжить;
		КонецЕсли;
		Если ОтпускСотрудника.ВидОтпуска = ОсновнойОтпуск Тогда 
			ОписаниеВидаОтпуска = ОстаткиОтпусков.ОписаниеВидаОтпуска(ОсновнойОтпуск, ОтпускВРабочихДняхПоДоговору);
			ДатаНачалаОсновногоОтпуска = НоваяДатаНачала;
			ДатаОкончанияОсновногоОтпуска = ОстаткиОтпусковКлиентСервер.ДатаОкончанияОтпуска(Сотрудник, ДатаНачалаОсновногоОтпуска, КоличествоДнейОсновногоОтпуска, ОписаниеВидаОтпуска);
			НоваяДатаНачала = ДатаОкончанияОсновногоОтпуска + 86400;
		Иначе 
			ЗаполнитьЗначенияСвойств(Отбор, ОтпускСотрудника);
			Строка = ДополнительныеОтпуска.НайтиСтроки(Отбор)[0];
			ОписаниеВидаОтпуска = ОстаткиОтпусков.ОписаниеВидаОтпуска(Строка.ВидОтпуска, ОтпускВРабочихДняхПоДоговору);
			Строка.ДатаНачала = НоваяДатаНачала;
			Строка.ДатаОкончания = ОстаткиОтпусковКлиентСервер.ДатаОкончанияОтпуска(Сотрудник, Строка.ДатаНачала, Строка.КоличествоДней, ОписаниеВидаОтпуска);
			НоваяДатаНачала = Строка.ДатаОкончания + 86400;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

&НаСервере
Процедура ПроверитьПериодОтпуска(Отказ)
	
	Если Отказ Тогда 
		Возврат;
	КонецЕсли;
	
	Если Не ПредоставитьДополнительныйОтпуск Тогда 
		Возврат;
	КонецЕсли;
	
	ОсновнойОтпуск = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыОтпусков.Основной");
	ОтпускаСотрудника = ДополнительныеОтпуска.Выгрузить(, "ВидОтпуска, ДатаНачала, ДатаОкончания");
	
	ОтпускаСотрудника.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
	Для Сч = 1 По ОтпускаСотрудника.Количество() Цикл
		ОтпускаСотрудника[Сч-1].НомерСтроки = Сч;
	КонецЦикла;
	
	Если ПредоставитьОсновнойОтпуск Тогда 
		НоваяСтрока = ОтпускаСотрудника.Добавить();
		НоваяСтрока.ВидОтпуска = ОсновнойОтпуск;
		НоваяСтрока.ДатаНачала = ДатаНачалаОсновногоОтпуска;
		НоваяСтрока.ДатаОкончания = ДатаОкончанияОсновногоОтпуска;
	КонецЕсли;
	
	ОтпускаСотрудника.Сортировать("ДатаНачала");
	ПредыдущаяСтрока = Неопределено;
	Для Каждого ОтпускСотрудника Из ОтпускаСотрудника Цикл
		Если Не ЗначениеЗаполнено(ОтпускСотрудника.ДатаНачала) Тогда 
			Продолжить;
		КонецЕсли;
		Если ПредыдущаяСтрока = Неопределено Тогда 
			ПредыдущаяСтрока = ОтпускСотрудника;
			Продолжить;
		КонецЕсли;
		ДополнительныйОтпуск = ОтпускСотрудника;
		Если ОтпускСотрудника.ВидОтпуска = ОсновнойОтпуск Тогда 
			ДополнительныйОтпуск = ПредыдущаяСтрока;
		КонецЕсли;
		ИндексСтроки = ДополнительныйОтпуск.НомерСтроки - 1;
		Если ПредыдущаяСтрока.ДатаОкончания + 86400 < ОтпускСотрудника.ДатаНачала Тогда 
			НачалоРазрыва = ПредыдущаяСтрока.ДатаОкончания + 86400;
			ОкончаниеРазрыва = ОтпускСотрудника.ДатаНачала - 86400;
			Если НачалоРазрыва = ОкончаниеРазрыва Тогда
				ТекстСообщения = НСтр("ru = 'Период отпуска прерывается %1.'");
				ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Формат(НачалоРазрыва, "ДЛФ=D"));
			Иначе 				
				ТекстСообщения = НСтр("ru = 'Период отпуска прерывается с %1 по %2.'");
				ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Формат(НачалоРазрыва, "ДЛФ=D"), Формат(ОкончаниеРазрыва, "ДЛФ=D"));
			КонецЕсли;
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "ДополнительныеОтпуска[" + ИндексСтроки + "].ДатаНачала", , Отказ);
		КонецЕсли;
		Если ПредыдущаяСтрока.ДатаОкончания + 86400 > ОтпускСотрудника.ДатаНачала Тогда 
			ПредыдущийОтпуск = НСтр("ru = '%1 (%2 - %3)'");
			ПредыдущийОтпуск = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредыдущийОтпуск,
				Строка(ПредыдущаяСтрока.ВидОтпуска), Формат(ПредыдущаяСтрока.ДатаНачала, "ДЛФ=D"), Формат(ПредыдущаяСтрока.ДатаОкончания, "ДЛФ=D"));
			ТекущийОтпуск = НСтр("ru = '%1 (%2 - %3)'");
			ТекущийОтпуск = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекущийОтпуск,
				Строка(ОтпускСотрудника.ВидОтпуска), Формат(ОтпускСотрудника.ДатаНачала, "ДЛФ=D"), Формат(ОтпускСотрудника.ДатаОкончания, "ДЛФ=D"));
			ТекстСообщения = НСтр("ru = 'Пересекаются периоды отпусков %1 и %2.'");
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ПредыдущийОтпуск, ТекущийОтпуск); 
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "ДополнительныеОтпуска[" + ИндексСтроки + "].ДатаНачала", , Отказ);
		КонецЕсли;
		ПредыдущаяСтрока = ОтпускСотрудника;
	КонецЦикла;
	
КонецПроцедуры

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

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

&НаСервере
Процедура ПроверитьНазначениеДополнительныхОтпусков(Строка = Неопределено)
	
	Если Не ЗначениеЗаполнено(Сотрудник) Тогда 
		Возврат;
	КонецЕсли;
	
	Если Строка <> Неопределено И Не Строка.ЕжегодныйОтпуск Тогда 
		Возврат;
	КонецЕсли;
	
	Если ДополнительныеОтпуска.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	ВидыОтпусковСотрудника = Новый Массив;
	Если Строка <> Неопределено Тогда 
		ВидыОтпусковСотрудника.Добавить(Строка.ВидОтпуска);
	Иначе 
		ВидыОтпусковСотрудника = ДополнительныеОтпуска.Выгрузить(, "ВидОтпуска").ВыгрузитьКолонку("ВидОтпуска");
	КонецЕсли;
	
	РезультатЗапроса = ОстаткиОтпусков.ЗапросНазначениеДополнительныхОтпусков(Сотрудник, ВидыОтпусковСотрудника);
	
	Выборка = РезультатЗапроса.Выбрать();
	Пока Выборка.Следующий() Цикл
		ТекстСообщения = НСтр("ru = 'Вид отпуска %1 не назначен сотруднику.'");
		ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Выборка.ВидОтпуска);
		СтрокиВидаОтпуска = ДополнительныеОтпуска.НайтиСтроки(Новый Структура("ВидОтпуска", Выборка.ВидОтпуска));
		Если СтрокиВидаОтпуска.Количество() > 0 Тогда 
			ИндексСтроки = ДополнительныеОтпуска.Индекс(СтрокиВидаОтпуска[0]);
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , "ДополнительныеОтпуска[" + Формат(ИндексСтроки, "ЧН=0; ЧГ=0") + "].ВидОтпуска");
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

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