План производства / Модуль объекта

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

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

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

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

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

#Область ОбработчикиСобытий

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

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

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

Процедура ПриКопировании(ОбъектКопирования)

	Статус = Метаданные().Реквизиты.Статус.ЗначениеЗаполнения;
	
	Если Не ЗначениеЗаполнено(Дата) Тогда
		Дата = ТекущаяДатаСеанса();
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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