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