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