Начисления / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	Если РасчетЗарплатыРасширенныйКлиентСервер.СпособРасчетаИспользуетФормулу(СпособРасчета) Тогда
		ПроверятьФормулуРасчета = Истина;
		Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыКорпоративнаяПодсистемы.ЛьготыСотрудников") Тогда
			Модуль = ОбщегоНазначения.ОбщийМодуль("ЛьготыСотрудников");
		    Модуль.ПриПроверкеЗаполненияФормулыРасчетаНачисления(ЭтотОбъект, ПроверятьФормулуРасчета);
		КонецЕсли;
		Если ПроверятьФормулуРасчета Тогда
			Если Не ЗначениеЗаполнено(ФормулаРасчета) И Рассчитывается Тогда 
				ТекстСообщения = НСтр("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 = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

Связанные материалы