Договор займа сотруднику / Модуль менеджера

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

КонецПроцедуры

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

#Область ОбработчикиПравилРегистрации

// См. ЗарплатаКадрыРасширенныйСинхронизацияДанных.ШаблонОбработчика
Процедура ПриЗаполненииНастроекОбработчиковПравилРегистрации(Настройки) Экспорт
	ЗарплатаКадрыРасширенныйСинхронизацияДанных.ДляОтбораПоОрганизации(Настройки);
	ЗарплатаКадрыРасширенныйСинхронизацияДанных.ДляОбъектаСПрисоединеннымиФайлами(Настройки);
КонецПроцедуры

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

// Возвращает описание состава документа
//
// Возвращаемое значение:
//  Структура - см. ЗарплатаКадрыСоставДокументов.НовоеОписаниеСоставаОбъекта.
Функция ОписаниеСоставаОбъекта() Экспорт
	Возврат ЗарплатаКадрыСоставДокументов.ОписаниеСоставаОбъектаФизическоеЛицоВШапке("ФизическоеЛицо", "");
КонецФункции

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

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

#Область ПроцедурыПечатиДокумента

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	// Договор займа
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
	КомандаПечати.Идентификатор = "ПФ_MXL_ДоговорЗайма";
	КомандаПечати.Представление = НСтр("ru = 'Договор займа'");
	КомандаПечати.Порядок = 10;
	
	// График погашения займа
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
	КомандаПечати.Идентификатор = "ПФ_MXL_ГрафикПогашенияЗайма";
	КомандаПечати.Представление = НСтр("ru = 'График погашения займа'");
	КомандаПечати.Порядок = 20;
	
	// Отчет о погашении займа
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
	КомандаПечати.Идентификатор = "ОтчетОПогашенииЗайма";
	КомандаПечати.Представление = НСтр("ru = 'Отчет о погашении займа'");
	КомандаПечати.Порядок = 30;
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	
	// Карточка учета договора займа
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
	КомандаПечати.Идентификатор = "КарточкаУчетаДоговораЗайма";
	КомандаПечати.Представление = НСтр("ru = 'Карточка учета договора займа'");
	КомандаПечати.Порядок = 40;
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	
КонецПроцедуры

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

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

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

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

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

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

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

Процедура ЗаполнитьНомерПодпункта(Область, НомерПодпункта)
	
	Область.Параметры.НомерПодпункта = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("2.%1.", НомерПодпункта);
	НомерПодпункта = НомерПодпункта + 1;
	
КонецПроцедуры

Функция ОбластьСПараметрами(Макет, ИмяОбласти, ДанныеПечати)
	
	Область = Макет.ПолучитьОбласть(ИмяОбласти);
	Область.Параметры.Заполнить(ДанныеПечати);
	
	Возврат Область;
	
КонецФункции

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

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

		МесяцПоследнейВыдачи = Неопределено;
		
		Если ТипЗнч(ДанныеПечати.ВыдачиЗайма) = Тип("ТаблицаЗначений") И ДанныеПечати.ВыдачиЗайма.Количество() > 0 Тогда
			ДокументРезультат.Вывести(Макет.ПолучитьОбласть("ШапкаТаблицыВыдачиЗайма"));
			
			НомерВыдачи = 1;
			СуммаВыдачиИтого = 0;
			Для Каждого СтрокаТаблицы Из ДанныеПечати.ВыдачиЗайма Цикл
				
				ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицыВыдачиЗайма");
				ОбластьСтрока.Параметры.Заполнить(СтрокаТаблицы);
				ОбластьСтрока.Параметры.Номер = НомерВыдачи;
				ДокументРезультат.Вывести(ОбластьСтрока);
				
				СуммаВыдачиИтого = СуммаВыдачиИтого + СтрокаТаблицы.Сумма;
				НомерВыдачи = НомерВыдачи + 1;
				МесяцПоследнейВыдачи = СтрокаТаблицы.Дата;
				
			КонецЦикла;
			
			ОбластьСтрокаИтого = Макет.ПолучитьОбласть("СтрокаИтогоТаблицыВыдачиЗайма");
			ОбластьСтрокаИтого.Параметры.Сумма = СуммаВыдачиИтого;
			ДокументРезультат.Вывести(ОбластьСтрокаИтого); 
			
		КонецЕсли;
		
		Если ТипЗнч(ДанныеПечати.ТраншиЗайма) = Тип("ТаблицаЗначений") И ДанныеПечати.ТраншиЗайма.Количество() > 0 Тогда
			
			Если ЗначениеЗаполнено(МесяцПоследнейВыдачи) Тогда
							
				Транши = ДанныеПечати.ТраншиЗайма.СкопироватьКолонки();
				
				Для Каждого СтрокаТранши Из ДанныеПечати.ТраншиЗайма Цикл
					
					Если СтрокаТранши.ДатаПредоставления > КонецМесяца(МесяцПоследнейВыдачи) Тогда
						
						НоваяСтрока = Транши.Добавить();
						ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТранши);
						
					КонецЕсли;
					
				КонецЦикла;
				
			Иначе
				
				Транши = ДанныеПечати.ТраншиЗайма.Скопировать();
				
			КонецЕсли;
			
			Если Транши.Количество() > 0 Тогда
				
				ДокументРезультат.Вывести(Макет.ПолучитьОбласть("ШапкаТаблицыГрафикВыдачиЗайма"));
						
				НомерВыдачи = 1;
				СуммаВыдачиИтого = 0;
				
				Для Каждого СтрокаТранши Из Транши Цикл
					
					ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицыГрафикВыдачиЗайма");
					
					ОбластьСтрока.Параметры.Номер 	= НомерВыдачи;
					ОбластьСтрока.Параметры.Дата 	= СтрокаТранши.ДатаПредоставления;
					ОбластьСтрока.Параметры.Сумма 	= СтрокаТранши.Сумма;
					
					ДокументРезультат.Вывести(ОбластьСтрока);
					
					СуммаВыдачиИтого = СуммаВыдачиИтого + СтрокаТранши.Сумма;
					НомерВыдачи = НомерВыдачи + 1;			
				
				КонецЦикла;
			
				ОбластьСтрокаИтого = Макет.ПолучитьОбласть("СтрокаИтогоТаблицыГрафикВыдачиЗайма");
				ОбластьСтрокаИтого.Параметры.Сумма = СуммаВыдачиИтого;
				ДокументРезультат.Вывести(ОбластьСтрокаИтого); 
				
			КонецЕсли;
			
		КонецЕсли;

		ПогашениеПроцентов = 0;
		ПогашениеДолга = 0;
		СуммаПлатежей = 0;
		НомерМесяца = 1;
		СальдоВзаиморасчетов = Неопределено;	
		
		ИсторияПогашения = ИсторияПогашенияЗайма(ДанныеПечати.ДоговорЗайма);
		Если ИсторияПогашения.Количество() > 0 Тогда
			
			ДокументРезультат.Вывести(Макет.ПолучитьОбласть("ШапкаТаблицыПогашениеЗайма"));
			
			Для Каждого СтрокаГрафика Из ИсторияПогашения Цикл
				
				ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицыПогашениеЗайма");
				ОбластьСтрока.Параметры.Заполнить(СтрокаГрафика);
				ОбластьСтрока.Параметры.НомерМесяца = НомерМесяца;
				ДокументРезультат.Вывести(ОбластьСтрока);
				
				СальдоВзаиморасчетов = СтрокаГрафика.СальдоВзаиморасчетов;
				СуммаПлатежей = СуммаПлатежей + СтрокаГрафика.ЕжемесячныйПлатеж;
				ПогашениеПроцентов = ПогашениеПроцентов + СтрокаГрафика.ПогашениеПроцентов;
				ПогашениеДолга = ПогашениеДолга + СтрокаГрафика.ПогашениеДолга;

				НомерМесяца = НомерМесяца + 1;
				
			КонецЦикла;
			
			ОбластьСтрокаИтого = Макет.ПолучитьОбласть("СтрокаИтогоТаблицыПогашениеЗайма");
			ОбластьСтрокаИтого.Параметры.СуммаПлатежей = СуммаПлатежей;
			ОбластьСтрокаИтого.Параметры.ПогашениеПроцентов = ПогашениеПроцентов;
			ОбластьСтрокаИтого.Параметры.ПогашениеДолга = ПогашениеДолга;
			ДокументРезультат.Вывести(ОбластьСтрокаИтого); 
			
		КонецЕсли;
		
		Если СальдоВзаиморасчетов = Неопределено Или СальдоВзаиморасчетов > 0 Тогда
			
			ДатаПоследнегоНеДосрочногоПлатежа = ДатаПоследнегоНеДосрочногоПлатежа(ДанныеПечати.ДоговорЗайма);
			
			Если Не ЗначениеЗаполнено(ДатаПоследнегоНеДосрочногоПлатежа) Тогда
				МесяцНачала = НачалоМесяца(ДанныеПечати.ДатаПредоставления);
			Иначе
				МесяцНачала = КонецМесяца(ДатаПоследнегоНеДосрочногоПлатежа) + 1;
			КонецЕсли;
			
			ИзмененияУсловий = ЗаймыСотрудникам.ИзмененияУсловийЗаймаЗаМесяц(ДанныеПечати.ДоговорЗайма, ДокументСсылка, ДанныеПечати.ДатаИзменений);
				
			ПараметрыГрафика = ЗаймыСотрудникамКлиентСервер.ПараметрыПостроенияГрафикаПогашенияЗайма();
			ПараметрыГрафика.ДатаПредоставления = ДанныеПечати.ДатаПредоставления;
			ПараметрыГрафика.ДатаИзменений = ДанныеПечати.ДатаИзменений;
			ПараметрыГрафика.МесяцНачала = МесяцНачала; 
			ПараметрыГрафика.МесяцОкончания = НачалоМесяца(ДанныеПечати.ДатаОкончания);
			ПараметрыГрафика.ГодоваяСтавка = ДанныеПечати.ПроцентнаяСтавка; 
			ПараметрыГрафика.СуммаЗайма = ?(СальдоВзаиморасчетов <> Неопределено, СальдоВзаиморасчетов, ДанныеПечати.СуммаЗайма);
			ПараметрыГрафика.СпособПредоставления = ДанныеПечати.СпособПредоставления;
			ПараметрыГрафика.ТраншиЗайма = ДанныеПечати.ТраншиЗайма;
			ПараметрыГрафика.СпособПогашения = ДанныеПечати.СпособПогашения;
			ПараметрыГрафика.ВидПлатежей = ДанныеПечати.ВидПлатежей;
			ПараметрыГрафика.РазмерПлатежа = ДанныеПечати.РазмерПлатежа;
			ПараметрыГрафика.РазмерПогашения = ДанныеПечати.РазмерПогашения;
			ПараметрыГрафика.МесяцНачалаПогашения = ДанныеПечати.НачалоПогашения;
			ПараметрыГрафика.ОграничениеПлатежа = ДанныеПечати.ОграничениеПлатежа;
			ПараметрыГрафика.ИзмененияУсловий = ИзмененияУсловий;
	
			ГрафикПогашения = ЗаймыСотрудникамКлиентСервер.ГрафикПогашенияЗайма(ПараметрыГрафика);
							
			НомерМесяца = 1;
			ПогашениеПроцентов = 0;
			ПогашениеДолга = 0;
			СуммаПлатежей = 0;
			Если ГрафикПогашения.Количество() > 0 Тогда
				
				ДокументРезультат.Вывести(Макет.ПолучитьОбласть("ШапкаТаблицыГрафикПогашенияЗайма"));

				Для Каждого СтрокаГрафика Из ГрафикПогашения Цикл
					
					ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицыГрафикПогашенияЗайма");
					ОбластьСтрока.Параметры.Заполнить(СтрокаГрафика);
					ОбластьСтрока.Параметры.НомерМесяца = НомерМесяца;
					ДокументРезультат.Вывести(ОбластьСтрока);

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

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

Функция ПоследнееИсправление(ДоговорЗайма, Ссылка)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ИзменениеУсловийДоговораЗаймаСотруднику.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ИзменениеУсловийДоговораЗаймаСотруднику КАК ИзменениеУсловийДоговораЗаймаСотруднику
	|ГДЕ
	|	ИзменениеУсловийДоговораЗаймаСотруднику.ДоговорЗайма = &ДоговорЗайма
	|	И ИзменениеУсловийДоговораЗаймаСотруднику.Ссылка <> &Ссылка
	|
	|УПОРЯДОЧИТЬ ПО
	|	Ссылка УБЫВ";
	
	Запрос.УстановитьПараметр("ДоговорЗайма", ДоговорЗайма);
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	Иначе
		Возврат Документы.ИзменениеУсловийДоговораЗаймаСотруднику.ПустаяСсылка();
	КонецЕсли;
	
КонецФункции

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

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

#КонецЕсли

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