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