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