Исходящая справка для расчета пособий / Модуль объекта

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

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

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

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

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

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

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

#Область ОбработкаПроверкиЗаполнения

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

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

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

Процедура ПроверитьПериодЗаполненияДокумента(Отказ)
	Если ЗначениеЗаполнено(ГодС)
		И ЗначениеЗаполнено(ГодПо)
		И ГодС > ГодПо Тогда
		ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Неправильно задан период заполнения документа: начало периода не может быть позже окончания.'"),,,,Отказ);
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьЗаполнениеПериодовРаботы(Отказ)
	СтрокаНачалаСообщенияОбОшибке = НСтр("ru = 'В строке номер %1 табл. части ""Периоды работы""'") + ": ";
	
	Для каждого ПериодРаботы Из ПериодыРаботы Цикл
		
		Если ЗначениеЗаполнено(ПериодРаботы.ПериодРаботыС)
			И ЗначениеЗаполнено(ПериодРаботы.ПериодРаботыПо)
			И ПериодРаботы.ПериодРаботыС > ПериодРаботы.ПериодРаботыПо Тогда
			СообщениеТекст = СтрокаНачалаСообщенияОбОшибке + НСтр("ru = 'неверно указан период работы: начало периода должно предшествовать окончанию периода.'");
			СообщениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеТекст, ПериодРаботы.НомерСтроки);
			ОбщегоНазначения.СообщитьПользователю(СообщениеТекст, , , , Отказ);
		КонецЕсли;
		
		Для каждого ПовторяющаясяСтрока Из ПериодыРаботы Цикл
			
			Если  ПериодРаботы.НомерСтроки >=  ПовторяющаясяСтрока.НомерСтроки
				Или ((ПериодРаботы.ПериодРаботыС > ПовторяющаясяСтрока.ПериодРаботыПо)
				Или	(ПериодРаботы.ПериодРаботыПо < ПовторяющаясяСтрока.ПериодРаботыС)) Тогда
				// Периоды не пересекаются
				Продолжить;
			КонецЕсли;
			
			СообщениеТекст = СтрокаНачалаСообщенияОбОшибке + НСтр("ru = 'указанный период работы пересекается с периодом из строки %2.'");
			СообщениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеТекст, ПериодРаботы.НомерСтроки, ПовторяющаясяСтрока.НомерСтроки);
			ОбщегоНазначения.СообщитьПользователю(СообщениеТекст, , , , Отказ);
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

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

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

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

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


// Функция возвращает признак завершенности работы с объектом.
Функция ОбъектЗафиксирован() Экспорт
	Возврат Проведен;
КонецФункции

// Процедура заполнения данных справки по данным учета.
Процедура ЗаполнитьДанныеСправки() Экспорт
	Если ГодС = 0 Или ГодПо = 0 Или ГодС > ГодПо Или Сотрудник.Пустая() Или Организация.Пустая() Тогда
		Возврат
	КонецЕсли;
	
	ЗаполнитьДанныеОЗаработкеИДняхОтсутствия();
	
	ЗаполнитьДанныеОПериодахРаботы();
КонецПроцедуры

// Процедура обновляет данные табличной части с учетом фиксации.
// Если передан год - заполняется только строка с этим годом.
Функция ОбновитьДанныеОЗаработкеИДняхОтсутствия(ПараметрыФиксации, Год) Экспорт
	Если ЗначениеЗаполнено(Год) Тогда
		ГодНачала = Год;
		ГодОкончания = Год;
		РасчетныеГоды = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Год);
	Иначе
		ГодНачала = 0;
		ГодОкончания = 0;
		РасчетныеГоды = Новый Массив;
		Для каждого СтрокаГода Из ДанныеОЗаработке Цикл
			Если СтрокаГода.РасчетныйГод <> 0 Тогда
				ГодНачала =  ?(ГодНачала = 0, СтрокаГода.РасчетныйГод, Мин(СтрокаГода.РасчетныйГод, ГодНачала));
				ГодОкончания =  Макс(ГодОкончания, СтрокаГода.РасчетныйГод);
				РасчетныеГоды.Добавить(СтрокаГода.РасчетныйГод);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Если ГодНачала = 0 ИЛИ ГодОкончания = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если Сотрудник.Пустая() Или Организация.Пустая() Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Возврат ЗаполнитьСправкуДаннымиОЗаработкеИДняхОтсутствия(ГодНачала, ГодОкончания, Истина, РасчетныеГоды);
КонецФункции

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

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

Функция ЭтоВнутреннийСовместитель(ПроверяемыйСотрудник)
	ЭтоВнутреннийСовместитель = Ложь;
	
	КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(Истина, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПроверяемыйСотрудник), "ВидЗанятости");
	Если КадровыеДанные.Количество() <> 0 Тогда
		КадровыеДанныеСотрудника = КадровыеДанные[0];
		ЭтоВнутреннийСовместитель = КадровыеДанныеСотрудника.ВидЗанятости = Перечисления.ВидыЗанятости.ВнутреннееСовместительство
		Или КадровыеДанныеСотрудника.ВидЗанятости = Перечисления.ВидыЗанятости.ПустаяСсылка();
	КонецЕсли;
	
	Возврат ЭтоВнутреннийСовместитель;
КонецФункции

Функция ТекстОшибкиПроверкиВидаЗанятости()
	Возврат НСтр("ru = 'Справки выдаются сотрудникам, имевшим основное место работы или работавшим по внешнему совместительству.'");
КонецФункции

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

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

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

Функция ОбновитьДанныеСотрудника(ПараметрыФиксации)
	КадровыеДанные = Новый Массив;
	КадровыеДанные.Добавить("ФизическоеЛицо");
	КадровыеДанные.Добавить("Фамилия");
	КадровыеДанные.Добавить("Имя");
	КадровыеДанные.Добавить("Отчество");
	КадровыеДанные.Добавить("СтраховойНомерПФР");
	КадровыеДанные.Добавить("ДокументВид");
	КадровыеДанные.Добавить("ДокументСерия");
	КадровыеДанные.Добавить("ДокументНомер");
	КадровыеДанные.Добавить("ДокументКемВыдан");
	КадровыеДанные.Добавить("ДокументДатаВыдачи");
	КадровыеДанные.Добавить("АдресМестаПроживания");
	КадровыеДанные.Добавить("АдресПоПрописке");
	
	ТаблицаКадровыхДанных = 
		КадровыйУчет.КадровыеДанныеСотрудников(
			Истина, 
			ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Сотрудник), 
			КадровыеДанные, 
			Дата);
	Если ТаблицаКадровыхДанных.Количество() = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
	КадровыеДанныеСотрудника = ТаблицаКадровыхДанных[0];
	
	// Некоторые реквизиты не выводятся на форму (являются кэшем), их значения обновляются всегда.
	ФизическоеЛицо = КадровыеДанныеСотрудника["ФизическоеЛицо"];
	
	РеквизитыДокумента = Новый Структура(
		"Фамилия,
		|Имя,
		|Отчество,
		|СтраховойНомерПФР,
		|АдресМестаЖительства,
		|ВидДокумента,
		|СерияДокумента,
		|НомерДокумента,
		|КемВыданДокумент,
		|ДатаВыдачиДокумента");
	
	ЗаполнитьЗначенияСвойств(РеквизитыДокумента, КадровыеДанныеСотрудника, "Фамилия,Имя,Отчество,СтраховойНомерПФР");
	
	РеквизитыДокумента.ВидДокумента         = КадровыеДанныеСотрудника["ДокументВид"];
	РеквизитыДокумента.СерияДокумента       = КадровыеДанныеСотрудника["ДокументСерия"];
	РеквизитыДокумента.НомерДокумента       = КадровыеДанныеСотрудника["ДокументНомер"];
	РеквизитыДокумента.КемВыданДокумент     = КадровыеДанныеСотрудника["ДокументКемВыдан"];
	РеквизитыДокумента.ДатаВыдачиДокумента  = КадровыеДанныеСотрудника["ДокументДатаВыдачи"];
	
	РеквизитыДокумента.АдресМестаЖительства = КадровыеДанныеСотрудника["АдресМестаПроживания"];
	Если Не ЗначениеЗаполнено(РеквизитыДокумента.АдресМестаЖительства) Тогда
		РеквизитыДокумента.АдресМестаЖительства = КадровыеДанныеСотрудника["АдресПоПрописке"];
	КонецЕсли;
	
	Возврат ФиксацияВторичныхДанныхВДокументах.ОбновитьДанныеШапки(РеквизитыДокумента, ЭтотОбъект, ПараметрыФиксации);
КонецФункции

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

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

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