Договор (работы, услуги) / Модуль объекта

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

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	Если ЗарплатаКадры.ОтключитьБизнесЛогикуПриЗаписи(ЭтотОбъект) Тогда
		Возврат;
	КонецЕсли;

	Если СпособОплаты = Перечисления.СпособыОплатыПоДоговоруГПХ.ПоАктамВыполненныхРабот Тогда
		МесяцНачисления = '00010101';
	Иначе
		МесяцНачисления = НачалоМесяца(ДатаОкончания);
	КонецЕсли;
	
	Документы.ДоговорРаботыУслуги.ЗаполнитьДатуЗапретаРедактирования(ЭтотОбъект);
	
	ОтражениеЗарплатыВБухучетеРасширенный.ОбновитьДанныеБухучетаДокументаПередЗаписью(ЭтотОбъект);
	
КонецПроцедуры

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	ЗарплатаКадры.ПроверитьКорректностьДаты(Ссылка, ДатаНачала, "Объект.ДатаНачала", Отказ, НСтр("ru='Дата начала'"), , , Ложь);
	ЗарплатаКадрыРасширенный.ПроверитьПериодРегистратораНачисленийУдержаний(ДатаНачала, ДатаОкончания, ЭтотОбъект, "ДатаОкончания", Отказ);
	
	Если Не ЗначениеЗаполнено(ДатаОкончания) И СпособОплаты = Перечисления.СпособыОплатыПоДоговоруГПХ.ОднократноВКонцеСрока Тогда
		ТекстСообщения = НСтр("ru = 'При способе оплаты однократно в конце срока необходимо задать дату окончания'");
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "ДатаОкончания", , Отказ);
	КонецЕсли;
	
	Если Не ОтразитьТрудовуюДеятельность Тогда
		ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты,
			ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("КодПоОКЗ"));
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
		ЗарплатаКадры.ЗаполнитьПоОснованиюСотрудником(ЭтотОбъект, ДанныеЗаполнения, , Истина)
	ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
		Если ДанныеЗаполнения.Свойство("Действие") Тогда
			Если ДанныеЗаполнения.Действие = "Исправить" Тогда
				ИсправлениеДокументовЗарплатаКадры.СкопироватьДокумент(ЭтотОбъект, ДанныеЗаполнения.Ссылка);
				ИсправленныйДокумент = ДанныеЗаполнения.Ссылка;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

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

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеСервер.ПодготовитьНаборыЗаписейКУдалениюПроведения(ЭтотОбъект, ЗначениеЗаполнено(ЭтотОбъект.ИсправленныйДокумент));
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

#Область ОбменДанными

Функция СовместноРегистрируемыеОбъекты() Экспорт
	Возврат ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Сотрудник);
КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

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

Функция ДанныеДляРегистрацииВУчетаСтажаПФР()
	МассивСсылок = Новый Массив;
	МассивСсылок.Добавить(Ссылка);
	
	ДанныеДляРегистрации = Документы.ДоговорРаботыУслуги.ДанныеДляРегистрацииВУчетаСтажаПФР(МассивСсылок);
	
	Возврат ДанныеДляРегистрации[Ссылка];
	
КонецФункции

Процедура ЗарегистрироватьДанныеОВремениДляРасчетаСреднегоФСС() Экспорт
	ДатаОбъединенияВзносов = УчетСтраховыхВзносов.ДатаОбъединенияВзносов();
	Если ДатаОкончания < ДатаОбъединенияВзносов Тогда
		Возврат;
	КонецЕсли;
	РегистрыСведений.ДанныеОВремениДляРасчетаСреднегоФСС.УстановитьОтработанныеДни(
		Движения,
		ДанныеДляСреднегоФСС(),
		Макс(ДатаНачала, ДатаОбъединенияВзносов),
		ДатаОкончания);
КонецПроцедуры

Функция ДанныеДляСреднегоФСС()
	Возврат РегистрыСведений.ДанныеОВремениДляРасчетаСреднегоФСС.ДанныеДляУстановитьОтработанныеДни(
		Ссылка,
		ФизическоеЛицо,
		ЗарплатаКадры.ГоловнаяОрганизация(Организация),
		Ссылка,
		ПланыВидовРасчета.Начисления.ПустаяСсылка());
КонецФункции

#КонецОбласти

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

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