Транспортная накладная / Модуль менеджера

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

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

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

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

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

	РезультатЗапроса = Запрос.Выполнить();
	
	// Начинать транзакцию не нужно - метод вызывается только из события ПриЗаписи
	
	БлокировкаДанных = Новый БлокировкаДанных;
	ЭлементБлокировки = БлокировкаДанных.Добавить("Документ.ТранспортнаяНакладная");
	ЭлементБлокировки.ИсточникДанных = РезультатЗапроса;
	ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ссылка", "Ссылка");
	ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
	
	БлокировкаДанных.Заблокировать();

	Выборка = РезультатЗапроса.Выбрать();
	
	ТекущаяТранспортнаяНакладная  = Неопределено;
	ТранспортнаяНакладнаяИзменена = Ложь;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		Возврат КомандаСоздатьНаОсновании;
	КонецЕсли;

	Возврат Неопределено;
КонецФункции

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

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

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

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

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

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

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

#Область Печать

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

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

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

	Возврат ТабличныйДокумент;
	
КонецФункции

Функция ОписаниеВодительскогоУдостоверения(Серия, Номер)
	
	ПредставлениеУдостоверения = "";
	Если Не ПустаяСтрока(Серия) Тогда
		ПредставлениеУдостоверения = СокрЛП(Серия) + ", ";
	КонецЕсли;
	
	ПредставлениеУдостоверения = ПредставлениеУдостоверения + Номер;
		
	Возврат ПредставлениеУдостоверения;
	
КонецФункции

Функция СтруктураИтоговыеСуммыТТН()
	
	Структура = Новый Структура;
	
	// Инициализация итогов по странице.
	Структура.Вставить("ИтогоМассаБруттоНаСтранице", 0);
	Структура.Вставить("ИтогоМестНаСтранице", 0);
	Структура.Вставить("ИтогоКоличествоНаСтранице", 0);
	Структура.Вставить("ИтогоСуммаНаСтранице", 0);
	Структура.Вставить("ИтогоМассаНеттоНаСтранице", 0);
	
	// Инициализация итогов по документу.
	Структура.Вставить("ИтогоМассаБрутто", 0);
	Структура.Вставить("ИтогоМест", 0);
	Структура.Вставить("ИтогоКоличество", 0);
	Структура.Вставить("ИтогоСумма", 0);
	Структура.Вставить("ИтогоМассаНетто", 0);
	
	Структура.Вставить("КоличествоПорядковыхНомеровЗаписейПрописью", 0);
	Структура.Вставить("СуммаПрописью", "");
	
	Возврат Структура;
	
КонецФункции // СтруктураИтоговыеСуммы()

Функция СтруктураДанныеСтрокиТТН()
	
	Структура = Новый Структура;
	Структура.Вставить("Номер", 0);
	Структура.Вставить("Мест", 0);
	Структура.Вставить("Количество", 0);
	Структура.Вставить("Цена", 0);
	Структура.Вставить("Сумма", 0);
	Структура.Вставить("МассаБрутто", 0);
	Структура.Вставить("МассаНетто", 0);
	
	Возврат Структура;
	
КонецФункции // СтруктураДанныеСтроки()

Процедура РассчитатьИтоговыеСуммыТТН(ИтоговыеСуммы, ДанныеСтроки)
	
	// Увеличим итоги по странице.
	ИтоговыеСуммы.ИтогоМестНаСтранице        = ИтоговыеСуммы.ИтогоМестНаСтранице        + ДанныеСтроки.Мест;
	ИтоговыеСуммы.ИтогоКоличествоНаСтранице  = ИтоговыеСуммы.ИтогоКоличествоНаСтранице  + ДанныеСтроки.Количество;
	ИтоговыеСуммы.ИтогоСуммаНаСтранице       = ИтоговыеСуммы.ИтогоСуммаНаСтранице       + ДанныеСтроки.Сумма;
	ИтоговыеСуммы.ИтогоМассаБруттоНаСтранице = ИтоговыеСуммы.ИтогоМассаБруттоНаСтранице + ДанныеСтроки.МассаБрутто;
	ИтоговыеСуммы.ИтогоМассаНеттоНаСтранице  = ИтоговыеСуммы.ИтогоМассаНеттоНаСтранице  + ДанныеСтроки.МассаНетто;
	
	// Увеличим итоги по документу.
	ИтоговыеСуммы.ИтогоМест        = ИтоговыеСуммы.ИтогоМест        + ДанныеСтроки.Мест;
	ИтоговыеСуммы.ИтогоКоличество  = ИтоговыеСуммы.ИтогоКоличество  + ДанныеСтроки.Количество;
	ИтоговыеСуммы.ИтогоСумма       = ИтоговыеСуммы.ИтогоСумма       + ДанныеСтроки.Сумма;
	ИтоговыеСуммы.ИтогоМассаБрутто = ИтоговыеСуммы.ИтогоМассаБрутто + ДанныеСтроки.МассаБрутто;
	ИтоговыеСуммы.ИтогоМассаНетто  = ИтоговыеСуммы.ИтогоМассаНетто  + ДанныеСтроки.МассаНетто;
	
КонецПроцедуры

Процедура ОбнулитьИтогиПоСтраницеТТН(ИтоговыеСуммы)
	
	ИтоговыеСуммы.ИтогоМассаБруттоНаСтранице = 0;
	ИтоговыеСуммы.ИтогоМассаНеттоНаСтранице  = 0;
	ИтоговыеСуммы.ИтогоМестНаСтранице        = 0;
	ИтоговыеСуммы.ИтогоКоличествоНаСтранице  = 0;
	ИтоговыеСуммы.ИтогоСуммаНаСтранице       = 0;
	
КонецПроцедуры

Процедура ДобавитьИтоговыеДанныеПодвалаТТН(ИтоговыеСуммы, ВсегоНомеров, ВалютаРегламентированногоУчета)
	
	ИтоговыеСуммы.Вставить("КоличествоПорядковыхНомеровЗаписейПрописью", ЧислоПрописью(ВсегоНомеров, ,",,,,,,,,0"));
	ИтоговыеСуммы.Вставить("СуммаПрописью", РаботаСКурсамиВалютУТ.СформироватьСуммуПрописью(ИтоговыеСуммы.ИтогоСумма, ВалютаРегламентированногоУчета));
	
КонецПроцедуры

Процедура ДобавитьИтоговыеДанныеПодвалаТТНДляНесколькихНакладных(ИтоговыеСуммы, ВсегоНомеров, ВалютаРегламентированногоУчета)
	
	ИтоговыеСуммы.Вставить("КоличествоПорядковыхНомеровЗаписейПрописью", ЧислоПрописью(ВсегоНомеров, ,",,,,,,,,0"));
	ИтоговыеСуммы.Вставить("СуммаПрописью", РаботаСКурсамиВалютУТ.СформироватьСуммуПрописью(ИтоговыеСуммы.ИтогоСумма, ВалютаРегламентированногоУчета));
	
КонецПроцедуры

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

Процедура ЗаполнитьНомераНакладныхВСтрокеТовараТТН(ДанныеПечати, ВыборкаНомеровТН, ДанныеСтроки, ОбластьМакета)
	
	СтрокаНомеровНакладных = НСтр("ru = 'Товары по накладным: %НомерНакладной%'");
	СтруктураПоиска = Новый Структура("ТранспортнаяНакладная", ДанныеПечати.Ссылка);
	
	ПредставленияНакладных = Новый Массив;
	
	Пока ВыборкаНомеровТН.НайтиСледующий(СтруктураПоиска) Цикл
		СтруктураШапки = Новый Структура("Дата, Номер");
		ЗаполнитьЗначенияСвойств(СтруктураШапки, ВыборкаНомеровТН);
		ПредставленияНакладных.Добавить(ОбщегоНазначенияУТКлиентСервер.СформироватьЗаголовокДокумента(СтруктураШапки));
	КонецЦикла;
	СтрокаНомеровНакладных = СтрЗаменить(СтрокаНомеровНакладных, "%НомерНакладной%", СтрСоединить(ПредставленияНакладных, ", "));
	
	ОбластьМакета.Параметры.ТоварНаименование = СтрокаНомеровНакладных;
	
	ОбластьМакета.Параметры.ТоварКод = "";
	
	ДанныеСтроки.МассаБрутто = 0;
	ДанныеСтроки.МассаНетто = 0;
	ДанныеСтроки.Сумма = 0;	
	ДанныеСтроки.Цена = 0;	
	ДанныеСтроки.Мест = 0;
	ДанныеСтроки.Количество  = 0;
	
	ОбластьМакета.Параметры.Цена = "";
	ОбластьМакета.Параметры.Сумма = "";
	ОбластьМакета.Параметры.Количество = "";
	ОбластьМакета.Параметры.КоличествоМест = "";
	ОбластьМакета.Параметры.БазоваяЕдиницаНаименование = "";
	ОбластьМакета.Параметры.ВидУпаковки = "";
				
КонецПроцедуры

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

Процедура ЗаполнитьРеквизитыПодвалаТТН(ДанныеПечати, ИтоговыеСуммы, Макет, ТабличныйДокумент, ЕдиницаИзмеренияВеса = Неопределено, КоэффициентПересчетаВТонны = 0)
	
	ОбластьМакета = Макет.ПолучитьОбласть("Подвал");
		
	ОбластьМакета.Параметры.ПолнаяДатаДокумента = Формат(ДанныеПечати.Дата, "ДЛФ=DD");
	
	// Главный бухгалтер
	ОбластьМакета.Параметры.ФИОГлавБухгалтера 	  = ДанныеПечати.ГлавныйБухгалтер;
	
	ОбластьМакета.Параметры.ФИОРуководителя 	  = ДанныеПечати.Руководитель;
	ОбластьМакета.Параметры.ДолжностьРуководителя = ДанныеПечати.ДолжностьРуководителя;
	
	ОбластьМакета.Параметры.ФИОКладовщика 		  = ФизическиеЛицаУТ.ФамилияИнициалыФизЛица(ДанныеПечати.Кладовщик, ДанныеПечати.Дата);
	ОбластьМакета.Параметры.ДолжностьКладовщика   = ДанныеПечати.ДолжностьКладовщика;
	
	// Доверенность
	ОбластьМакета.Параметры.ДоверенностьНомер     = ДанныеПечати.ДоверенностьНомер;
	ОбластьМакета.Параметры.ДоверенностьДата      = Формат(ДанныеПечати.ДоверенностьДата, "ДЛФ=DD");
	ОбластьМакета.Параметры.ДоверенностьВыдана    = ДанныеПечати.ДоверенностьВыдана;
	ОбластьМакета.Параметры.ДоверенностьЧерезКого = ДанныеПечати.ДоверенностьЛицо;
	
	Если ИтоговыеСуммы.ИтогоМест > 0 Тогда
		ОбластьМакета.Параметры.ВсегоМестПрописью = ЧислоПрописью(ИтоговыеСуммы.ИтогоМест, ,",,,,,,,,0");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ЕдиницаИзмеренияВеса) И ДанныеПечати.МассаБрутто > 0 Тогда
		ПараметрыМассыПрописью = ПродажиСервер.ПараметрыМассыПрописью(ДанныеПечати.МассаБрутто/1000, 1);
		ОбластьМакета.Параметры.МассаГрузаБруттоПрописью = ЧислоПрописью(
			ДанныеПечати.МассаБрутто/1000*ПараметрыМассыПрописью.Коэффициент,
			"ДП=Истина",
			ПараметрыМассыПрописью.Формат);
		Если КоэффициентПересчетаВТонны <> 0 Тогда
			ОбластьМакета.Параметры.МассаГрузаБрутто = Окр(ДанныеПечати.МассаБрутто/1000,3,РежимОкругления.Окр15как20);
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ЕдиницаИзмеренияВеса) И ДанныеПечати.МассаНетто > 0 Тогда
		ПараметрыМассыПрописью = ПродажиСервер.ПараметрыМассыПрописью(ДанныеПечати.МассаНетто/1000, 1);
		ОбластьМакета.Параметры.МассаГрузаНеттоПрописью = ЧислоПрописью(
			ДанныеПечати.МассаНетто/1000*ПараметрыМассыПрописью.Коэффициент,
			"ДП=Истина",
			ПараметрыМассыПрописью.Формат);
		Если КоэффициентПересчетаВТонны <> 0 Тогда
			ОбластьМакета.Параметры.МассаГрузаНетто = Окр(ДанныеПечати.МассаНетто/1000,3,РежимОкругления.Окр15как20);
		КонецЕсли;
	КонецЕсли;
	
	ОбластьМакета.Параметры.КоличествоПорядковыхНомеровЗаписейПрописью = ИтоговыеСуммы.КоличествоПорядковыхНомеровЗаписейПрописью;
	ОбластьМакета.Параметры.ВсегоНаименованийПрописью = ЧислоПрописью(ДанныеПечати.КоличествоНаименований, ,",,,,,,,,0");
	ОбластьМакета.Параметры.СуммаПрописью = ИтоговыеСуммы.СуммаПрописью;
	
	ТабличныйДокумент.Вывести(ОбластьМакета);
	
КонецПроцедуры // ЗаполнитьРеквизитыПодвалаТТН()

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

	ОбластьМакета.Области.Стандарт.Шрифт   = ШрифтСтандарт;
	ОбластьМакета.Области.Ограничено.Шрифт = ШрифтОграничено;
	
КонецПроцедуры

// Описание
// 
// Параметры:
// 	ТабличныйДокумент - ТабличныйДокумент
// 	ДанныеДляПечати - Структура:
// 	* РезультатПоШапке - РезультатЗапроса
// 	* РезультатПоТабличнойЧасти - РезультатЗапроса
// 	* РезультатПоНомерамНакладных - РезультатЗапроса
// 
Процедура ЗаполнитьТабличныйДокументТТН(ТабличныйДокумент, ДанныеДляПечати, ОбъектыПечати)
	
	ЕдиницаИзмеренияВеса           = Константы.ЕдиницаИзмеренияВеса.Получить(); 
	КоэффициентПересчетаВТонны     = НоменклатураСервер.КоэффициентПересчетаВТонны(Константы.ЕдиницаИзмеренияВеса.Получить());

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

// Параметры:
// 	ТабличныйДокумент - ТабличныйДокумент
// 	СтруктураДанных - Структура:
// 		* ТаблицаРезультата - ТаблицаЗначений
// 		* РезультатИменаТоваров - РезультатЗапроса
// 
Процедура ЗаполнитьТабличныйДокументТН(ТабличныйДокумент, СтруктураДанных, ОбъектыПечати, КомплектыПечати)
	
	Макет1529 = УправлениеПечатью.МакетПечатнойФормы("Документ.ТранспортнаяНакладная.ПФ_MXL_ТранспортнаяНакладная");
	Макет2200 = УправлениеПечатью.МакетПечатнойФормы("Документ.ТранспортнаяНакладная.ПФ_MXL_ТранспортнаяНакладная_2200");
	Макет2200_1 = УправлениеПечатью.МакетПечатнойФормы("Документ.ТранспортнаяНакладная.ПФ_MXL_ТранспортнаяНакладная_2200_1");

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

		Если ДанныеПечати.Дата < '20210101' Тогда
			ЗаполнитьТабличныйДокументТНВерсияДо2022(ТабличныйДокумент, ОбъектыПечати, ДанныеСсылкиДокументов, ДанныеПечати, Макет1529);
		ИначеЕсли ДанныеПечати.Дата < '20220301' Тогда
			ЗаполнитьТабличныйДокументТНВерсияДо2022(ТабличныйДокумент, ОбъектыПечати, ДанныеСсылкиДокументов, ДанныеПечати, Макет2200);
		Иначе
			ЗаполнитьТабличныйДокументТНВерсияС2022(ТабличныйДокумент, ОбъектыПечати, ДанныеСсылкиДокументов, ДанныеПечати, Макет2200_1);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ЗаполнитьТабличныйДокументТНВерсияДо2022(ТабличныйДокумент, ОбъектыПечати, ДанныеСсылкиДокументов, ДанныеПечати, Макет)

	НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
					
	ОбластьМакета = Макет.ПолучитьОбласть("ГоризонтальнаяЛицеваяСторона");
	ШтрихкодированиеПечатныхФорм.ВывестиШтрихкодВТабличныйДокумент(ТабличныйДокумент, Макет, ОбластьМакета, ДанныеПечати.Ссылка);
	
	ОбластьМакетаОборотная = Макет.ПолучитьОбласть("ГоризонтальнаяОборотнаяСторона");
	
	СведенияОГрузополучателе  = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Грузополучатель,  ДанныеПечати.Дата);
	СведенияОГрузоотправитель = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Грузоотправитель, ДанныеПечати.Дата);
	СведенияОПеревозчике      = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Перевозчик, ДанныеПечати.Дата);
	СведенияОВодителе         = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Водитель, ДанныеПечати.Дата);
	
	ПредставлениеГрузоотправителя = "";
	ПредставлениеПеревозчика      = "";
	ПредставлениеПеревозчика16_7  = "";
	Перевозчик                    = "";
	Грузоотправитель              = "";
	
	РеквизитыМакета = Новый Структура;
	РеквизитыМакета.Вставить("Пункт0_4", ДанныеПечати.Дата);
	РеквизитыМакета.Вставить("Пункт0_5", ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДанныеПечати.Номер));
	
	Если ЗначениеЗаполнено(ДанныеПечати.Грузополучатель) Тогда 
		Если СведенияОГрузополучателе.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо
			Или СведенияОГрузополучателе.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда
			РеквизитыМакета.Вставить("Пункт2_1", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузополучателе, 
				"ПолноеНаименование,ИНН,ЮридическийАдрес"));
		Иначе
			РеквизитыМакета.Вставить("Пункт2_2", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузополучателе, 
				"ПолноеНаименование,ИНН,ЮридическийАдрес,Телефоны"));
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ДанныеПечати.Грузоотправитель) Тогда 
		Если СведенияОГрузоотправитель.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо
		 Или СведенияОГрузоотправитель.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда
			ПредставлениеГрузоотправителя = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправитель, 
				"ПолноеНаименование,ИНН,ЮридическийАдрес");
			РеквизитыМакета.Вставить("Пункт1_1", ПредставлениеГрузоотправителя);
			Грузоотправитель = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправитель, "ПолноеНаименование");
		Иначе
			ПредставлениеГрузоотправителя = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправитель, 
				"ПолноеНаименование,ИНН,ЮридическийАдрес,Телефоны");
			РеквизитыМакета.Вставить("Пункт1_2", ПредставлениеГрузоотправителя);
			Грузоотправитель = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправитель, "ПолноеНаименование");
		КонецЕсли;
	КонецЕсли;

	
	СтруктураПоиска = Новый Структура("ПорядковыйНомер", ДанныеПечати.ПорядковыйНомер);
	
	ИменаТоваров = "";
	Пока ДанныеСсылкиДокументов.НайтиСледующий(СтруктураПоиска) Цикл								
		ИменаТоваров = ИменаТоваров + ДанныеСсылкиДокументов.НаименованиеВидаНоменклатуры + ", ";
	КонецЦикла;			
	
	Если СтрДлина(ИменаТоваров) >= 2 Тогда
		ИменаТоваров = Лев(ИменаТоваров, СтрДлина(ИменаТоваров) - 2);
	КонецЕсли;
	
	РеквизитыМакета.Вставить("Пункт3_1", ИменаТоваров);
	РеквизитыМакета.Вставить("Пункт6_1", ДанныеПечати.ПунктПогрузки);
	РеквизитыМакета.Вставить("Пункт7_1", ДанныеПечати.ПунктРазгрузки);
	
	МассаБруттоСтрока = НСтр("ru = '%МассаБрутто% кг'");
	МассаБруттоСтрока = СтрЗаменить(МассаБруттоСтрока, "%МассаБрутто%", ДанныеПечати.МассаБрутто);
	
	РеквизитыМакета.Вставить("Пункт6_5", МассаБруттоСтрока);
	
	ОбластьМакета.Параметры.Заполнить(РеквизитыМакета);
	
	ТабличныйДокумент.Вывести(ОбластьМакета);
	ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
	
	РеквизитыМакета.Очистить();
	
	Если ЗначениеЗаполнено(ДанныеПечати.Перевозчик) Тогда 
		Если СведенияОПеревозчике.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо
		 Или СведенияОПеревозчике.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда
			ПредставлениеПеревозчика = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПеревозчике, 
				"ПолноеНаименование,ФактическийАдрес,Телефоны");
			РеквизитыМакета.Вставить("Пункт10_1", ПредставлениеПеревозчика);
		Иначе
			ПредставлениеПеревозчика = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПеревозчике, 
				"ПолноеНаименование,ИНН,ФактическийАдрес,Телефоны");
			РеквизитыМакета.Вставить("Пункт10_2", ПредставлениеПеревозчика);
		КонецЕсли;
		Перевозчик = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПеревозчике, "ПолноеНаименование");
		ПредставлениеПеревозчика16_7 = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПеревозчике, "ПолноеНаименование,ИНН,ЮридическийАдрес");
	КонецЕсли;
	
	ПредставлениеВодителя = ФизическиеЛицаУТ.ФамилияИнициалыФизЛица(ДанныеПечати.Водитель, ДанныеПечати.Дата);
	
	РеквизитыМакета.Вставить("Пункт10_3", ПредставлениеВодителя);
	
	ГрузоподъемностьВТоннахАвтомобиля      = Формат(ДанныеПечати.ГрузоподъемностьВТоннахАвтомобиля,"");
	ВместимостьВКубическихМетрахАвтомобиля = Формат(ДанныеПечати.ВместимостьВКубическихМетрахАвтомобиля,"");
	
	ИнформацияОбАвтомобиле = ""
		+ ?(ПустаяСтрока(ДанныеПечати.ТипАвтомобиля),"",Строка(ДанныеПечати.ТипАвтомобиля) + ", ")
		+ ?(ПустаяСтрока(ДанныеПечати.МаркаАвтомобиля),"",ДанныеПечати.МаркаАвтомобиля  + ", ")
		+ ?(ПустаяСтрока(ГрузоподъемностьВТоннахАвтомобиля),"",ГрузоподъемностьВТоннахАвтомобиля + " " + НСтр("ru = 'т'")  + ", ")
		+ ?(ПустаяСтрока(ВместимостьВКубическихМетрахАвтомобиля),"",ВместимостьВКубическихМетрахАвтомобиля + " " + НСтр("ru = 'куб. м'"));
	
	ИнформацияОбАвтомобиле = СокрЛП(ИнформацияОбАвтомобиле);
	
	Пока Прав(ИнформацияОбАвтомобиле,1) = "," Цикл
		ИнформацияОбАвтомобиле = Лев(ИнформацияОбАвтомобиле, СтрДлина(ИнформацияОбАвтомобиле)-1)
	КонецЦикла;
	
	ОтветственноеЛицо = СтрШаблон(НСтр("ru = '%1 %2'"), ДанныеПечати.ДолжностьКладовщика, ДанныеПечати.Кладовщик);
	
	РеквизитыМакета.Вставить("Пункт11_1", ИнформацияОбАвтомобиле);
	РеквизитыМакета.Вставить("Пункт11_2", ДанныеПечати.ГосНомерАвтомобиля);
	
	СведенияОПлательщике = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Плательщик, ДанныеПечати.Дата,,ДанныеПечати.БанковскийСчетПлательщика);

	РеквизитыМакета.Вставить("Пункт15_6", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПлательщике, 
		"ПолноеНаименование,ИНН,ЮридическийАдрес,Телефоны,НомерСчета,Банк,БИК,КоррСчет"));
			
	РеквизитыМакета.Вставить("Пункт16_1", Грузоотправитель);
	РеквизитыМакета.Вставить("Пункт16_2", Перевозчик);
	РеквизитыМакета.Вставить("Пункт16_7", ПредставлениеПеревозчика16_7);
	РеквизитыМакета.Вставить("Пункт16_3", ОтветственноеЛицо);
	
	РеквизитыМакета.Вставить("Пункт16_11", ДанныеПечати.Дата);
	РеквизитыМакета.Вставить("Пункт16_21", ДанныеПечати.Дата);
	
	ОбластьМакетаОборотная.Параметры.Заполнить(РеквизитыМакета);
	
	ТабличныйДокумент.Вывести(ОбластьМакетаОборотная);
	
	УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеПечати.Ссылка);
КонецПроцедуры

Процедура ЗаполнитьТабличныйДокументТНВерсияС2022(ТабличныйДокумент, ОбъектыПечати, ДанныеСсылкиДокументов, ДанныеПечати, Макет)

	НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
					
	ОбластьМакета = Макет.ПолучитьОбласть("ГоризонтальнаяЛицеваяСторона");
	ШтрихкодированиеПечатныхФорм.ВывестиШтрихкодВТабличныйДокумент(ТабличныйДокумент, Макет, ОбластьМакета, ДанныеПечати.Ссылка);
	
	ОбластьМакетаОборотная = Макет.ПолучитьОбласть("ГоризонтальнаяОборотнаяСторона");
	
	СведенияОГрузополучателе  = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Грузополучатель,  ДанныеПечати.Дата);
	СведенияОГрузоотправитель = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Грузоотправитель, ДанныеПечати.Дата);
	СведенияОПеревозчике      = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Перевозчик, ДанныеПечати.Дата);
	
	ПредставлениеГрузоотправителя = "";
	ПредставлениеПеревозчика      = "";
	ПредставлениеПеревозчика12_6  = "";
	Грузоотправитель              = "";
	
	РеквизитыМакета = Новый Структура;
	РеквизитыМакета.Вставить("Пункт0_4", ДанныеПечати.Дата);
	РеквизитыМакета.Вставить("Пункт0_5", ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДанныеПечати.Номер));
	
	Если ЗначениеЗаполнено(ДанныеПечати.Грузоотправитель) Тогда 
		Если СведенияОГрузоотправитель.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо
		 Или СведенияОГрузоотправитель.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда
			ПредставлениеГрузоотправителя = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправитель, 
				"ПолноеНаименование,ИНН,ЮридическийАдрес");
			РеквизитыМакета.Вставить("Пункт1_1", ПредставлениеГрузоотправителя);
			Грузоотправитель = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправитель, "ПолноеНаименование");
		Иначе
			ПредставлениеГрузоотправителя = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправитель, 
				"ПолноеНаименование,ИНН,ЮридическийАдрес,Телефоны");
			РеквизитыМакета.Вставить("Пункт1_1", ПредставлениеГрузоотправителя);
			Грузоотправитель = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправитель, "ПолноеНаименование");
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ДанныеПечати.Грузополучатель) Тогда 
		Если СведенияОГрузополучателе.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо
			Или СведенияОГрузополучателе.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда
			РеквизитыМакета.Вставить("Пункт2_1", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузополучателе, 
				"ПолноеНаименование,ИНН,ЮридическийАдрес"));
		Иначе
			РеквизитыМакета.Вставить("Пункт2_1", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузополучателе, 
				"ПолноеНаименование,ИНН,ЮридическийАдрес,Телефоны"));
		КонецЕсли;
	КонецЕсли;
	РеквизитыМакета.Вставить("Пункт2_2", ДанныеПечати.ПунктРазгрузки);
	СтруктураПоиска = Новый Структура("ПорядковыйНомер", ДанныеПечати.ПорядковыйНомер);
	
	ИменаТоваров = "";
	Пока ДанныеСсылкиДокументов.НайтиСледующий(СтруктураПоиска) Цикл
		ИменаТоваров = ИменаТоваров + ДанныеСсылкиДокументов.НаименованиеВидаНоменклатуры + ", ";
	КонецЦикла;			
	
	Если СтрДлина(ИменаТоваров) >= 2 Тогда
		ИменаТоваров = Лев(ИменаТоваров, СтрДлина(ИменаТоваров) - 2);
	КонецЕсли;
	
	РеквизитыМакета.Вставить("Пункт3_1", ИменаТоваров);
	
	Если ЗначениеЗаполнено(ДанныеПечати.Перевозчик) Тогда 
		Если СведенияОПеревозчике.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо
		 Или СведенияОПеревозчике.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда
			ПредставлениеПеревозчика = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПеревозчике, 
				"ПолноеНаименование,ФактическийАдрес,Телефоны");
			РеквизитыМакета.Вставить("Пункт6_1", ПредставлениеПеревозчика);
		Иначе
			ПредставлениеПеревозчика = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПеревозчике, 
				"ПолноеНаименование,ИНН,ФактическийАдрес,Телефоны");
			РеквизитыМакета.Вставить("Пункт6_1", ПредставлениеПеревозчика);
		КонецЕсли;
		ПредставлениеПеревозчика12_6 = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПеревозчике, "ПолноеНаименование,ИНН,ЮридическийАдрес");
	КонецЕсли;
	
	ГрузоподъемностьВТоннахАвтомобиля      = Формат(ДанныеПечати.ГрузоподъемностьВТоннахАвтомобиля,"");
	ВместимостьВКубическихМетрахАвтомобиля = Формат(ДанныеПечати.ВместимостьВКубическихМетрахАвтомобиля,"");
	
	ИнформацияОбАвтомобиле = ""
		+ ?(ПустаяСтрока(ДанныеПечати.ТипАвтомобиля),"",Строка(ДанныеПечати.ТипАвтомобиля) + ", ")
		+ ?(ПустаяСтрока(ДанныеПечати.МаркаАвтомобиля),"",ДанныеПечати.МаркаАвтомобиля  + ", ")
		+ ?(ПустаяСтрока(ГрузоподъемностьВТоннахАвтомобиля),"",ГрузоподъемностьВТоннахАвтомобиля + " " + НСтр("ru = 'т'")  + ", ")
		+ ?(ПустаяСтрока(ВместимостьВКубическихМетрахАвтомобиля),"",ВместимостьВКубическихМетрахАвтомобиля + " " + НСтр("ru = 'куб. м'"));
	
	ИнформацияОбАвтомобиле = СокрЛП(ИнформацияОбАвтомобиле);
	
	Пока Прав(ИнформацияОбАвтомобиле,1) = "," Цикл
		ИнформацияОбАвтомобиле = Лев(ИнформацияОбАвтомобиле, СтрДлина(ИнформацияОбАвтомобиле)-1)
	КонецЦикла;
	
	РеквизитыМакета.Вставить("Пункт7_1", ИнформацияОбАвтомобиле);
	РеквизитыМакета.Вставить("Пункт7_2", ДанныеПечати.ГосНомерАвтомобиля);

	ОбластьМакета.Параметры.Заполнить(РеквизитыМакета);
	
	ТабличныйДокумент.Вывести(ОбластьМакета);
	ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
	
	РеквизитыМакета.Очистить();
	
	РеквизитыМакета.Вставить("Пункт8_1", ПредставлениеГрузоотправителя);
	РеквизитыМакета.Вставить("Пункт8_2", ДанныеПечати.ПунктПогрузки);

	МассаБруттоСтрока = НСтр("ru = '%МассаБрутто% кг'");
	МассаБруттоСтрока = СтрЗаменить(МассаБруттоСтрока, "%МассаБрутто%", ДанныеПечати.МассаБрутто);
	РеквизитыМакета.Вставить("Пункт8_5", МассаБруттоСтрока);

	ПредставлениеВодителя = ФизическиеЛицаУТ.ФамилияИнициалыФизЛица(ДанныеПечати.Водитель, ДанныеПечати.Дата);
	РеквизитыМакета.Вставить("Пункт8_8", ПредставлениеВодителя);

	
	РеквизитыМакета.Вставить("Пункт10_1", ДанныеПечати.ПунктРазгрузки);
	РеквизитыМакета.Вставить("Пункт10_6", МассаБруттоСтрока);
	РеквизитыМакета.Вставить("Пункт10_9", ПредставлениеВодителя);
	
	СведенияОПлательщике = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Плательщик, ДанныеПечати.Дата,,ДанныеПечати.БанковскийСчетПлательщика);

	РеквизитыМакета.Вставить("Пункт12_10", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПлательщике, 
		"ПолноеНаименование,ИНН,ЮридическийАдрес,Телефоны,НомерСчета,Банк,БИК,КоррСчет"));
			
	РеквизитыМакета.Вставить("Пункт12_7", Грузоотправитель);
	РеквизитыМакета.Вставить("Пункт12_6", ПредставлениеПеревозчика12_6);
	РеквизитыМакета.Вставить("Пункт12_12", ДанныеПечати.Кладовщик);
	
	РеквизитыМакета.Вставить("Пункт12_13", Формат(ДанныеПечати.Дата, "ДЛФ=D"));
	МассивСтрок = Новый Массив;
	Если Не ПустаяСтрока(ДанныеПечати.ДолжностьКладовщика) Тогда
		МассивСтрок.Добавить(ДанныеПечати.ДолжностьКладовщика);
	КонецЕсли;
	МассивСтрок.Добавить(Формат(ДанныеПечати.Дата, "ДЛФ=D"));
	РеквизитыМакета.Вставить("Пункт12_14", СтрСоединить(МассивСтрок, ", "));
	
	ОбластьМакетаОборотная.Параметры.Заполнить(РеквизитыМакета);
	
	ТабличныйДокумент.Вывести(ОбластьМакетаОборотная);
	
	УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеПечати.Ссылка);
КонецПроцедуры

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

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

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

КонецФункции

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

КонецФункции

Функция ПредставлениеСпособаДоставки(СпособДоставки, Документ)
	
	Представление = "";
	
	Если СпособДоставки = Перечисления.СпособыДоставки.Самовывоз Тогда
		Представление = НСтр("ru = 'Самовывоз (с нашего склада)'");
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.ДоКлиента Тогда
		
		ТипДокумента = ТипЗнч(Документ);
		Если ТипДокумента = Тип("ДокументСсылка.ПеремещениеТоваров")
			Или ТипДокумента = Тип("ДокументСсылка.ЗаказНаПеремещение") Тогда
			Представление = НСтр("ru = 'Наша транспортная служба до получателя'");
		ИначеЕсли ТипДокумента = Тип("ДокументСсылка.ОтгрузкаТоваровСХранения") Тогда
			Представление = НСтр("ru = 'Наша транспортная служба до владельца'");
		//++ НЕ УТ
		ИначеЕсли ТипДокумента = Тип("ДокументСсылка.ЗаказПереработчику2_5") Тогда
			Представление = НСтр("ru = 'Наша транспортная служба до переработчика'");
		//++ Устарело_Переработка24
		ИначеЕсли ТипДокумента = Тип("ДокументСсылка.ПередачаСырьяПереработчику")
			Или ТипДокумента = Тип("ДокументСсылка.ЗаказПереработчику") Тогда
			Представление = НСтр("ru = 'Наша транспортная служба до переработчика'");
		//-- Устарело_Переработка24
		
		//-- НЕ УТ
		
		Иначе
			Представление = НСтр("ru = 'Наша транспортная служба до клиента'");
		КонецЕсли;
		
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.СиламиПеревозчика Тогда
		Представление = НСтр("ru = 'Перевозчик (с нашего склада)'");
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.СиламиПеревозчикаПоАдресу Тогда
		Представление = НСтр("ru = 'Наша транспортная служба до перевозчика'");
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.КПолучателюОпределяетСлужбаДоставки Тогда
		Представление = НСтр("ru = 'На усмотрение транспортной службы'");
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.СиламиПоставщикаДоНашегоСклада Тогда
		Представление = НСтр("ru = 'Поставщик (на наш склад)'");
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.СиламиПеревозчикаДоНашегоСклада Тогда
		Представление = НСтр("ru = 'Перевозчик (на наш склад)'");
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.СиламиПеревозчикаДоПунктаПередачи Тогда
		Представление = НСтр("ru = 'Наша транспортная служба от перевозчика'");
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.НашимиСиламиСАдресаОтправителя Тогда
		Представление = НСтр("ru = 'Наша транспортная служба от поставщика'");
	ИначеЕсли СпособДоставки = Перечисления.СпособыДоставки.ОтОтправителяОпределяетСлужбаДоставки Тогда
		Представление = НСтр("ru = 'На усмотрение транспортной службы'");
	КонецЕсли;
	
	Возврат Представление;
	
КонецФункции

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

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

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

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Организация)";

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

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

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

Функция ТекстВыборкиПолейДокументаОснования(Реквизиты, ПараметрыФормированияТранспортныхНакладных, ПолучатьРеквизитыИзЗаказа, ПолучатьРеквизитыЗадания, ЕстьСпособДоставки)
	
	ТекстыЗапросаПолейДокументаОснования = Новый Массив;
	
	Для Каждого ИмяРеквизита Из Реквизиты Цикл
		
		Если (ИмяРеквизита = "АдресДоставки"
			Или ИмяРеквизита = "АдресДоставкиЗначение"
			Или ИмяРеквизита = "АдресДоставкиЗначенияПолей"
			Или ИмяРеквизита = "ПеревозчикПартнер")
			И ЕстьСпособДоставки Тогда
			
			Если ПараметрыФормированияТранспортныхНакладных.ЕстьЗаказы Тогда
				ТекстПоля =
				"ВЫБОР КОГДА ОснованиеТранспортнойНакладной." + ПараметрыФормированияТранспортныхНакладных.ИмяПоляНакладнаяПоЗаказу + "
				|	И &ИспользоватьРасширенныеВозможностиЗаказа ТОГДА
				|	" + ?(Не ПолучатьРеквизитыИзЗаказа,"""""",
				"ВЫБОР
				|		КОГДА ДокументТовары." + ПараметрыФормированияТранспортныхНакладных.ИмяПоляЗаказВТЧТовары + ".СпособДоставки В (&СпособыДоставкиПоЗаданиюНаПеревозку) ТОГДА
				|			" + ?(ПолучатьРеквизитыЗадания,"НакладныеПоЗаданиямНаПеревозку." + ИмяРеквизита, """""") + "
				|		ИНАЧЕ
				|			ДокументТовары." + ПараметрыФормированияТранспортныхНакладных.ИмяПоляЗаказВТЧТовары + "." + ИмяРеквизита + "
				|		КОНЕЦ") + "
				|    ИНАЧЕ
				|		ВЫБОР
				|			КОГДА ОснованиеТранспортнойНакладной.СпособДоставки В (&СпособыДоставкиПоЗаданиюНаПеревозку) ТОГДА
				|			" + ?(ПолучатьРеквизитыЗадания,"НакладныеПоЗаданиямНаПеревозку." + ИмяРеквизита, """""") + "
				|		ИНАЧЕ
				|				ОснованиеТранспортнойНакладной." + ИмяРеквизита + "
				|		КОНЕЦ 
				|КОНЕЦ КАК " + ИмяРеквизита; // @query-part
			Иначе
				ТекстПоля = 
				"ВЫБОР
				|	КОГДА ОснованиеТранспортнойНакладной.СпособДоставки В (&СпособыДоставкиПоЗаданиюНаПеревозку) ТОГДА
				|		" + ?(ПолучатьРеквизитыЗадания,"НакладныеПоЗаданиямНаПеревозку." + ИмяРеквизита, """""") + "
				|	ИНАЧЕ
				|		ОснованиеТранспортнойНакладной." + ИмяРеквизита + "
				|	КОНЕЦ КАК " + ИмяРеквизита; // @query-part
			КонецЕсли;
			
		Иначе
			ТекстПоля = ПараметрыФормированияТранспортныхНакладных.Реквизиты[ИмяРеквизита] + " КАК " + ИмяРеквизита;
		КонецЕсли;
		
		ТекстыЗапросаПолейДокументаОснования.Добавить(ТекстПоля);
		
	КонецЦикла;
	
	Возврат СтрСоединить(ТекстыЗапросаПолейДокументаОснования, "," + Символы.ПС); 

КонецФункции

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

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

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

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

		ТекстВыборкиТоваров = 
		"ВЫБРАТЬ
		|	ДокументТовары.НомерСтроки КАК НомерСтроки,
		|	ДокументТовары.Номенклатура КАК Номенклатура,
		|	ДокументТовары.Упаковка КАК Упаковка,
		|	ДокументТовары.КоличествоУпаковок КАК КоличествоУпаковок,
		|	ДокументТовары.Количество КАК Количество,
		|	ВЫРАЗИТЬ(&ТекстЗапросаВесНоменклатуры КАК ЧИСЛО(12,3)) КАК МассаНеттоНоменклатуры,
		|	ДокументТовары.Количество * &ТекстЗапросаВесНоменклатуры КАК МассаНетто,
		|	ДокументТовары.Ссылка КАК Ссылка " +
		?(ЭтоПервыйТипОснования, "ПОМЕСТИТЬ ТаблицаТоваров", "") + "
		|ИЗ
		|	" + ПолноеИмяОснования + "." + ПараметрыФормированияТранспортныхНакладных.ИмяТЧТовары + " КАК ДокументТовары
		|ГДЕ
		|	ДокументТовары.Ссылка В(&МассивОбъектов)
		|	//&УсловиеИспользованияЗаказов
		|";

		ТекстУсловиеИспользованияЗаказов = ?(ПараметрыФормированияТранспортныхНакладных.ЕстьЗаказы,
											"И НЕ ДокументТовары.Ссылка." + ПараметрыФормированияТранспортныхНакладных.ИмяПоляНакладнаяПоЗаказу,
											"");
		
		ТекстВыборкиТоваров = СтрЗаменить(ТекстВыборкиТоваров,
										"&МассивОбъектов",
										"&МассивОбъектов" + МетаданныеОбъекта.Имя);
		ТекстВыборкиТоваров = СтрЗаменить(ТекстВыборкиТоваров,
										"//&УсловиеИспользованияЗаказов",
										ТекстУсловиеИспользованияЗаказов);
		
		ТекстыВыборкиТоваров.Добавить(ТекстВыборкиТоваров);

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

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

	ТекстВыборкиМассы = СтрЗаменить(
		ТекстВыборкиМассы, 
		"&ТекстЗапросаВесВидаУпаковки",
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки(
			"КоэффициентыУпаковок.ВидУпаковки",
			"ТаблицаТоваров.Номенклатура"));

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

Функция ЕстьСпособДоставки(ТипРаспоряжения)
	Возврат Метаданные.ОпределяемыеТипы.РаспоряжениеНаДоставку.Тип.СодержитТип(ТипРаспоряжения);
КонецФункции

Функция ЗаменитьСинонимТаблицы(СинонимТаблицы, ТекстПоля)
	
	ЧастиСтроки = СтрРазделить(ТекстПоля, ".");
	Если ЧастиСтроки.Количество() = 2 Тогда
		ЧастиСтроки[0] = СинонимТаблицы;
		Возврат СтрСоединить(ЧастиСтроки, ".");
	ИначеЕсли ЧастиСтроки.Количество() = 1 Тогда
		Возврат СинонимТаблицы + "." + ТекстПоля;
	Иначе
		Возврат ТекстПоля;
	КонецЕсли;
		
КонецФункции

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

#КонецЕсли

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