Договор авторского заказа / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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