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