Задание на перевозку / Модуль менеджера

файл
// @strict-types

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

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

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

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

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

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

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

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

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

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

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

#Область ПроверкиПриСменеСтатуса

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

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

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

// Возвращает текст запроса получения списка накладных из задания на перевозку.
//
// Параметры:
//  ФормироватьВТРаспоряжения	 - Булево
// 
// Возвращаемое значение:
//  Строка - Строка с запросом
//
Функция ТекстЗапросаПолученияСпискаНакладныхИзЗаданийНаПеревозку(ФормироватьВТРаспоряжения) Экспорт

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбъединитьОбластьСоСтрокамиНиже(ТабличныйДокумент, ИмяОбласти, КоличествоДопСтрок)
	
	Если КоличествоДопСтрок < 1 Тогда
		Возврат
	КонецЕсли;
	
	Область = ТабличныйДокумент.Область(ИмяОбласти);
	
	Область.Разъединить();
	
	Область.Имя = Неопределено;
	
	АдресОбласти = Область.Имя;
	
	МассивАдресОбласти = СтрРазделить(АдресОбласти, ":");
	
	Если МассивАдресОбласти.Количество() = 1 Тогда
		МассивАдресОбласти.Добавить(МассивАдресОбласти[0]);
	КонецЕсли;
	
	АдресОкончания       = МассивАдресОбласти[1];
	МассивАдресОкончания = СтрРазделить(АдресОкончания, "C");
	НомерПоследнейСтрокиСтрока = Сред(МассивАдресОкончания[0], 2);
	НовыйНомерПоследнейСтроки = Строка(Число(НомерПоследнейСтрокиСтрока) + КоличествоДопСтрок);
	НовыйНомерПоследнейСтроки = СтрЗаменить(НовыйНомерПоследнейСтроки, Символы.НПП, "");
	НовыйАдрес = МассивАдресОбласти[0] + ":R" + НовыйНомерПоследнейСтроки + "C" + МассивАдресОкончания[1];
	
	Область = ТабличныйДокумент.Область(НовыйАдрес);
	
	Область.Объединить();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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