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