Загрузка данных


Функция СформироватьПечатнуюФормуАктОбОказанииУслуг(МассивОбъектов, ОбъектыПечати, ПараметрыПечати = Неопределено)
	
	УстановитьПривилегированныйРежим(Истина);
	
	ПоказыватьНДС = Константы.ВыводитьДопКолонкиНДС.Получить();
	
	ИспользоватьРучныеСкидки         = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВПродажах");
	ИспользоватьАвтоматическиеСкидки = ПолучитьФункциональнуюОпцию("ИспользоватьАвтоматическиеСкидкиВПродажах");
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АктВыполненныхРабот_Акт";
	
	СтруктураРезультатов = ПолучитьДанныеДляПечати(МассивОбъектов, ПараметрыПечати);
		
	ДанныеПечати			= СтруктураРезультатов.РезультатПоШапке.Выбрать();
	ВыборкаПоДокументам 	= СтруктураРезультатов.РезультатПоТабличнойЧасти.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	ПервыйДокумент = Истина;
	
	Пока ДанныеПечати.Следующий() Цикл
		
		// Найдем в выборке услуги по текущему документу
		СтруктураПоиска = Новый Структура("Ссылка", ДанныеПечати.Ссылка);
		НайденСледующий = ВыборкаПоДокументам.НайтиСледующий(СтруктураПоиска);
		
		// Если в документе пустая табличная часть услуги - перейдем к следующему документу
		Если НайденСледующий Тогда
			ВыборкаПоУслугам = ВыборкаПоДокументам.Выбрать();
			ЗаголовокСкидки = ФормированиеПечатныхФорм.НужноВыводитьСкидки(ВыборкаПоУслугам, ИспользоватьРучныеСкидки Или ИспользоватьАвтоматическиеСкидки);
			ЕстьСкидки = ЗаголовокСкидки.ЕстьСкидки;
			ЕстьНДС = ДанныеПечати.УчитыватьНДС;
			ВыборкаПоУслугам.Сбросить();
		Иначе
			
			Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В документе %1 отсутствуют услуги. Печать акта выполненных работ (услуг) не требуется.';
					|en = 'Services are missing in document %1. Printing of ""Customer invoice — Services"" is not required.'"),
				ДанныеПечати.Ссылка);
				
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
				Текст,
				ДанныеПечати.Ссылка);
			
			Продолжить;
		КонецЕсли;
		
		Если Не ПервыйДокумент Тогда
			ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		
		ПервыйДокумент    = Ложь;
		НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
		
		Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.АктВыполненныхРабот.ПФ_MXL_Акт");
		
		// Выводим шапку акта
		
		ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
		
		СтруктураДанныхШапки = Новый Структура;
		СтруктураДанныхШапки.Вставить("ТекстЗаголовка", ОбщегоНазначенияУТКлиентСервер.СформироватьЗаголовокДокумента(ДанныеПечати, НСтр("ru = 'Акт';
																																		|en = 'Customer invoice — Services'", ОбщегоНазначения.КодОсновногоЯзыка())));
		ОбластьМакета.Параметры.Заполнить(СтруктураДанныхШапки);
		
		ШтрихкодированиеПечатныхФорм.ВывестиШтрихкодВТабличныйДокумент(ТабличныйДокумент, Макет, ОбластьМакета, ДанныеПечати.Ссылка);
		ТабличныйДокумент.Вывести(ОбластьМакета);
		
		Если НЕ ДанныеПечати.ДополнительнаяИнформацияШапки="" Тогда
			ОбластьМакета = Макет.ПолучитьОбласть("ДополнительнаяИнформацияШапки");
			ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
			ТабличныйДокумент.Вывести(ОбластьМакета);
		КонецЕсли;
		
		ОбластьМакета = Макет.ПолучитьОбласть("ТекстШапки");
		ТабличныйДокумент.Вывести(ОбластьМакета);
		
		// Выводим заголовок таблицы Услуги
		
		Если ЕстьСкидки Тогда
			Если ЕстьНДС И ПоказыватьНДС Тогда
				ИмяОбластиШапка               = "ШапкаТаблицыСоСкидкойСНДС";
				ИмяОбластиСтрока              = "СтрокаСоСкидкойСНДС";
				ИмяОбластиСтрокаНабор         = "СтрокаСоСкидкойСНДСНабор";
				ИмяОбластиСтрокаКомплектующие = "СтрокаСоСкидкойСНДСКомплектующие";
			Иначе
				ИмяОбластиШапка               = "ШапкаТаблицыСоСкидкой";
				ИмяОбластиСтрока              = "СтрокаСоСкидкой";
				ИмяОбластиСтрокаНабор         = "СтрокаСоСкидкойНабор";
				ИмяОбластиСтрокаКомплектующие = "СтрокаСоСкидкойКомплектующие";	
			КонецЕсли;
		Иначе
			Если ЕстьНДС И ПоказыватьНДС Тогда
				ИмяОбластиШапка               = "ШапкаТаблицыСНДС";
				ИмяОбластиСтрока              = "СтрокаСНДС";
				ИмяОбластиСтрокаНабор         = "СтрокаСНДСНабор";
				ИмяОбластиСтрокаКомплектующие = "СтрокаСНДСКомплектующие";
			Иначе
				ИмяОбластиШапка               = "ШапкаТаблицы";
				ИмяОбластиСтрока              = "Строка";
				ИмяОбластиСтрокаНабор         = "СтрокаНабор";
				ИмяОбластиСтрокаКомплектующие = "СтрокаКомплектующие";	
			КонецЕсли;
		КонецЕсли;
		
		ОбластьМакета = Макет.ПолучитьОбласть(ИмяОбластиШапка);
		ОбластьСтрокиСтандарт = Макет.ПолучитьОбласть(ИмяОбластиСтрока);
		
		ИспользоватьНаборы = Ложь;
		Если ОбщегоНазначенияУТКлиентСервер.ЕстьРеквизитОбъекта(ВыборкаПоДокументам, "ЭтоНабор") Тогда
			ИспользоватьНаборы = Истина;
			ОбластьСтрокиНабор         = Макет.ПолучитьОбласть(ИмяОбластиСтрокаНабор);
			ОбластьСтрокиКомплектующие = Макет.ПолучитьОбласть(ИмяОбластиСтрокаКомплектующие);
		КонецЕсли;
		
		ПустыеДанные = НаборыСервер.ПустыеДанные();
		
		Если ЕстьСкидки Тогда
			СтруктураЗаголовокСкидки = Новый Структура("Скидка, СуммаБезСкидки", 
				ЗаголовокСкидки.Скидка,
				ЗаголовокСкидки.СуммаСкидки);
			ОбластьМакета.Параметры.Заполнить(СтруктураЗаголовокСкидки);
		КонецЕсли; 
		ТабличныйДокумент.Вывести(ОбластьМакета);
		
		Сумма       = 0;
		СуммаНДС    = 0;
		НомерСтроки = 0;
		
		// Выводим строки таблицы Услуги
		
		Пока ВыборкаПоУслугам.Следующий() Цикл
			
			Если НаборыСервер.ИспользоватьОбластьНабор(ВыборкаПоУслугам, ИспользоватьНаборы) Тогда
				ОбластьСтроки = ОбластьСтрокиНабор;
			ИначеЕсли НаборыСервер.ИспользоватьОбластьКомплектующие(ВыборкаПоУслугам, ИспользоватьНаборы) Тогда
				ОбластьСтроки = ОбластьСтрокиКомплектующие;
			Иначе
				ОбластьСтроки = ОбластьСтрокиСтандарт;
			КонецЕсли;
			
			НомерСтрокиПечать = "";
			Если НаборыСервер.ВыводитьТолькоЗаголовок(ВыборкаПоУслугам, ИспользоватьНаборы) Тогда
			Иначе
				НомерСтроки = НомерСтроки + 1;
				НомерСтрокиПечать = НомерСтроки;
			КонецЕсли;
			
			Если НаборыСервер.ВыводитьТолькоЗаголовок(ВыборкаПоУслугам, ИспользоватьНаборы) Тогда
				ОбластьСтроки.Параметры.Заполнить(ПустыеДанные);
			Иначе
				ОбластьСтроки.Параметры.Заполнить(ВыборкаПоУслугам);
			КонецЕсли;
			
			ПрефиксИПостфикс = НаборыСервер.ПолучитьПрефиксИПостфикс(ВыборкаПоУслугам, ИспользоватьНаборы);
			
			СтруктураДанныхСтроки = Новый Структура;
			СтруктураДанныхСтроки.Вставить("НомерСтроки", НомерСтрокиПечать);
			СтруктураДанныхСтроки.Вставить("Товар", ПрефиксИПостфикс.Префикс + ВыборкаПоУслугам.УслугаНаименованиеПолное + ПрефиксИПостфикс.Постфикс );
			
			Если ЕстьСкидки Тогда
				
				СтруктураДанныхСтроки.Вставить("Скидка", ?(ЗаголовокСкидки.ТолькоНаценка,- ВыборкаПоУслугам.СуммаСкидки,ВыборкаПоУслугам.СуммаСкидки));
				СтруктураДанныхСтроки.Вставить("СуммаБезСкидки", ФормированиеПечатныхФорм.ФорматСумм(ВыборкаПоУслугам.Сумма + ВыборкаПоУслугам.СуммаСкидки));
				
			КонецЕсли;
			
			Если Не НаборыСервер.ИспользоватьОбластьКомплектующие(ВыборкаПоУслугам, ИспользоватьНаборы) Тогда
				Сумма          = Сумма          + ВыборкаПоУслугам.Сумма;
				СуммаНДС       = СуммаНДС       + ВыборкаПоУслугам.СуммаНДС;
			КонецЕсли;
			
			ОбластьСтроки.Параметры.Заполнить(СтруктураДанныхСтроки);
			Если НаборыСервер.ВыводитьТолькоЗаголовок(ВыборкаПоУслугам, ИспользоватьНаборы) Тогда
				ОбластьСтроки.Параметры.Заполнить(ПустыеДанные);
			КонецЕсли;
			
			ТабличныйДокумент.Вывести(ОбластьСтроки);
			
		КонецЦикла;
		
		ОбластьМакета = Макет.ПолучитьОбласть("Итого");
		СтруктураДанныхИтого = Новый Структура("Всего",ФормированиеПечатныхФорм.ФорматСумм(Сумма));
		ОбластьМакета.Параметры.Заполнить(СтруктураДанныхИтого);
		ТабличныйДокумент.Вывести(ОбластьМакета);
		
		Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетНДС") Тогда
			ОбластьМакета = Макет.ПолучитьОбласть("ИтогоНДС");
			СтруктураДанныхИтогоНДС = Новый Структура;
			СтруктураДанныхИтогоНДС.Вставить("ВсегоНДС", СуммаНДС);
			Если ЕстьНДС Тогда
				СтруктураДанныхИтогоНДС.Вставить("НДС", ?(ДанныеПечати.ЦенаВключаетНДС, 
					НСтр("ru = 'В том числе НДС:';
						|en = 'including VAT:'", ОбщегоНазначения.КодОсновногоЯзыка()), 
					НСтр("ru = 'Сумма НДС:';
						|en = 'VAT amount:'", ОбщегоНазначения.КодОсновногоЯзыка())));
			Иначе
				СтруктураДанныхИтогоНДС.Вставить("НДС", НСтр("ru = 'Без налога (НДС)';
															|en = 'Without tax (VAT)'", ОбщегоНазначения.КодОсновногоЯзыка()));
			КонецЕсли;
			ОбластьМакета.Параметры.Заполнить(СтруктураДанныхИтогоНДС);
			ТабличныйДокумент.Вывести(ОбластьМакета);
		КонецЕсли;
		СуммаКПрописи = Сумма + ?(ДанныеПечати.ЦенаВключаетНДС, 0, СуммаНДС);
		ОбластьМакета = Макет.ПолучитьОбласть("СуммаПрописью");
		СтруктураДанныхСуммаПрописью = Новый Структура;
		
		ИтоговаяСтрока = НСтр("ru = 'Всего выполнено работ (оказано услуг) %КоличествоНаименований%, на сумму %СуммаДокумента%';
								|en = 'Total work performed (services rendered) %КоличествоНаименований%, in the amount of %СуммаДокумента%'", ОбщегоНазначения.КодОсновногоЯзыка());
		ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%КоличествоНаименований%", НомерСтроки);
		ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%СуммаДокумента%", ФормированиеПечатныхФорм.ФорматСумм(СуммаКПрописи, ДанныеПечати.Валюта));
		
		СтруктураДанныхСуммаПрописью.Вставить("ИтоговаяСтрока", ИтоговаяСтрока);
		СтруктураДанныхСуммаПрописью.Вставить("СуммаПрописью", РаботаСКурсамиВалютУТ.СформироватьСуммуПрописью(СуммаКПрописи, ДанныеПечати.Валюта));
		ОбластьМакета.Параметры.Заполнить(СтруктураДанныхСуммаПрописью);
		ТабличныйДокумент.Вывести(ОбластьМакета);
		
		Если НЕ ДанныеПечати.ДополнительнаяИнформация="" Тогда
			ОбластьМакета = Макет.ПолучитьОбласть("ДополнительнаяИнформация");
			ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
			ТабличныйДокумент.Вывести(ОбластьМакета);
		КонецЕсли;
		
		СведенияОИсполнителе = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(
			ДанныеПечати.Организация,
			ДанныеПечати.Дата,
			,
			ДанныеПечати.СчетОрганизации,
			Истина);
			
		СведенияОЗаказчике 	 = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(
			ДанныеПечати.Контрагент,
			ДанныеПечати.Дата,
			,
			ДанныеПечати.СчетКонтрагента);
		
		ОбластьМакета = Макет.ПолучитьОбласть("Подписи");
		СтруктураДанныхПодписи = Новый Структура;
		СтруктураДанныхПодписи.Вставить("ПредставлениеИсполнителя", СведенияОИсполнителе.ОфициальноеНаименование);
		СтруктураДанныхПодписи.Вставить("ПредставлениеЗаказчика", СведенияОЗаказчике.ОфициальноеНаименование);
		СтруктураДанныхПодписи.Вставить("ЮрАдресИсполнителя", СведенияОИсполнителе.ЮридическийАдрес);
		СтруктураДанныхПодписи.Вставить("ЮрАдресЗаказчика", СведенияОЗаказчике.ЮридическийАдрес);
		СтруктураДанныхПодписи.Вставить("РасчетныйСчетИсполнителя", СведенияОИсполнителе.НомерСчета);
		СтруктураДанныхПодписи.Вставить("РасчетныйСчетЗаказчика", СведенияОЗаказчике.НомерСчета);
		СтруктураДанныхПодписи.Вставить("КорСчетИсполнителя", СведенияОИсполнителе.КоррСчет);
		СтруктураДанныхПодписи.Вставить("КорСчетЗаказчика", СведенияОЗаказчике.КоррСчет);
		СтруктураДанныхПодписи.Вставить("БанкИсполнителя", СведенияОИсполнителе.Банк);
		СтруктураДанныхПодписи.Вставить("БанкЗаказчика", СведенияОЗаказчике.Банк);
		СтруктураДанныхПодписи.Вставить("БИКИсполнителя", СведенияОИсполнителе.БИК);
		СтруктураДанныхПодписи.Вставить("БИКЗаказчика", СведенияОЗаказчике.БИК);
		ИННКППЗаказчика = "";
		Если СведенияОЗаказчике.Свойство("КПП") И ЗначениеЗаполнено(СведенияОЗаказчике.КПП) Тогда
			ИННКППЗаказчика = НСтр("ru = 'ИНН/КПП:';
									|en = 'TIN/KPP:'", ОбщегоНазначения.КодОсновногоЯзыка()) + " " + СведенияОЗаказчике.ИНН + "/" + СведенияОЗаказчике.КПП;
		Иначе
			ИННКППЗаказчика = НСтр("ru = 'ИНН:';
									|en = 'TIN:'", ОбщегоНазначения.КодОсновногоЯзыка()) + " " + СведенияОЗаказчике.ИНН;
		КонецЕсли;
		СтруктураДанныхПодписи.Вставить("ИННКППЗаказчика", ИННКППЗаказчика);
		ИННКППИсполнителя = "";
		Если СведенияОИсполнителе.Свойство("КПП") И ЗначениеЗаполнено(СведенияОИсполнителе.КПП) Тогда
			ИННКППИсполнителя = НСтр("ru = 'ИНН/КПП:';
									|en = 'TIN/KPP:'", ОбщегоНазначения.КодОсновногоЯзыка()) + " " + СведенияОИсполнителе.ИНН + "/" + СведенияОИсполнителе.КПП;
		Иначе
			ИННКППИсполнителя = НСтр("ru = 'ИНН:';
									|en = 'TIN:'", ОбщегоНазначения.КодОсновногоЯзыка()) + " " + СведенияОИсполнителе.ИНН;
		КонецЕсли;
		СтруктураДанныхПодписи.Вставить("ИННКППИсполнителя", ИННКППИсполнителя);
		ОбластьМакета.Параметры.Заполнить(СтруктураДанныхПодписи);
		ТабличныйДокумент.Вывести(ОбластьМакета);
		
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеПечати.Ссылка);
		
	КонецЦикла;
	
	ТабличныйДокумент.АвтоМасштаб = Истина;
	
	Если ПривилегированныйРежим() Тогда
		УстановитьПривилегированныйРежим(Ложь);
	КонецЕсли;
	
	Возврат ТабличныйДокумент;
	
КонецФункции