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