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

файл

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры
	
#КонецОбласти

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

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

&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
	ЗаполнитьДанныеФормыПоОрганизации();
КонецПроцедуры

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

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

&НаКлиенте
Процедура Подключаемый_ПодписиДокументовЭлементНажатие(Элемент) 
	ПодписиДокументовКлиент.РасширеннаяПодсказкаНажатие(ЭтотОбъект, Элемент.Имя);
КонецПроцедуры
// Конец Обработчик подсистемы "ПодписиДокументов".

// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
&НаКлиенте
Процедура Подключаемый_ДекорацияСостояниеОригиналаНажатие()

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

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

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

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

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

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

&НаКлиенте
Процедура СотрудникиПослеУдаления(Элемент)
	
	ЗарплатаКадрыКлиентСервер.КлючевыеРеквизитыЗаполненияФормыУстановитьОтображениеПредупреждения(ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

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

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

// ИнтеграцияС1САрхивом

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

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

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

// Конец ИнтеграцияС1САрхивом

// СтандартныеПодсистемы.Свойства
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

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

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьЗадачуПоОбработкеДокументаОповещение(Контекст, ДополнительныеПараметры) Экспорт
	ВыполнитьЗадачуПоОбработкеДокументаНаСервере(Контекст);
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры, Контекст);
КонецПроцедуры

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

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

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

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ОбновитьПодключаемыеКоманды(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

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

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

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

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

&НаКлиенте
Процедура ЗаполнитьПоГрафикуОтпусковЗавершение(РезультатЗакрытия, ДополнительныеПараметры)  Экспорт        					 
	Если ЗначениеЗаполнено(РезультатЗакрытия) тогда  
		ЗаполнитьПоГрафикуОтпусковНаСервере(РезультатЗакрытия);
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПриПолученииДанныхНаСервере()
	
	МаксимальныйИдентификаторСтрокиСотрудника = МаксимальныйИдентификаторСтроки();
	ЗаполнитьДанныеДокументов();
	
	УстановитьОтображениеНомераПервичногоДокумента(ЭтотОбъект);
	
	Для Каждого СтрокаСотрудника Из Объект.Сотрудники Цикл 
		УстановитьПредставленияСтрокиСотрудника(СтрокаСотрудника);
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьИдентификаторСтрокиСотрудника(Форма, СтрокаСотрудника)
	
	Форма.МаксимальныйИдентификаторСтрокиСотрудника = Форма.МаксимальныйИдентификаторСтрокиСотрудника + 1;
	СтрокаСотрудника.ИдентификаторСтрокиСотрудника = Форма.МаксимальныйИдентификаторСтрокиСотрудника;
	
КонецПроцедуры

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

&НаСервере
Процедура СотрудникиПриОкончанииРедактированияНаСервере(ИдентификаторСтроки)
	
	УстановитьИнформационнуюНадпись();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ИмяДокументаОтпуск(ОтпускБезОплаты)
	
	Возврат ?(ОтпускБезОплаты, "ОтпускБезСохраненияОплаты", "Отпуск");
	
КонецФункции

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

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

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

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

&НаСервере
Функция МаксимальныйИдентификаторСтроки() Экспорт
	
	МаксимальныйИдентификатор = 0;
	Для каждого СтрокаСотрудника Из Объект.Сотрудники Цикл
		Если МаксимальныйИдентификатор < СтрокаСотрудника.ИдентификаторСтрокиСотрудника Тогда
			МаксимальныйИдентификатор = СтрокаСотрудника.ИдентификаторСтрокиСотрудника;
		КонецЕсли; 
	КонецЦикла;
	
	Возврат МаксимальныйИдентификатор;
	
КонецФункции

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

&НаСервере
Процедура УдалитьСтрокиОтпусковПоИдентификатору(ИдентификаторСтрокиСотрудника)
	
	Отбор = Новый Структура("ИдентификаторСтрокиСотрудника", ИдентификаторСтрокиСотрудника);
	СтрокиОтпусков = Объект.Отпуска.НайтиСтроки(Отбор);
	Для Каждого СтрокаОтпуска Из СтрокиОтпусков Цикл 
		Объект.Отпуска.Удалить(СтрокаОтпуска);
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

#Область КлючевыеРеквизитыЗаполненияФормы

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

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

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

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