План производства / Модуль менеджера

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

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

#Область Проведение

// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
//              регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("Бюджетирование");
	МеханизмыДокумента.Добавить("ПланированиеЗапасов");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ПланыПроизводстваРазборка
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваРазборка");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (разборка)'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (разборка)'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланы");
	
	ДопПараметры.Вставить("ПланыПроизводстваРазборка", ДопПараметр);
	
#КонецОбласти
	
#Область ПланыПроизводстваРазборкаСОтбором
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваРазборкаСОтбором");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (разборка)*'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (разборка)*'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланыСОтбором");
	
	ДопПараметры.Вставить("ПланыПроизводстваРазборкаСОтбором", ДопПараметр);
	
#КонецОбласти

#Область ПланыПроизводстваРемонт
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваРемонт");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (ремонт)'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (ремонт)'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланы");
	
	ДопПараметры.Вставить("ПланыПроизводстваРемонт", ДопПараметр);
	
#КонецОбласти
	
#Область ПланыПроизводстваРемонтСОтбором
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваРемонтСОтбором");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (ремонт)*'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланированиеПроизводства И ДоступноОписаниеТипаПроизводственногоПроцесса И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (ремонт)*'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланыСОтбором");
	
	ДопПараметры.Вставить("ПланыПроизводстваРемонтСОтбором", ДопПараметр);
	
#КонецОбласти
	
#Область ПланыПроизводстваМатериалы
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваМатериалы");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (потребность в материалах)'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьДляПланированияМатериалов);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьДляПланированияМатериалов);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (потребность в материалах)'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланы");
	
	ДопПараметры.Вставить("ПланыПроизводстваМатериалы", ДопПараметр);
	
#КонецОбласти
	
#Область ПланыПроизводстваМатериалыСОтбором
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваМатериалыСОтбором");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (потребность в материалах)*'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьДляПланированияМатериалов И (СоздаватьРеквизитСОтбором ИЛИ ВидПлана.ЗаполнятьСклад));
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьДляПланированияМатериалов И (СоздаватьРеквизитСОтбором ИЛИ ВидПлана.ЗаполнятьСклад));
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (потребность в материалах)*'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланыСОтбором");
	
	ДопПараметры.Вставить("ПланыПроизводстваМатериалыСОтбором", ДопПараметр);
#КонецОбласти

#Область ПланыПроизводстваПолуфабрикаты
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваПолуфабрикаты");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (полуфабрикаты)'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланированиеПроизводства);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланированиеПроизводства);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (полуфабрикаты)'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланы");
	
	ДопПараметры.Вставить("ПланыПроизводстваПолуфабрикаты", ДопПараметр);
	
#КонецОбласти
	
#Область ПланыПроизводстваПолуфабрикатыСОтбором
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваПолуфабрикатыСОтбором");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (полуфабрикаты)*'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (полуфабрикаты)*'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланыСОтбором");
	
	ДопПараметры.Вставить("ПланыПроизводстваПолуфабрикатыСОтбором", ДопПараметр);
#КонецОбласти

#Область ПланыПроизводстваПотребностьВПолуфабрикатах
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваПотребностьВПолуфабрикатах");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (потребность в полуфабрикатах)'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьДляПланированияМатериалов);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьДляПланированияМатериалов);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (потребность в полуфабрикатах)'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланы");
	
	ДопПараметры.Вставить("ПланыПроизводстваПотребностьВПолуфабрикатах", ДопПараметр);
	
#КонецОбласти
	
#Область ПланыПроизводстваПотребностьВПолуфабрикатахСОтбором
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыПроизводстваПотребностьВПолуфабрикатахСОтбором");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (потребность в полуфабрикатах)*'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьДляПланированияМатериалов И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьДляПланированияМатериалов И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (потребность в полуфабрикатах)*'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланыСОтбором");
	
	ДопПараметры.Вставить("ПланыПроизводстваПотребностьВПолуфабрикатахСОтбором", ДопПараметр);
#КонецОбласти

#Область ФактыПроизводства
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ФактыПроизводства");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт производства*'"), 
		НСтр("ru='Факт производства'")));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПроизводство И ЧтениеФактаПроизводства);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПроизводство И ЧтениеФактаПроизводства);
	ДопПараметр.Вставить("ЗаголовокОперанда", ?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт производства*'"), 
		НСтр("ru='Факт производства'")));
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыФакты");
	
	ДопПараметры.Вставить("ФактыПроизводства", ДопПараметр);
#КонецОбласти
	
#Область ФактыПроизводстваМатериалы
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 			"ФактыПроизводстваМатериалы");
	ДопПараметр.Вставить("Тип", 			Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 			ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 		?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт производства (материалы)*'"), 
		НСтр("ru='Факт производства (материалы)'")));
	ДопПараметр.Вставить("СоздаватьРеквизит", ИспользоватьПроизводство И ЧтениеФактаПроизводстваМатериалы);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", ИспользоватьПроизводство И ЧтениеФактаПроизводстваМатериалы);
	ДопПараметр.Вставить("ЗаголовокОперанда", ?(СоздаватьРеквизитСОтбором, НСтр("ru='Факт производства (материалы)*'"), 
		НСтр("ru='Факт производства (материалы)'")));
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыФакты");
	
	ДопПараметры.Вставить("ФактыПроизводстваМатериалы", ДопПараметр);
#КонецОбласти

#Область ПланыВыпуска
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыВыпуска");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (весь выпуск)'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланированиеПроизводства);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланированиеПроизводства);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (весь выпуск)'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланы");
	
	ДопПараметры.Вставить("ПланыВыпуска", ДопПараметр);
	
#КонецОбласти
	
#Область ПланыВыпускаСОтбором
	// Свойства реквизита формы
	ДопПараметр = Новый Структура();
	ДопПараметр.Вставить("Имя", 				"ПланыВыпускаСОтбором");
	ДопПараметр.Вставить("Тип", 				Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ДопПараметр.Вставить("Путь", 				ПутьКРеквизиту);
	ДопПараметр.Вставить("Заголовок", 			НСтр("ru='План производства (весь выпуск)*'"));
	ДопПараметр.Вставить("СоздаватьРеквизит", 	ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("УдалятьРеквизитыТаблицы", Истина);
	
	// Общие свойства
	ДопПараметр.Вставить("СоздаватьОперанд", 	ИспользоватьПланированиеПроизводства И СоздаватьРеквизитСОтбором);
	ДопПараметр.Вставить("ЗаголовокОперанда", 	НСтр("ru='План производства (весь выпуск)*'"));
	ДопПараметр.Вставить("Расшифровка", 		"Документ.ПланПроизводства");
	ДопПараметр.Вставить("ВходитВОперанд",		"ДополнительныеОперандыПланыСОтбором");
	
	ДопПараметры.Вставить("ПланыВыпускаСОтбором", ДопПараметр);
	
#КонецОбласти
	
КонецПроцедуры

// Возвращает макеты операндов для данного плана
//
// Параметры:
//  Макеты  - Соответствие - Общий список макетов, в который добавляются макеты этого документа.
//
// Возвращаемое значение:
//   Соответствие   - Макеты для операндов.
//
Функция МакетыОперандовПлана(Макеты = Неопределено) Экспорт

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

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

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

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

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

	Периоды = Параметры.Периоды;
	Планирование.ПодготовитьТаблицуПериодовПередЗаполнением(Параметры);
	Планирование.ЗаполнитьТаблицуПериодов(Периоды, Параметры.Периодичность, Параметры.НачалоПериодаСмещения, Параметры.КонецПериодаСмещения,,, Параметры.НачалоАктивныхПериодов);
	
	НайденныеСтрокиПериодов = Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
	ВсегоПериодов = НайденныеСтрокиПериодов.Количество();
	Если Параметры.КроссТаблица И ВсегоПериодов = 0 Тогда 
		
		ПоместитьВоВременноеХранилище(Новый ТаблицаЗначений, АдресХранилища);
		ПоместитьВоВременноеХранилище(Неопределено, АдресХранилищаДополнительный);
		
		Возврат;
		
	КонецЕсли;
	
	Параметры.Вставить("Периоды", Периоды); 
	
	ЗаполняемаяТЧ = Параметры.ЗаполняемаяТЧ;
	
	КолонкаПериода = ЗаполняемаяТЧ.Колонки[ИмяКолонкиПериода]; // КолонкаТаблицыЗначений - 
	КолонкаПериода.Имя = "ПериодСостава";
	
	Результат = Планирование.ЗаполнитьПоФормуле(Параметры);
	
	Если Результат.Колонки.Найти("ПериодСостава") = Неопределено Тогда
		Результат.Колонки.Добавить("ПериодСостава", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата))
	КонецЕсли; 
	
	Результат.Колонки["ПериодСостава"].Имя = ИмяКолонкиПериода;
	Параметры.Вставить("ЗаполняемаяТЧ", Результат);
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
	Если Параметры.НачалоАктивныхПериодов > Параметры.НачалоПериодаСмещения Тогда
		ПоместитьВоВременноеХранилище(Периоды, АдресХранилищаДополнительный);
	Иначе
		ПоместитьВоВременноеХранилище(Неопределено, АдресХранилищаДополнительный);
	КонецЕсли;
	
	КоличествоОбработанных = Периоды.Количество();
	ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанных);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область Проведение

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

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

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

Функция ТекстЗапросаТаблицаПланыПроизводства(Запрос, ТекстыЗапроса, Регистры)
	
	ИмяРегистра = "ПланыПроизводства";
	
	Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
		Возврат "";
	КонецЕсли;
	
	Если НЕ ПроведениеДокументов.ЕстьТаблицаЗапроса("ВТПродукция", ТекстыЗапроса) Тогда
		ТекстЗапросаВТПродукция(Запрос, ТекстыЗапроса);
	КонецЕсли;
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	Таблица.Период                   КАК Период,
	|	&Сценарий                        КАК Сценарий,
	|	&Статус                          КАК Статус,
	|	Таблица.Номенклатура             КАК Номенклатура,
	|	Таблица.Характеристика           КАК Характеристика,
	|	&Подразделение                   КАК Подразделение,
	|	&Ссылка                          КАК ПланПроизводства,
	|	Таблица.Спецификация             КАК Спецификация,
	|	Таблица.Назначение               КАК Назначение,
	|	ДАТАВРЕМЯ(1,1,1)                 КАК ДатаВыпускаПолуфабриката,
	|	Таблица.ДатаЗапускаВыпуска       КАК ДатаЗапускаВыпуска,
	|	ЛОЖЬ                             КАК ЭтоПолуфабрикат,
	|	&ТипПроизводственногоПроцесса    КАК ТипПроизводственногоПроцесса,
	|	&ВидПлана                        КАК ВидПлана,
	|	Таблица.Количество               КАК Количество,
	|	Таблица.КЗаказу                  КАК КЗаказу,
	|	Таблица.ЗаданИнтервалПотребности КАК ЗаданИнтервалПотребности,
	|	Таблица.ИнтервалПотребностиОт    КАК ИнтервалПотребностиОт,
	|	Таблица.ИнтервалПотребностиДо    КАК ИнтервалПотребностиДо
	|ИЗ
	|	ВТПродукция КАК Таблица";
	
	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

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

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

//++ НЕ УТ

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

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

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

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

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

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

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

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

	// План производства
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "ПланПроизводства";
	КомандаПечати.Представление = НСтр("ru = 'План производства'");
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	

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

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

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

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

Функция СоздатьПрисоединенныйФайлExcel(ДокументСсылка, ИдентификаторФормы) Экспорт
	
	ПараметрыПечати = Новый Структура;
	ПараметрыПечати.Вставить("ВыводитьШапку", Ложь);
	
	МассивДокументов = Новый Массив;
	МассивДокументов.Добавить(ДокументСсылка);
	
	ОбъектыПечати = Новый СписокЗначений;
	ОбъектыПечати.Добавить(ДокументСсылка);
	
	ТабличныйДокумент = СформироватьПечатнуюФормуПлана(МассивДокументов, ОбъектыПечати, ПараметрыПечати);
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS97);
	
	АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), ИдентификаторФормы);
	
	ТекущаяДата = ТекущаяДатаСеанса();
	ПараметрыФайла = Новый Структура();
	ПараметрыФайла.Вставить("Автор", Пользователи.АвторизованныйПользователь());
	ПараметрыФайла.Вставить("ВладелецФайлов", ДокументСсылка);
	ПараметрыФайла.Вставить("ИмяБезРасширения", "Excel" + " " + Формат(ТекущаяДата, НСтр("ru = 'ДФ=''dd.MM.yyyy ЧЧ.мм.сс'''")));
	ПараметрыФайла.Вставить("РасширениеБезТочки", "xls");
	ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяДата);
	
	Файл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище, Неопределено);
	
	УдалитьФайлы(ИмяВременногоФайла);
	
	Если Файл <> Неопределено Тогда
		РаботаСФайламиСлужебный.ЗанятьФайлДляРедактированияСервер(Файл);
		ДанныеФайла = РаботаСФайлами.ДанныеФайла(Файл, ИдентификаторФормы, Истина);
		СтруктураДействийExcel = Новый Структура;
		СтруктураДействийExcel.Вставить("AutoFilter", Новый Структура("СтрокаНачало, КолонкаНачало", 2, 2));
		
		// Скрытие колонок с идентификаторами номенклатуры и характеристик, упаковки, партнера, соглашения, склада.
		МассивКолонок = Новый Массив;
		МассивКолонок.Добавить(3);
		МассивКолонок.Добавить(4);
		МассивКолонок.Добавить(5);
		МассивКолонок.Добавить(6);
		СтруктураДействийExcel.Вставить("HiddenColumns", МассивКолонок);
		
		Возврат Новый Структура("ДанныеФайла, Файл, СтруктураДействийExcel", ДанныеФайла, Файл, СтруктураДействийExcel);
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

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

#Область ТекущиеДела

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

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

#Область СостоянияРасчетаПланаПроизводства

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

// Возвращает коды состояний расчета плана производства (потребность планов производства в материалах, трудозатратах и ВРЦ).
// 
// Возвращаемое значение:
//  ФиксированнаяСтруктура - коды состояний.
//
Функция КодыСостоянийРасчетаПланаПроизводства() Экспорт
	
	Состояния = Новый Структура();
	
	Состояния.Вставить("НеРассчитан",           0);
	Состояния.Вставить("Рассчитан",             1);
	Состояния.Вставить("ОжидаетРасчета",        2);
	Состояния.Вставить("Рассчитывается",        3);
	Состояния.Вставить("Отменяется",            4);
	Состояния.Вставить("НеРассчитанЕстьОшибки", 5);
	
	Возврат Новый ФиксированнаяСтруктура(Состояния);
	
КонецФункции

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

#Область ЗагрузкаДанныхИзФайла

// Производит сопоставление данных, загружаемых в табличную часть ПолноеИмяТабличнойЧасти,
// с данными в ИБ, и заполняет параметры АдресТаблицыСопоставления и СписокНеоднозначностей.
// 
// Параметры:
// 	АдресЗагружаемыхДанных- Строка - адрес временного хранилища с таблицей значений, в которой
//                                   находятся загруженные данные из файла.
// 	АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений,
//                                       являющейся копией табличной части документа, 
//                                       которую необходимо заполнить из таблицы АдресЗагружаемыхДанных.
// 	СписокНеоднозначностей - ТаблицаЗначений - состоит из:
//  * Идентификатор - Число - идентификатор
//  * Колонка - Строка - имя колонки
// 	ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части
// 	ДополнительныеПараметры - Структура - дополнительные параметры, переданные из формы-источнике.
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
	Планирование.СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры);
КонецПроцедуры

Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
	Планирование.ЗаполнитьСписокНеоднозначностей(СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры);
КонецПроцедуры

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

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

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

Процедура ПолучитьДанныеГрафикаЗаГод(ПараметрыГрафика, ГодГрафика)

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

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

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

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

#КонецЕсли

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