#Область ОписаниеПеременных
&НаКлиенте
Перем КэшированныеЗначения;
&НаКлиенте
Перем ПараметрыОбработчикаОжидания;
&НаКлиенте
Перем ОповещениеПослеЗаписи Экспорт;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
Планирование.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
Параметры.Свойство("ТекущаяСтрока", ТекущаяСтрокаПриОткрытии);
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
ОбновлятьПравило = Объект.ПравилоЗаполнения.Количество() = 0;
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана);
ЗаполнитьЗначенияСвойств(Объект, ПараметрыВидаПлана,"ЗаполнятьПоФормуле,Замещающий,ЗаполнятьПоДефициту");
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Сценарий,
"Периодичность, СценарийБюджетирования");
ЗаполнитьЗначенияСвойств(Объект, ПараметрыСценария);
Если КоличествоПериодов > 0 И НЕ ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(
Объект.Периодичность,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекущаяДатаСеанса(),
КоличествоПериодов);
Если Объект.Замещающий Тогда
Объект.НачалоПериодаЗамещения = Объект.НачалоПериода;
КонецЕсли;
КонецЕсли;
ПриЧтенииСозданииНаСервере();
Если ПараметрыВидаПлана.ЗаполнятьПоДефициту = Истина Тогда
Объект.КроссТаблица = Ложь;
ПереключитьПериодыВСтрокиНаСервере(Неопределено);
КонецЕсли;
ОбновитьСтраницуПолуфабрикаты(Истина);
УстановитьВидимость();
КонецЕсли;
ТекущийПользователь = Пользователи.ТекущийПользователь();
ЗаполнятьСпецификациюПоПериодам = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидПлана, "ЗаполнятьСпецификациюПоПериодам");
СохранитьНовыйПериодСервер();
Если ЗначениеЗаполнено(Объект.ПравилоЗаполнения) Тогда
Для Каждого Правило Из Объект.ПравилоЗаполнения Цикл
Если Правило.ОтборИзШапкиУстановлен Тогда
ОтборУстановлен = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
УстановитьУсловноеОформлениеКроссТаблицы();
ИмяДополнительнойКолонки = ФормированиеПечатныхФорм.ДополнительнаяКолонкаПечатныхФормДокументов().ИмяКолонки;
УстановитьДоступностьКомандБуфераОбмена();
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПриСозданииНаСервере(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
Справочники.Назначения.ФормаДокументаПриСозданииНаСервере(ЭтаФорма);
ПараметрыГиперссылки = РаботаСФайлами.ГиперссылкаФайлов();
ПараметрыГиперссылки.Размещение = "КоманднаяПанель";
РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыГиперссылки);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонтрольРассчетаПланаПроизводства();
Если Объект.Замещающий И КонтрольЗамещенияПланаНаСервере(Объект.Ссылка) Тогда
ПропуститьПроверкуЗапретаИзменения = Истина;
ЭтотОбъект.Записать();
ЭтотОбъект.Прочитать();
ПропуститьПроверкуЗапретаИзменения = Ложь;
КонецЕсли;
ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте();
ПланированиеКлиент.СпозиционироватьсяПоСтроке(ЭтаФорма, "ГруппаПродукция", "Продукция", "ПродукцияПоДатам");
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
РаботаСФайламиКлиент.ПриОткрытии(ЭтотОбъект, Отказ);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора.ИмяФормы = "Обработка.ПодборТоваровВДокументЗакупки.Форма.Форма" Тогда
ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
Планирование.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПланированиеКлиентСервер.СохранитьЗначенияПроверяемыхРеквизитов(Объект, ЭтаФорма, "РеквизитыДоИзменения");
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, Ложь, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана,, "КоличествоПериодов");
ПриЧтенииСозданииНаСервере();
Если ПараметрыВидаПлана.ЗаполнятьПоДефициту Тогда
Объект.КроссТаблица = Ложь;
ПереключитьПериодыВСтрокиНаСервере(Неопределено);
КонецЕсли;
СохранитьНовыйПериодСервер();
УстановитьВидимость();
ОбновитьСтраницуПолуфабрикаты(Истина);
ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ПланПроизводства.ФормаДокумента.Событие.ПередЗаписью");
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
Если Объект.Замещающий Тогда
ОбновитьНачалоПериодаЗамещения();
КонецЕсли;
ПараметрыЗаписи.Вставить("КэшированныеЗначения", КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
СкопироватьИзКроссТаблицы(ПараметрыЗаписи["КэшированныеЗначения"], ТекущийОбъект);
Планирование.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
Если ЗапуститьПолныйПересчет Тогда
ТекущийОбъект.ДополнительныеСвойства.Вставить("ПолныйПересчет", Истина);
КонецЕсли;
Если Объект.ЗаполнятьПоФормуле Тогда
ЗаписатьДополнительныеПараметры(ТекущийОбъект);
КонецЕсли;
Если ПропуститьПроверкуЗапретаИзменения Тогда
ТекущийОбъект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
КонецЕсли;
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
ЗаполнитьСлужебныеРеквизиты();
Если Объект.ЗаполнятьПоФормуле Тогда
ПрочитатьДополнительныеПараметры(ТекущийОбъект);
КонецЕсли;
УстановитьВидимость();
МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект, ПараметрыЗаписи);
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланПроизводства");
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "КопированиеСтрокВБуферОбмена" Тогда
УстановитьДоступностьКомандБуфераОбменаНаКлиенте();
ИначеЕсли ИмяСобытия = "РаботаСExcelКлиент_ЗагрузитьИзExcel"
И Параметр.УникальныйИдентификаторФормы = УникальныйИдентификатор Тогда
ЗагрузитьИзExcelНаКлиентеПродолжение(Параметр.ДанныеЗагрузки);
ИначеЕсли ИмяСобытия = "Запись_КорректировкаПлановыхПотребностей" Тогда
Если Параметр.Свойство("План")
И Параметр.План = Объект.Ссылка Тогда
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Перезаполнить'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отменить'"));
ТекстВопроса = НСтр("ru = 'Потребность в продукции изменилась, перезаполнить табличную часть?'");
Оповещение = Новый ОписаниеОповещения("СкорректироватьПотребностьЗавершение", ЭтотОбъект, Параметр);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
КонецЕсли;
КонецЕсли;
Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
РаботаСФайламиКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_ПланПроизводства", , Объект.Ссылка);
ТаймерКонтроляПересчетаДефецитов = 1;
ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте();
МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);
Если ОповещениеПослеЗаписи <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОповещениеПослеЗаписи, Истина);
ОповещениеПослеЗаписи = Неопределено;
КонецЕсли;
КонтрольРассчетаПланаПроизводства();
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
Если ЭтаФорма.Модифицированность Тогда
Если КонтрольЗамещенияПланаНаСервере(Объект.Ссылка) Тогда
ЭтотОбъект.Прочитать();
ЭтотОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
Если ТекущаяСтраница.Имя = "ГруппаДополнительно"
И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
СвойстваВыполнитьОтложеннуюИнициализацию();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
Если Объект.Замещающий
И (Объект.КроссТаблица И ПродукцияПоДатам.Количество() = 0
ИЛИ Не Объект.КроссТаблица И Объект.Продукция.Количество() = 0)
И Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаПродукция Тогда
ЗаполнитьДаннымиДляЗамещения();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СценарийПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("СценарийПриИзмененииЗавершение", ЭтотОбъект);
ПланированиеКлиент.ПоказатьВопросПриИзмененииСценария(ЭтаФорма, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура СценарийПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
СценарийПриИзмененииСервер();
КонецПроцедуры
&НаКлиенте
Процедура ВидПланаПриИзменении(Элемент)
Оповещение = Новый ОписаниеОповещения("ВидПланаПриИзмененииЗавершение", ЭтотОбъект);
ПланированиеКлиент.ПоказатьВопросПриИзмененииВидПлана(ЭтаФорма, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ВидПланаПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
ВидПланаПриИзмененииСервер(Истина);
КонецПроцедуры
&НаКлиенте
Процедура НачалоПериодаПриИзменении(Элемент)
Если Объект.ЗаполнятьПоДефициту Тогда
Объект.ОкончаниеПериода = Объект.НачалоПериода;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ПродукцияПоДатам", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОкончаниеПериодаПриИзменении(Элемент)
Если Объект.ЗаполнятьПоДефициту Тогда
Объект.НачалоПериода = Объект.ОкончаниеПериода;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ПродукцияПоДатам", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПодразделениеПриИзменении(Элемент)
ПодразделениеПриИзмененииНаСервере();
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НазначениеПриИзменении(Элемент)
НазначениеПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
Если Не ЗначениеЗаполнено(Объект.Статус) Тогда
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыПланов.Отменен");
КонецЕсли;
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЯчейкаОтмененаПриИзменении(Элемент)
УстановитьОтменуИКомментарийЯчейки();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеПриИзменении(Элемент)
УстановитьОтменуИКомментарийЯчейки();
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Оповещение = Новый ОписаниеОповещения("КомментарийКЯчейкеНачалоВыбораЗавершение", ЭтотОбъект);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru = 'Комментарий ячейки плана'"));
КонецПроцедуры
&НаКлиенте
Процедура ПланПроизводстваНеРассчитанЕстьОшибкиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если НавигационнаяСсылкаФорматированнойСтроки = "ПерейтиКОшибкамРасчета" Тогда
ПараметрыФормы = ПараметрыПереходаКОшибкамРасчетаПланаПроизводства(Объект.Ссылка);
ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации", ПараметрыФормы);
ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ПовторитьРасчет" Тогда
ЗапуститьПолныйПересчетПланаПроизводства();
КонтрольРассчетаПланаПроизводства();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИнформационныйТекстОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура НадписьЕстьОтмененныеКорректировкиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
МассивНепроверяемыхРеквизитов.Добавить("ПродукцияПоДатам");
Если Объект.КроссТаблица Тогда
ПроверятьСпецификацию = ЗаполнятьСпецификацию И Объект.Статус = Перечисления.СтатусыПланов.Утвержден;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПредставлениеТаблицы", ЗаголовокТабличнойЧасти(Объект.ТипПроизводственногоПроцесса));
СтруктураДействий.Вставить("ПутьКТаблице","ПродукцияПоДатам");
СтруктураДействий.Вставить("ЗаполнятьНоменклатуру");
СтруктураДействий.Вставить("ЗаполнятьСпецификацию", ПроверятьСпецификацию);
СтруктураДействий.Вставить("ЗаполнятьХарактеристикуВТЧ");
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("Периоды", ЭтотОбъект["Периоды"].Выгрузить(Новый Структура("Активная", Истина)));
ПараметрыПроверки.Вставить("ПрефиксПоля", "Количество_");
ПараметрыПроверки.Вставить("ИмяПоля", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПроверкаКоличестваПоПериодам", ПараметрыПроверки);
СтруктураДействий.Вставить("ПоляГруппировки", "Номенклатура, Характеристика, Назначение, Упаковка, Спецификация, Полуфабрикат");
Планирование.ОбработкаПроверкиЗаполненияВФорме(ПродукцияПоДатам, СтруктураДействий, Отказ, ПроверяемыеРеквизиты, Объект.КроссТаблица);
КонецЕсли;
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты,МассивНепроверяемыхРеквизитов);
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
КонецПроцедуры
&НаКлиенте
Процедура СпособРасчетаПотребностейВМатериалахПриИзменении(Элемент)
Если НЕ Объект.КроссТаблица Тогда
ЗаполнитьДатыЗапускаПродукции();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыПродукция
&НаКлиенте
Процедура ПродукцияПриИзменении(Элемент)
Объект.ЗаполненоАвтоматически = Ложь;
ТоварыКоличествоСтрок = Объект.Продукция.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Продукция, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ТоварыКоличествоСтрок = Объект.Продукция.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПередУдалением(Элемент, Отказ)
Если Объект.ЗаполнятьПоДефициту Тогда
Отказ = Истина;
ОписаниеОповещение = Новый ОписаниеОповещения("ПродукцияПередУдалениемЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Количество к обеспечению будет скорректировано. Продолжить?'"),
РежимДиалогаВопрос.ДаНет,
,
КодВозвратаДиалога.Да);
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПередУдалениемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ВыделенныеСтроки = Элементы.Продукция.ВыделенныеСтроки;
Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
ВыделеннаяСтрока = Объект.Продукция.НайтиПоИдентификатору(ИдентификаторСтроки);
ВыделеннаяСтрока.Количество = 0;
ВыделеннаяСтрока.КоличествоУпаковок = 0;
ВыделеннаяСтрока.ЗаданИнтервалПотребности = Истина;
ВыделеннаяСтрока.ИнтервалПотребностиОт = 0;
ВыделеннаяСтрока.ИнтервалПотребностиДо = 0;
КонецЦикла
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПослеУдаления(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
ЕстьПолуфабрикаты = Объект.Продукция.НайтиСтроки(Новый Структура("Полуфабрикат", Истина)).Количество() > 0;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияДатаВыпускаПриИзменении(Элемент)
ТекущиеДанные = Элементы.Продукция.ТекущиеДанные;
ПродукцияДатаВыпускаПриИзмененииНаСервере(Элементы.Продукция.ТекущаяСтрока, КэшированныеЗначения);
Если Объект.Замещающий
И Объект.Проведен
И ЗамещенныеПериоды.Количество() > 0 Тогда
Если ТекущиеДанные.Полуфабрикат Тогда
ДатаВыпускаНачалоПериода = ПланированиеКлиентСерверПовтИсп.РассчитатьДатуНачалаПериода(ТекущиеДанные.ДатаВыпускаПродукцииПолуфабриката, Объект.Периодичность);
Иначе
ДатаВыпускаНачалоПериода = ПланированиеКлиентСерверПовтИсп.РассчитатьДатуНачалаПериода(ТекущиеДанные.ДатаВыпуска, Объект.Периодичность);
КонецЕсли;
Отбор = Новый Структура("ЗамещенныйПериод", ДатаВыпускаНачалоПериода);
ЗамещенныйПериодСтроки = ЗамещенныеПериоды.НайтиСтроки(Отбор);
Если ЗамещенныйПериодСтроки.Количество() > 0 Тогда
ТекущиеДанные.Замещен = ЗамещенныйПериодСтроки[0].Замещен;
ТекущиеДанные.ЗамещенКЗаказу = ЗамещенныйПериодСтроки[0].ЗамещенКЗаказу;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПланПроизводстваПрисоединенныеФайлы") Тогда
ЗагрузитьИзExcelНаКлиенте(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПриАктивизацииСтроки(Элемент)
Если Не Объект.ЗаполнятьПоФормуле И Элементы.Продукция.ВыделенныеСтроки.Количество() > 0 Тогда
ВГраница = Элементы.Продукция.ВыделенныеСтроки.ВГраница();
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(Объект.Продукция.НайтиПоИдентификатору(Элементы.Продукция.ВыделенныеСтроки[ВГраница]));
Иначе
Расшифровка = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
ПродукцияНоменклатураПриИзмененииНаСервере(Элементы.Продукция.ТекущаяСтрока, КэшированныеЗначения);
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияХарактеристикаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
ПродукцияХарактеристикаПриИзмененииНаСервере(Элементы.Продукция.ТекущаяСтрока, КэшированныеЗначения);
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияКоличествоУпаковокПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
Если ТекущаяСтрока.Свойство("Отклонение") И ЗначениеЗаполнено(ТекущаяСтрока.Формула) Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(ТекущаяСтрока.Формула, ТекущаяСтрока, Неопределено, Неопределено);
ТекущаяСтрока.Отклонение = РезультатВычисления.Результат - ТекущаяСтрока.КоличествоУпаковок;
КонецЕсли;
ТекущаяСтрока.Расшифровка = Строка(ТекущаяСтрока.КоличествоУпаковок);
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущаяСтрока);
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияКомментарийПриИзменении(Элемент)
Элементы.Продукция.ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(Элементы.Продукция.ТекущиеДанные.Комментарий);
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияКомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока", Элементы.Продукция.ТекущаяСтрока);
Оповещение = Новый ОписаниеОповещения("ПродукцияКомментарийНачалоВыбораЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
Элемент.ТекстРедактирования,
НСтр("ru = 'Комментарий ячейки плана'"));
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияКомментарийНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Объект.Продукция.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
ТекущиеДанные.Комментарий = ВведенныйТекст;
ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(ВведенныйТекст);
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияОтмененоПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияСпецификацияПриИзменении(Элемент)
ТекущиеДанные = Элементы.Продукция.ТекущиеДанные;
Если НЕ ТекущиеДанные.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
РассчитатьДатуЗапускаПродукции(ЭтотОбъект, ТекущиеДанные);
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияНазначениеПриИзменении(Элемент)
ПродукцияНазначениеПриИзмененииНаСервере(Элементы.Продукция.ТекущаяСтрока, КэшированныеЗначения);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыПродукцияПоДатам
&НаКлиенте
Процедура ПродукцияПоДатамПриИзменении(Элемент)
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ПродукцияПоДатам");
Объект.ЗаполненоАвтоматически = Ложь;
ТоварыКоличествоСтрок = ПродукцияПоДатам.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ТоварыКоличествоСтрок = ПродукцияПоДатам.Количество();
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамПередУдалением(Элемент, Отказ)
ВыделенныеСтроки = Элементы.ПродукцияПоДатам.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = ПродукцияПоДатам.НайтиПоИдентификатору(ВыделеннаяСтрока);
Если СтрокаТЧ.Полуфабрикат Тогда
Отбор = Новый Структура("Номенклатура, Характеристика, Назначение, Спецификация");
ЗаполнитьЗначенияСвойств(Отбор, СтрокаТЧ);
СтрокиКУдалению = ВсеПолуфабрикатыПоДатам.НайтиСтроки(Отбор);
Для Каждого СтрокаКУдалению Из СтрокиКУдалению Цикл
ВсеПолуфабрикатыПоДатам.Удалить(СтрокаКУдалению);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамПослеУдаления(Элемент)
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
ЕстьПолуфабрикаты = ПродукцияПоДатам.НайтиСтроки(Новый Структура("Полуфабрикат", Истина)).Количество() > 0;
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ПродукцияПоДатам");
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПланПроизводстваПрисоединенныеФайлы") Тогда
ЗагрузитьИзExcelНаКлиенте(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Элементы.ПродукцияПоДатам.ТекущиеДанные.Полуфабрикат
И Поле.Имя <> "ПродукцияПоДатамСпецификация" Тогда
Отбор = Новый Структура("Номенклатура, Характеристика, Назначение, Спецификация");
ЗаполнитьЗначенияСвойств(Отбор, Элементы.ПродукцияПоДатам.ТекущиеДанные);
ПродукцияПоДатамВыборНаСервере(Отбор);
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
Если Копирование И Элемент.ТекущиеДанные.Полуфабрикат Тогда
НоваяСтрока = ВсеПолуфабрикатыПоДатам.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Элемент.ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамПередНачаломИзменения(Элемент, Отказ)
Если Элементы.ПродукцияПоДатам.ТекущиеДанные.Полуфабрикат
И Элемент.ТекущийЭлемент.Имя <> "ПродукцияПоДатамСпецификация" Тогда
Отбор = Новый Структура("Номенклатура, Характеристика, Назначение, Спецификация");
ЗаполнитьЗначенияСвойств(Отбор, Элементы.ПродукцияПоДатам.ТекущиеДанные);
ПродукцияПоДатамВыборНаСервере(Отбор);
Отказ = Истина;
Иначе
СпецификацияПолуфабрикатаДоИзменения = Элементы.ПродукцияПоДатам.ТекущиеДанные.Спецификация;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ПродукцияПоДатам.ТекущиеДанные;
ПродукцияНоменклатураПриИзмененииНаСервере(Элементы.ПродукцияПоДатам.ТекущаяСтрока, КэшированныеЗначения);
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамХарактеристикаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ПродукцияПоДатам.ТекущиеДанные;
ПродукцияХарактеристикаПриИзмененииНаСервере(Элементы.ПродукцияПоДатам.ТекущаяСтрока, КэшированныеЗначения);
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ПродукцияПоДатам.ТекущиеДанные;
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамСпецификацияПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ПродукцияПоДатам.ТекущиеДанные;
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
Иначе
Отбор = Новый Структура("Номенклатура, Характеристика, Назначение, Спецификация");
ЗаполнитьЗначенияСвойств(Отбор, ТекущаяСтрока);
СтрокиПолуфабрикатов = ПродукцияПоДатам.НайтиСтроки(Отбор);
Если СтрокиПолуфабрикатов.Количество() > 1 Тогда
СтрокаПолуфабрикат = СтрокиПолуфабрикатов[0];
Если СтрокаПолуфабрикат = ТекущаяСтрока Тогда
СтрокаПолуфабрикат = СтрокиПолуфабрикатов[1];
КонецЕсли;
Для каждого СтрокаПериода Из ЭтаФорма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаПолуфабрикат["Количество_" + СтрокаПериода.ИмяКолонки] = СтрокаПолуфабрикат["Количество_" + СтрокаПериода.ИмяКолонки] +
ТекущаяСтрока["Количество_" + СтрокаПериода.ИмяКолонки];
СтрокаПолуфабрикат.Количество = СтрокаПолуфабрикат.Количество + ТекущаяСтрока["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
СтрокаПолуфабрикат.КоличествоУпаковок = СтрокаПолуфабрикат.Количество;
ПродукцияПоДатам.Удалить(ТекущаяСтрока);
КонецЕсли;
Отбор.Вставить("Спецификация", СпецификацияПолуфабрикатаДоИзменения);
СтрокиПолуфабрикатов = ВсеПолуфабрикатыПоДатам.НайтиСтроки(Отбор);
Для Каждого СтрокаПолуфабрикатов Из СтрокиПолуфабрикатов Цикл
СтрокаПолуфабрикатов.Спецификация = ТекущаяСтрока.Спецификация;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамНазначениеПриИзменении(Элемент)
ПродукцияНазначениеПриИзмененииНаСервере(Элементы.ПродукцияПоДатам.ТекущаяСтрока, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииКоличества(Элемент)
Если Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПолуфабрикатыКроссТаблица Тогда
СтрокаТоваров = Элементы.ПолуфабрикатыПоДатам.ТекущиеДанные;
Иначе
СтрокаТоваров = Элементы.ПродукцияПоДатам.ТекущиеДанные;
КонецЕсли;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
Если Объект.ЗаполнятьПоФормуле Тогда
ПриИзмененииКоличестваОтклонение(СтрокаТоваров);
КонецЕсли;
Если НЕ СтрокаТоваров.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
Если НЕ Объект.ЗаполнятьПоФормуле Тогда
ТекущееИмяКолонки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Элемент.Имя, "ПродукцияПоДатам" + "Количество_")[1];
СтрокаТоваров["Расшифровка_" + ТекущееИмяКолонки] = Строка(СтрокаТоваров["Количество_" + ТекущееИмяКолонки]);
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(СтрокаТоваров, "Расшифровка_" + ТекущееИмяКолонки);
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииОтменено(Элемент)
ТекущаяСтрока = Элементы.ПродукцияПоДатам.ТекущиеДанные;
Если НЕ ТекущаяСтрока.Полуфабрикат Тогда
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Истина);
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииКомментария(Элемент)
ТекущиеДанные = Элементы.ПродукцияПоДатам.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И Элементы.ПродукцияПоДатам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ПродукцияПоДатам.ТекущийЭлемент.Имя = "ПродукцияПоДатам" + "Комментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ТекущиеДанные["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(КомментарийКЯчейке);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_НачалоВыбораКомментария(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТекущиеДанные = Элементы.ПродукцияПоДатам.ТекущиеДанные;
СтандартнаяОбработка = Ложь;
Если ТекущиеДанные <> Неопределено И Элементы.ПродукцияПоДатам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Элементы.ПродукцияПоДатам.ТекущийЭлемент.Имя = "ПродукцияПоДатам" + "Комментарий_"+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
ДополнительныеПараметры = Новый Структура("ТекущаяСтрока, ИмяКолонки",
Элементы.ПродукцияПоДатам.ТекущаяСтрока,
Период.ИмяКолонки);
Оповещение = Новый ОписаниеОповещения("Подключаемый_НачалоВыбораКомментарияЗавершение",
ЭтотОбъект,
ДополнительныеПараметры);
ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
Оповещение,
КомментарийКЯчейке,
НСтр("ru = 'Комментарий ячейки плана'"));
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_НачалоВыбораКомментарияЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
Если Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПолуфабрикатыКроссТаблица Тогда
ТекущиеДанные = ПолуфабрикатыПоДатам.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
Иначе
ТекущиеДанные = ПродукцияПоДатам.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
КонецЕсли;
ТекущиеДанные["Комментарий_"+ ДополнительныеПараметры.ИмяКолонки] = ВведенныйТекст;
ТекущиеДанные["КартинкаКомментарий_"+ ДополнительныеПараметры.ИмяКолонки] = ЗначениеЗаполнено(ТекущиеДанные["Комментарий_"+ ДополнительныеПараметры.ИмяКолонки]);
Модифицированность = Истина;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыПолуфабрикаты
&НаКлиенте
Процедура СписокПолуфабрикатовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура СписокПолуфабрикатовПередНачаломИзменения(Элемент, Отказ)
Отказ = Истина;
КонецПроцедуры
&НаКлиенте
Процедура СписокПолуфабрикатовОбновить(Команда)
ОбновитьСтраницуПолуфабрикаты();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПроверкаПеретаскивания(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПеретаскивание(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраНажатие(Элемент, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраНажатие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПодобратьТовары(Команда)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ПланПроизводства.ФормаДокумента.Команда.ПодобратьТовары");
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимПодбораБезСуммовыхПараметров", Истина);
ПараметрыФормы.Вставить("СкрыватьКолонкуВидЦены", Истина);
ПараметрыФормы.Вставить("СкрыватьКомандуЦеныНоменклатуры", Истина);
ПараметрыФормы.Вставить("ОстаткиПоВсемСкладам", Истина);
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Подбор товаров'"));
ПараметрыФормы.Вставить("Дата", Объект.Дата);
ПараметрыФормы.Вставить("Документ", Объект.Ссылка);
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТареУслугеРаботе(Ложь));
ПараметрыФормы.Вставить("СкрыватьРучныеСкидки", Истина);
ОткрытьФорму("Обработка.ПодборТоваровВДокументЗакупки.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтбору(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ДобавитьТоварыПоОтборуНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура НастроитьИЗаполнитьПоПравилуЗаполнения(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбновитьДополнить", Объект.ОбновитьДополнить);
ПараметрыФормы.Вставить("АдресПравилаЗаполнения", АдресПравилаЗаполнения);
ПараметрыФормы.Вставить("ИзменитьРезультатНа", Объект.ИзменитьРезультатНа);
ПараметрыФормы.Вставить("ТочностьОкругления", Объект.ТочностьОкругления);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыФормы.Вставить("АдресПользовательскихНастроек", АдресПользовательскихНастроек);
ПараметрыФормы.Вставить("ТолькоПросмотр", ЭтаФорма.ТолькоПросмотр);
ПараметрыФормы.Вставить("КоличествоПериодов", КоличествоПериодов);
ПараметрыФормы.Вставить("Отбор", ПланированиеКлиентСервер.ОтборДляВыборки(ПараметрыОтбора(ЭтотОбъект), ПараметрыВидаПлана(ЭтотОбъект)));
ПараметрыФормы.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
Оповещение = Новый ОписаниеОповещения("НастроитьИЗаполнитьПоПравилуЗаполненияЗавершение", ЭтотОбъект);
ОткрытьФорму("Справочник.ИсточникиДанныхПланирования.Форма.ФормаЗаполнения",
ПараметрыФормы,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоПравилуЗаполнения(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполнятьПоПравилу", Истина);
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиДокумент(Команда)
ОбщегоНазначенияУТКлиент.Провести(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтроку(Команда)
ТаблицаФормы = Элементы.Продукция;
ДанныеТаблицы = Объект.Продукция;
Оповещение = Новый ОписаниеОповещения("РазбитьСтрокуЗавершение", ЭтотОбъект);
РаботаСТабличнымиЧастямиКлиент.РазбитьСтроку(ДанныеТаблицы, ТаблицаФормы, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтрокуЗавершение(НоваяСтрока, ДополнительныеПараметры) Экспорт
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
Если НоваяСтрока <> Неопределено Тогда
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, КэшированныеЗначения);
ТекущаяСтрока.Расшифровка = "";
НоваяСтрока.Расшифровка = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВставитьСтроки(Команда)
Если Объект.КроссТаблица Тогда
ОписаниеОповещение = Новый ОписаниеОповещения("ПереключитьПериодыВСтрокиЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Копирование и вставка строк возможны в режиме ""Периоды в строках"". Переключить режим?'"),
РежимДиалогаВопрос.ДаНет);
Возврат;
Иначе
КоличествоТоваровДоВставки = Объект.Продукция.Количество();
ПолучитьСтрокиИзБуфераОбмена();
КоличествоВставленных = Объект.Продукция.Количество()-КоличествоТоваровДоВставки;
РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОВставкеСтрок(КоличествоВставленных);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьСтроки(Команда)
Если Объект.КроссТаблица Тогда
ОписаниеОповещение = Новый ОписаниеОповещения("ПереключитьПериодыВСтрокиЗавершение", ЭтотОбъект);
ПоказатьВопрос(
ОписаниеОповещение,
НСтр("ru = 'Копирование и вставка строк возможны в режиме ""Периоды в строках"". Переключить режим?'"),
РежимДиалогаВопрос.ДаНет);
Возврат;
Иначе
ТаблицаФормы = Элементы.Продукция;
КонецЕсли;
Если РаботаСТабличнымиЧастямиКлиент.ВыбранаСтрокаДляВыполненияКоманды(ТаблицаФормы) Тогда
СкопироватьСтрокиНаСервере();
РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОКопированииСтрок(ТаблицаФормы.ВыделенныеСтроки.Количество());
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИнтервал(Команда)
Оповещение = Новый ОписаниеОповещения(
"УстановитьИнтервалЗавершение",
ЭтотОбъект);
ОбщегоНазначенияУТКлиент.РедактироватьПериод(
Объект,
Новый Структура("ДатаНачала, ДатаОкончания", "НачалоПериода", "ОкончаниеПериода"),
Оповещение);
КонецПроцедуры
#Область ЗагрузкаДанныхИзФайла
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
ДополнительныеПараметры = ПланированиеКлиент.ДополнительныеПараметрыЗагрузкиИзФайла();
ДополнительныеПараметры.ТипПлана = "ПланПроизводства";
ДополнительныеПараметры.ИспользуютсяНазначения = ЗаполнятьНазначениеВТЧ;
ДополнительныеПараметры.ИспользуютсяДатыВыпуска = НЕ ЭтоРазборка;
ДополнительныеПараметры.ИспользуютсяСпецификации = ЗаполнятьСпецификацию;
ДополнительныеПараметры.ИспользуютсяДатыВыпускаПродукцииПолуфабриката = ЗаполнятьСпецификацию
И НЕ ПланироватьПолуфабрикатыАвтоматически
И УправлениеПредприятием
И НЕ ЭтоРазборка;
Если Объект.КроссТаблица Тогда
ДополнительныеПараметры.КроссТаблица = Истина;
ДополнительныеПараметры.Периоды = ЭтотОбъект["Периоды"];
КонецЕсли;
ПоказатьФормуЗагрузкиИзФайла(ДополнительныеПараметры);
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
РаботаСExcelКлиент.ВыгрузитьВExcel(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
РаботаСExcelКлиент.ВыбратьПрисоединенныйФайлExcel(ЭтаФорма, ?(Объект.КроссТаблица, "ПродукцияПоДатам", "Продукция"));
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВКолонки(Команда)
Если НЕ Объект.КроссТаблица Тогда
Отказ = Ложь;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("ИмяТЧ", "Продукция");
ПараметрыПроверки.Вставить("ПредставлениеТЧ", ЗаголовокТабличнойЧасти(Объект.ТипПроизводственногоПроцесса));
ПараметрыПроверки.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПроверки.Вставить("ДатаНачала", Объект.НачалоПериода);
ПараметрыПроверки.Вставить("ДатаОкончания", Объект.ОкончаниеПериода);
ПараметрыПроверки.Вставить("ИмяПоляДатыПериода", ?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска"));
ПараметрыПроверки.Вставить("ПредставлениеДатыПериода", ?(ЭтоРазборка, НСтр("ru = 'Дата запуска'"), НСтр("ru = 'Дата выпуска'")));
ПараметрыПроверки.Вставить("ПрефиксПутиКТЧ", "Объект.");
ПланированиеКлиентСервер.ПроверитьДатуПериодаТЧ(Объект, Отказ, ПараметрыПроверки);
Если Отказ Тогда
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Удалить строки'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отменить'"));
ТекстВопроса = СтрШаблон(
НСтр("ru = 'В строках списка ""%1"" указаны даты за границами планирования - строки будут удалены. Удалить строки?'"),
ЗаголовокТабличнойЧасти(Объект.ТипПроизводственногоПроцесса));
Оповещение = Новый ОписаниеОповещения("ПереключитьПериодыВКолонкиЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
Возврат;
КонецЕсли;
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВСтроки(Команда)
ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения)
Если Объект.КроссТаблица Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
Объект.КроссТаблица = Ложь;
ЗаполнитьСлужебныеРеквизиты();
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
ПрочитатьУстановитьПараметрыВыбораСпецификаций();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПродукцию(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Если ЗапретитьРедактированиеФормулы Тогда
НастроитьФормулуИЗаполнить(СтруктураНастроек, Неопределено);
Возврат;
КонецЕсли;
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланПроизводства");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ТипПлана", ТипПлана);
ПараметрыФормы.Вставить("НачалоПериодаПлан", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериодаПлан", Объект.ОкончаниеПериода);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("АдресХранилищаДереваОператоров", АдресХранилищаДереваОператоров);
ПараметрыФормы.Вставить("ДополнительныеПоля", ДополнительныеПоля);
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
ПараметрыФормы.Вставить("Владелец", Объект.Ссылка);
ПараметрыФормы.Вставить("Отбор", ОтборПоказатели);
ОписаниеОповещения = Новый ОписаниеОповещения("НастроитьФормулуИЗаполнить",ЭтотОбъект);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("Справочник.ВидыПланов.Форма.ФормаНастроек", Новый Структура("СтруктураНастроек",ПараметрыФормы), ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоДефицитам(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ЗаполнитьПланыПоДефицитуНаСервере(КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура НадписьПерепланироватьПоДефицитуОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Модифицированность = Истина;
ЗаполнитьПоДефицитам(Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоказатели(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Если ЗаполнятьПоДефициту Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("НачалоПериодаПлан", Объект.НачалоПериода);
ПараметрыФормы.Вставить("ОкончаниеПериодаПлан", Объект.ОкончаниеПериода);
ПараметрыФормы.Вставить("Периодичность", Объект.Периодичность);
ПараметрыФормы.Вставить("СтруктураНастроек", ДополнительныеНастройки(СтруктураНастроек));
ПараметрыФормы.Вставить("Владелец", Объект.Ссылка);
Если СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыеНачальныеОстатки")<>0
Или СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыеКонечныеОстатки")<>0
Или СтрНайти(ПараметрыФормы.СтруктураНастроек.Формула , "ПланируемыйКонечныйДефицит")<>0 Тогда
НастроитьСмещениеИЗаполнить(ПараметрыФормы.СтруктураНастроек, Неопределено);
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("НастроитьСмещениеИЗаполнить", ЭтотОбъект);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("Справочник.ВидыПланов.Форма.ФормаНастроекСмещения", Новый Структура("СтруктураНастроек",ПараметрыФормы), ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПересчитатьПотребностиПланаПроизводства(Команда)
Если НЕ ЗаполнятьСпецификацию Тогда
ПоказатьПредупреждение(,НСтр("ru = 'Для использования расчета потребностей в материалах, видах РЦ и трудовых ресурсах необходимо включить соответствующую настройку в ""Сценарии"".'"));
Возврат;
КонецЕсли;
Если Объект.Проведен И Не Модифицированность Тогда
ЗапуститьПолныйПересчетПланаПроизводства();
КонтрольРассчетаПланаПроизводства();
Иначе
Оповещение = Новый ОписаниеОповещения("ПровестиИПересчитатьПотребностиЗавершение", ЭтотОбъект);
Кнопки = Новый СписокЗначений();
ТекстВопроса = НСтр("ru = 'Для пересчета потребностей документ должен быть проведен! Провести?'");
Кнопки.Добавить(КодВозвратаДиалога.Да,НСтр("ru = 'Провести'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена,НСтр("ru = 'Отмена'"));
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РаспределитьКоличество(Команда)
АдресХранилищаРаспределение = ПоместитьПродукциюВХранилище();
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("АдресХранилищаРаспределение", АдресХранилищаРаспределение);
ПараметрыФормы.Вставить("КоличествоПериодов", КоличествоПериодов);
ОписаниеОповещения = Новый ОписаниеОповещения("РаспределениеКоличестваЗавершение", ЭтотОбъект);
ОткрытьФорму("Документ.ПланПроизводства.Форма.РаспределениеКоличества", ПараметрыФормы, ЭтотОбъект,,,,ОписаниеОповещения,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьНаПроцент(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ИзменитьНаПроцентЗавершение", ЭтотОбъект);
ПланированиеКлиент.ИзменитьФормулуНаПроцент(
ЭтаФорма,
?(Объект.КроссТаблица, ПродукцияПоДатам, Объект.Продукция),
?(Объект.КроссТаблица, "ПродукцияПоДатам", "Продукция"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОкруглитьКоличество(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ОкруглитьКоличествоЗавершение", ЭтотОбъект);
ПланированиеКлиент.ОкруглитьФормулу(
ЭтаФорма,
?(Объект.КроссТаблица, ПродукцияПоДатам, Объект.Продукция),
?(Объект.КроссТаблица, "ПродукцияПоДатам", "Продукция"),
Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьПроизвольнуюФормулу(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
Для каждого Период Из АктивныеПериоды Цикл
ДополнительныеПараметры = Новый Структура("ИмяКолонки",Период.ИмяКолонки);
Если Объект.КроссТаблица И АктивныеПериоды.Количество() > 1 Тогда
Если Элементы.ПродукцияПоДатам.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущийЭлементИмя = Элементы.ПродукцияПоДатам.ТекущийЭлемент.Имя;
Если СтрНайти(ТекущийЭлементИмя, "ПродукцияПоДатам" + "Количество_") = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Активируйте колонку с периодом'"));
Возврат;
КонецЕсли;
Если ТекущийЭлементИмя = "ПродукцияПоДатам" + "Количество_"+Период.ИмяКолонки Тогда
ТекстВопроса = НСтр("ru = 'Установить формулу для всех периодов?'");
СписокКнопок = Новый СписокЗначений;
СписокКнопок.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Да, для всех'"));
СписокКнопок.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Только'") + " " + Период.Заголовок);
СписокКнопок.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВопросаЗадатьПроизвольнуюФормулу",
ЭтотОбъект,
ДополнительныеПараметры);
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, СписокКнопок);
КонецЕсли;
Иначе
Если (Объект.КроссТаблица И Элементы.ПродукцияПоДатам.ТекущиеДанные = Неопределено)
ИЛИ (Не Объект.КроссТаблица И Элементы.Продукция.ТекущиеДанные = Неопределено) Тогда
Возврат;
КонецЕсли;
ПослеВопросаЗадатьПроизвольнуюФормулу(КодВозвратаДиалога.Нет, ДополнительныеПараметры);
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьФлагОтменыСтрокПлана(Команда)
Оповещение = Новый ОписаниеОповещения("ИзменитьФлагОтменыСтрокПланаЗавершение", ЭтотОбъект);
Если Объект.КроссТаблица Тогда
Если Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПолуфабрикатыКроссТаблица Тогда
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, ПолуфабрикатыПоДатам, "ПолуфабрикатыПоДатам", Оповещение);
Иначе
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, ПродукцияПоДатам, "ПродукцияПоДатам", Оповещение);
КонецЕсли;
Иначе
ПланированиеКлиент.ИзменитьФлагОтменыСтрокПлана(ЭтаФорма, Объект.Продукция, "Продукция", Оповещение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
ОбщегоНазначенияУТКлиент.Записать(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ЗапланироватьПолуфабрикаты(Команда)
Если ЕстьПолуфабрикаты Тогда
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Продолжить'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена);
Оповещение = Новый ОписаниеОповещения("ЗапланироватьПолуфабрикатыЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, НСтр("ru = 'Все полуфабрикаты будут перепланированы. Продолжить?'"), Кнопки);
Возврат;
КонецЕсли;
ЗапланироватьПолуфабрикатыНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура УдалитьПолуфабрикаты(Команда)
УдалитьПолуфабрикатыНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура УдалитьПустыеСтроки(Команда)
УдалитьПустыеСтрокиНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура СписокПолуфабрикатовИзменить(Команда)
Отказ = Истина;
КонецПроцедуры
&НаКлиенте
Процедура СписокПолуфабрикатовПоказатьВхождения(Команда)
Возврат;
КонецПроцедуры
&НаКлиенте
Процедура НазадКПродукции(Команда)
НазадКПродукцииНаСервере();
КонецПроцедуры
#Область Аналоги
&НаКлиенте
Процедура ПодобратьАналоги(Команда)
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Возврат;
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура ЗаполнитьСпецификацию(Команда)
ОписаниеТаблицы = ОписаниеТаблицыПродукции(ЭтаФорма);
ВыделенныеСтроки = Элементы[ОписаниеТаблицы.ИмяТЧ].ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 0 Тогда
ПоказатьПредупреждение( ,НСтр("ru = 'В таблице отсутствуют выделенные строки. Выделите строки для заполнения реквизита ""Спецификация""'"));
Возврат;
КонецЕсли;
ЗаполнитьСпецификациюВСтрокахПродукции(ВыделенныеСтроки);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьНазначениеПоЗначению(Команда)
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ПродукцияПоДатам.ВыделенныеСтроки,Элементы.Продукция.ВыделенныеСтроки);
ТаблицаТовары = ?(Объект.КроссТаблица, ПродукцияПоДатам, Объект.Продукция);
СтруктураОтбора = Новый Структура("ЭтоГруппа", Ложь);
СтруктураПараметров = Новый Структура("Отбор, ВыборГруппИЭлементов", СтруктураОтбора, ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму(
"Справочник.Назначения.ФормаВыбора",
СтруктураПараметров,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Новый ОписаниеОповещения("ЗаполнитьПоЗначениюЗавершение",
ПланированиеКлиент,
Новый Структура("ВыделенныеСтроки, ТаблицаТовары, Колонка", ВыделенныеСтроки, ТаблицаТовары, "Назначение")),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ПроцедурыДинамическогоФормированияСтруктурыФормы
&НаКлиенте
Процедура ПриИзмененииПериодовНаКлиенте(Результат, ДополнительныеПараметры) Экспорт
ПриИзмененииПериодовНаСервере(,Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПровестиИПересчитатьПотребностиЗавершение(ОтветНаВопрос, ДополнительныеПараметры) Экспорт
Если ОтветНаВопрос = КодВозвратаДиалога.Да Тогда
ЗапуститьПолныйПересчет = Истина;
ОбщегоНазначенияУТКлиент.Провести(ЭтаФорма);
ЗапуститьПолныйПересчет = Ложь;
КонтрольРассчетаПланаПроизводства();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗапуститьПолныйПересчетПланаПроизводства()
Документы.ПланПроизводства.ПересчитатьПланПроизводства(Объект.Ссылка, Истина);
ЭтаФорма.Прочитать();
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВКолонкиЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ОчиститьСообщения();
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПериодыВСтрокиЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ПереключитьПериодыВСтроки(Неопределено);
КонецПроцедуры
&НаСервере
Процедура ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения)
Объект.КроссТаблица = Истина;
ПриИзмененииПериодовНаСервере();
СкопироватьВКроссТаблицу(КэшированныеЗначения);
ПрочитатьУстановитьПараметрыВыбораСпецификаций();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПометкуКроссТаблицы(Форма)
Если Форма.Объект.КроссТаблица Тогда
Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Истина;
Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Ложь;
Форма.Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаПродукцияКроссТаблица;
Иначе
Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Ложь;
Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Истина;
Форма.Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаПродукцияТаблица;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ПриИзмененииРеквизитов
&НаСервере
Процедура ПодразделениеПриИзмененииНаСервере()
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура НазначениеПриИзмененииНаСервере()
Если Объект.Замещающий Тогда
ПриИзмененииПериодовНаСервере();
КонецЕсли;
НаправлениеДеятельности = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Назначение, "НаправлениеДеятельности");
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий)
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц", Новый Структура("НужноОкруглять", Ложь));
КонецПроцедуры
#Область ПодборыИОбработкаПроверкиКоличества
&НаСервере
Процедура ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, ВыбранноеЗначение)
Если НЕ ЭтоАдресВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище) Тогда
Возврат;
КонецЕсли;
ПолучитьЗагруженныеТоварыИзХранилища(ВыбранноеЗначение.АдресТоваровВХранилище, КэшированныеЗначения);
КонецПроцедуры
#КонецОбласти
&НаСервере
Процедура ПродукцияНоменклатураПриИзмененииНаСервере(ИдентификаторСтроки, КэшированныеЗначения)
ОписаниеТаблицы = ОписаниеТаблицыПродукции(ЭтаФорма);
ТекущаяСтрока = ОписаниеТаблицы.ТЧ.НайтиПоИдентификатору(ИдентификаторСтроки);
СпецификацияДоИзменения = ТекущаяСтрока.Спецификация;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ИмяФормы, ОписаниеТаблицы.ИмяТЧ));
ПараметрыЗаполнения = УправлениеДаннымиОбИзделияхКлиентСервер.ПараметрыДействияПроверитьЗаполнитьСпецификацию(
Объект, ТекущаяСтрока, ПараметрыВыбораСпецификаций, ЭтаФорма, Новый Структура("КлючПутейКДанным", ОписаниеТаблицы.ПутьКДанным));
СтруктураДействий.Вставить("ПроверитьЗаполнитьСпецификацию", ПараметрыЗаполнения);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект,ТекущаяСтрока);
Если СпецификацияДоИзменения <> ТекущаяСтрока.Спецификация
И НЕ Объект.КроссТаблица Тогда
РассчитатьДатуЗапускаПродукции(ЭтотОбъект, ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПродукцияХарактеристикаПриИзмененииНаСервере(ИдентификаторСтроки, КэшированныеЗначения)
ОписаниеТаблицы = ОписаниеТаблицыПродукции(ЭтаФорма);
ТекущаяСтрока = ОписаниеТаблицы.ТЧ.НайтиПоИдентификатору(ИдентификаторСтроки);
СпецификацияДоИзменения = ТекущаяСтрока.Спецификация;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ХарактеристикаПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ИмяФормы, ОписаниеТаблицы.ИмяТЧ));
ПараметрыЗаполнения = УправлениеДаннымиОбИзделияхКлиентСервер.ПараметрыДействияПроверитьЗаполнитьСпецификацию(
Объект, ТекущаяСтрока, ПараметрыВыбораСпецификаций, ЭтаФорма, Новый Структура("КлючПутейКДанным", ОписаниеТаблицы.ПутьКДанным));
СтруктураДействий.Вставить("ПроверитьЗаполнитьСпецификацию", ПараметрыЗаполнения);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
Если СпецификацияДоИзменения <> ТекущаяСтрока.Спецификация
И НЕ Объект.КроссТаблица Тогда
РассчитатьДатуЗапускаПродукции(ЭтотОбъект, ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПродукцияНазначениеПриИзмененииНаСервере(ИдентификаторСтроки, КэшированныеЗначения)
ОписаниеТаблицы = ОписаниеТаблицыПродукции(ЭтаФорма);
ТекущаяСтрока = ОписаниеТаблицы.ТЧ.НайтиПоИдентификатору(ИдентификаторСтроки);
ЗаполнитьНаправлениеДеятельности(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекущаяСтрока));
КонецПроцедуры
&НаСервере
Процедура ПродукцияДатаВыпускаПриИзмененииНаСервере(ИдентификаторСтроки, КэшированныеЗначения)
ТекущиеДанные = Объект.Продукция.НайтиПоИдентификатору(ИдентификаторСтроки);
СтруктураДействий = Новый Структура;
ПараметрыЗаполнения = УправлениеДаннымиОбИзделияхКлиентСервер.ПараметрыДействияПроверитьЗаполнитьСпецификацию(
Объект, ТекущиеДанные, ПараметрыВыбораСпецификаций, ЭтаФорма, Новый Структура("КлючПутейКДанным", "Объект.Продукция"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьСпецификацию", ПараметрыЗаполнения);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущиеДанные, СтруктураДействий, КэшированныеЗначения);
РассчитатьДатуЗапускаПродукции(ЭтотОбъект, ТекущиеДанные);
КонецПроцедуры
#КонецОбласти
#Область РаботаСExcel
&НаСервере
Функция ЗагрузитьИзExcelНаСервере(МассивСтруктурТовары)
Если Объект.КроссТаблица Тогда
ПродукцияПоДатам.Очистить();
Иначе
Объект.Продукция.Очистить();
КонецЕсли;
Для Каждого СтруктураТовар Из МассивСтруктурТовары Цикл
Если НЕ ЗначениеЗаполнено(СтруктураТовар.ИдентификаторНоменклатура) Тогда
Продолжить;
КонецЕсли;
СтруктураТовар.Вставить("Номенклатура", Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторНоменклатура)));
СтруктураТовар.Вставить("Характеристика", Справочники.ХарактеристикиНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторХарактеристика)));
СтруктураТовар.Вставить("Упаковка", Справочники.УпаковкиЕдиницыИзмерения.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторУпаковка)));
СтруктураТовар.Вставить("Спецификация", Справочники.РесурсныеСпецификации.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторСпецификация)));
СтруктураТовар.Вставить("Назначение", Справочники.Назначения.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторНазначение)));
КонецЦикла;
ДобавитьТовары(МассивСтруктурТовары);
Если НЕ Объект.КроссТаблица Тогда
ОбновитьПризнакЗамещения();
КонецЕсли;
КонецФункции
&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиенте(ПрисоединенныйФайл)
СтруктураДействийExcel = СтруктураДействийПриЗагрузкеИзExcel();
РаботаСExcelКлиент.ЗагрузитьИзExcel(ЭтаФорма, ПрисоединенныйФайл, СтруктураДействийExcel);
КонецФункции
&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиентеПродолжение(ДанныеЗагрузки)
ЕстьДобавленныеСтроки = Ложь;
Для каждого СтрокаЗагрузки Из ДанныеЗагрузки Цикл
Если НЕ ЗначениеЗаполнено(СтрокаЗагрузки.ИдентификаторНоменклатура) Тогда
ЕстьДобавленныеСтроки = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьДобавленныеСтроки Тогда
ПараметрыЗагрузки = РаботаСТабличнымиЧастямиКлиент.ПараметрыЗагрузкиНоменклатурыДляПланов();
ПараметрыЗагрузки.ВидПлана = Объект.ВидПлана;
ПараметрыЗагрузки.КроссТаблица = Объект.КроссТаблица;
ПараметрыЗагрузки.АдресТаблицыПериодов = ПолучитьАдресТаблицыПериодов();
ПараметрыЗагрузки.АдресТаблицыТоваров = ПоместитьВоВременноеХранилище(ДанныеЗагрузки, УникальныйИдентификатор);
ПараметрыЗагрузки.ПараметрыОтбора.Вставить("ТипНоменклатуры",
НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь));
ПараметрыЗагрузки.ПараметрыОтбора.ТипНоменклатуры.Добавить(ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Работа"));
ПараметрыЗагрузки.ТипПроизводственногоПроцесса = Объект.ТипПроизводственногоПроцесса;
ДопПараметры = Новый Структура("ОбновитьДополнить", 0);
Оповещение = Новый ОписаниеОповещения("ЗагрузитьИзВнешнегоФайлаЗавершение", ЭтотОбъект, ДопПараметры);
РаботаСТабличнымиЧастямиКлиент.ПоказатьФормуЗагрузкиНоменклатурыДляПланов(ПараметрыЗагрузки, Оповещение);
Иначе
ЗагрузитьИзExcelНаСервере(ДанныеЗагрузки);
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ЗагрузитьИзВнешнегоФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(АдресЗагруженныхДанных) Тогда
Если ДополнительныеПараметры.ОбновитьДополнить = 0 Тогда
ПродукцияПоДатам.Очистить();
Объект.Продукция.Очистить();
КонецЕсли;
ПолучитьЗагруженныеТоварыИзХранилища(АдресЗагруженныхДанных, КэшированныеЗначения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция СтруктураДействийПриЗагрузкеИзExcel()
СтруктураДействийExcel = Новый Структура;
КолонкиПоиска = Новый СписокЗначений;
КолонкиПоиска.Добавить(НСтр("ru = 'Уникальный идентификатор (Номенклатура)'"),"ИдентификаторНоменклатура");
КолонкиПоиска.Добавить(НСтр("ru = 'Уникальный идентификатор (Характеристика)'"),"ИдентификаторХарактеристика");
КолонкиПоиска.Добавить(НСтр("ru = 'Уникальный идентификатор (Упаковка)'"),"ИдентификаторУпаковка");
КолонкиПоиска.Добавить(НСтр("ru = 'Уникальный идентификатор (Спецификация)'"),"ИдентификаторСпецификация");
КолонкиПоиска.Добавить(НСтр("ru = 'Уникальный идентификатор (Назначение)'"),"ИдентификаторНазначение");
Если ЗначениеЗаполнено(ИмяДополнительнойКолонки) Тогда
КолонкиПоиска.Добавить(ИмяДополнительнойКолонки,"ЗагружаемыйАртикул");
КонецЕсли;
КолонкиПоиска.Добавить(НСтр("ru = 'Номенклатура'"),"ЗагружаемаяНоменклатура");
КолонкиПоиска.Добавить(НСтр("ru = 'Характеристика'"),"ЗагружаемаяХарактеристика");
Если ЗаполнятьСпецификацию Тогда
КолонкиПоиска.Добавить(НСтр("ru = 'Спецификация'"),"ЗагружаемаяСпецификация");
КонецЕсли;
Если ЗаполнятьНазначениеВТЧ Тогда
КолонкиПоиска.Добавить(НСтр("ru = 'Назначение'"),"ЗагружаемоеНазначение");
КонецЕсли;
Если Объект.КроссТаблица Тогда
КолонкиПоиска.Добавить(НСтр("ru = 'Ед. изм.'"),"ЗагружаемаяУпаковка");
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Если НЕ Период.Активная ИЛИ Период.НомерКолонки <=0 Тогда
Продолжить;
КонецЕсли;
КолонкиПоиска.Добавить(Период.Заголовок,"Период_"+Период.ИмяКолонки);
Если Объект.Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность.Год") Тогда
КолонкиПоиска.Добавить(СокрЛП(СтрЗаменить(Период.Заголовок, НСтр("ru = 'г.'"), "")),"Период_"+Период.ИмяКолонки);
КонецЕсли;
КолонкиПоиска.Добавить(
ПланированиеКлиентСервер.СформироватьЗаголовокПериода(
Объект.Периодичность, Период.ДатаНачала, Период.ДатаОкончания, НЕ ОтображатьНомерПериода),
"Период_"+Период.ИмяКолонки);
КонецЦикла;
РеквизитыПериода = Новый Массив;
РеквизитыПериода.Добавить("Количество_");
СтруктураДействийExcel.Вставить("РеквизитыПериода", РеквизитыПериода);
СтруктураДействийExcel.Вставить("Периоды", ЭтаФорма.Периоды);
Иначе
КолонкиПоиска.Добавить(НСтр("ru = 'Дата выпуска'"),"ДатаВыпуска");
КолонкиПоиска.Добавить(НСтр("ru = 'Количество'"),"КоличествоУпаковок");
КолонкиПоиска.Добавить(НСтр("ru = 'Ед. изм.'"),"ЗагружаемаяУпаковка");
КонецЕсли;
СтруктураДействийExcel.Вставить("КолонкиПоиска", КолонкиПоиска);
СтруктураПоиска = Новый Структура();
СтруктураПоиска.Вставить("ИдентификаторНоменклатура",0);
СтруктураПоиска.Вставить("ИдентификаторХарактеристика",0);
СтруктураПоиска.Вставить("ИдентификаторУпаковка",0);
СтруктураПоиска.Вставить("ИдентификаторСпецификация",0);
СтруктураПоиска.Вставить("ИдентификаторНазначение",0);
СтруктураДействийExcel.Вставить("СтруктураПоиска", СтруктураПоиска);
СтруктураДействийExcel.Вставить("НомерСтрокиНачалаДанных", 3);
Возврат СтруктураДействийExcel;
КонецФункции
#КонецОбласти
#Область РаботаСБуферомОбмена
&НаСервере
Процедура СкопироватьСтрокиНаСервере()
Если Объект.КроссТаблица Тогда
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(ПродукцияПоДатам, Элементы.ПродукцияПоДатам.ВыделенныеСтроки);
Иначе
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(Объект.Продукция, Элементы.Продукция.ВыделенныеСтроки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьСтрокиИзБуфераОбмена()
ПараметрыОтбора = Новый Соответствие;
ПараметрыОтбора.Вставить("Номенклатура.ТипНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь));
ПараметрыОтбора.Получить("Номенклатура.ТипНоменклатуры").Добавить(Перечисления.ТипыНоменклатуры.Работа);
Колонки = "Номенклатура,Характеристика,Упаковка,КоличествоУпаковок,Количество,Спецификация,
|ДатаЗапуска,ДатаВыпуска,ДатаВыпускаПродукцииПолуфабриката,Полуфабрикат";
ТаблицаПродукции = РаботаСТабличнымиЧастями.СтрокиИзБуфераОбмена(ПараметрыОтбора, Колонки);
Если ЗначениеЗаполнено(ТаблицаПродукции) Тогда
ДобавитьТовары(ТаблицаПродукции);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьДоступностьКомандБуфераОбмена()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("ПродукцияВставитьСтроки");
МассивЭлементов.Добавить("ПродукцияКонтекстноеМенюВставитьСтроки");
МассивЭлементов.Добавить("ПродукцияПоДатамВставитьСтроки");
МассивЭлементов.Добавить("ПродукцияПоДатамКонтекстноеМенюВставитьСтроки");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность",
РаботаСТабличнымиЧастями.ЕстьСтрокиВБуфереОбмена());
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКомандБуфераОбменаНаКлиенте()
МассивЭлементов = Новый Массив();
МассивЭлементов.Добавить("ПродукцияВставитьСтроки");
МассивЭлементов.Добавить("ПродукцияКонтекстноеМенюВставитьСтроки");
МассивЭлементов.Добавить("ПродукцияПоДатамВставитьСтроки");
МассивЭлементов.Добавить("ПродукцияПоДатамКонтекстноеМенюВставитьСтроки");
ОбщегоНазначенияУТКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, МассивЭлементов, "Доступность", Истина);
КонецПроцедуры
#КонецОбласти
#Область ПростоеЗаполнение
&НаСервере
Процедура ИнициализироватьНастроекПриЧтенииНаСервере(ДокументОбъект)
Если НЕ ЗначениеЗаполнено(Объект.Сценарий) ИЛИ Не ЗначениеЗаполнено(Объект.ВидПлана) Тогда
Возврат;
КонецЕсли;
ПараметрыИнициализации = Новый Структура();
ПараметрыИнициализации.Вставить("Форма", ЭтотОбъект);
ПараметрыИнициализации.Вставить("ПутьКРеквизиту", "Объект.Продукция");
ПараметрыИнициализации.Вставить("ЭлементФормыТаблицы", "Продукция");
ПараметрыИнициализации.Вставить("ЭлементФормыТаблицыПоПериодам", "ПродукцияПоДатам");
ПараметрыИнициализации.Вставить("ТипПроизводственногоПроцесса", Объект.ТипПроизводственногоПроцесса);
Планирование.ИнициализироватьДопПараметры(ДополнительныеПараметрыТовары, ДополнительныеПараметрыТоварыПоПериодам, ПараметрыИнициализации);
ИнициализироватьДереваОператоров();
ИнициализироватьОперандыФормулы();
ИнициализироватьСтруктуруНастроек(ДокументОбъект);
ОбновитьСтруктуруВыводаДопПараметров();
ПрочитатьДополнительныеПараметры(ДокументОбъект);
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьСтруктуруНастроек(ДокументОбъект)
Если ЗначениеЗаполнено(ДокументОбъект.Ссылка) Тогда
СтруктураНастроек = ДокументОбъект.СтруктураНастроек.Получить();
Если СтруктураНастроек = Неопределено Тогда
УстановитьЗначениеНастройки("СтруктураНастроек", СтруктураНастроек);
КонецЕсли;
КонецЕсли;
ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначениеНастройки(ИмяНастройки, Настройка)
ЗначениеНастройкиИзХранилища = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиРаботыПользователя" + ТипПлана, "СтруктураНастроек", Настройка);
Если ЗначениеНастройкиИзХранилища <> Неопределено Тогда
Настройка = ЗначениеНастройкиИзХранилища;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьОперандыФормулы()
МассивОперандов = ПолучитьОперанды(ЭтотОбъект);
ДополнительныеПоля.Очистить();
Для каждого Элемент Из МассивОперандов Цикл
НоваяСтрока = ДополнительныеПоля.Добавить();
НоваяСтрока.Идентификатор = Элемент.Имя;
НоваяСтрока.ПометкаУдаления = ЛОЖЬ;
НоваяСтрока.Представление = Элемент.ЗаголовокОперанда;
Элемент.Свойство("ВходитВОперанд", НоваяСтрока.ВходитВОперанд);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьДереваОператоров()
Дерево = РаботаСФормулами.ПолучитьПустоеДеревоОператоров();
Планирование.ИнициализироватьДереваОператоров(Дерево);
ПредставлениеГруппы = НСтр("ru='Примеры формул'");
ГруппаОператоров = РаботаСФормулами.ДобавитьГруппуОператоров(Дерево, "ПримерыФормул", ПредставлениеГруппы);
ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров);
АдресХранилищаДереваОператоров = ПоместитьВоВременноеХранилище(Дерево, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьНаПроцентЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено
ИЛИ Результат = 0
ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.Продукция.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Продукция.НайтиПоИдентификатору(ВыделеннаяСтрока);
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТЧ, КэшированныеЗначения);
КонецЦикла;
Иначе
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОкруглитьКоличествоЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено
ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Если НЕ Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.Продукция.ВыделенныеСтроки;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Продукция.НайтиПоИдентификатору(ВыделеннаяСтрока);
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТЧ, КэшированныеЗначения);
КонецЦикла;
Иначе
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
КонецЕсли;
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросаЗадатьПроизвольнуюФормулу(РезультатВопроса, ДополнительныеПараметры) Экспорт
СтруктураДанных = Новый Структура("Формула,ФормулаПредставление,Заголовок,ВключитьЗначение,МассивСтрок,ПериодИзменения");
Если Объект.КроссТаблица Тогда
ВыделенныеСтроки = Элементы.ПродукцияПоДатам.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 1 Тогда
ТекущиеДанные = ПродукцияПоДатам.НайтиПоИдентификатору(ВыделенныеСтроки[0]);
Для каждого Операнд Из ДополнительныеПоля Цикл
Операнд.Значение = ЭтотОбъект[Операнд.Идентификатор];
КонецЦикла;
СтруктураДанных.Формула = ЭтотОбъект.Формула;
СтруктураДанных.ФормулаПредставление= ЭтотОбъект.ФормулаПредставление;
СтруктураДанных.Заголовок = "" + ТекущиеДанные.Номенклатура +
?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика)," (" + ТекущиеДанные.Характеристика + ")","");
СтруктураДанных.ВключитьЗначение = Истина;
Иначе
СтруктураДанных.Формула = "";
СтруктураДанных.ФормулаПредставление = "";
СтруктураДанных.Заголовок = "";
СтруктураДанных.ВключитьЗначение = Ложь;
КонецЕсли;
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
СтруктураДанных.ПериодИзменения = "ВсеПериоды";
ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда
СтруктураДанных.ПериодИзменения = ДополнительныеПараметры.ИмяКолонки;
Иначе
Возврат;
КонецЕсли;
Иначе
ВыделенныеСтроки = Элементы.Продукция.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 1 Тогда
ТекущиеДанные = Объект.Продукция.НайтиПоИдентификатору(ВыделенныеСтроки[0]);
Для каждого Операнд Из ДополнительныеПоля Цикл
Если ТекущиеДанные.Свойство(Операнд.Идентификатор) Тогда
Операнд.Значение = ТекущиеДанные[Операнд.Идентификатор];
КонецЕсли;
КонецЦикла;
СтруктураДанных.Формула = ТекущиеДанные.Формула;
СтруктураДанных.ФормулаПредставление= ТекущиеДанные.ФормулаПредставление;
СтруктураДанных.Заголовок = "" + ТекущиеДанные.Номенклатура +
?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика)," (" + ТекущиеДанные.Характеристика + ")","");
СтруктураДанных.ВключитьЗначение = Истина;
Иначе
СтруктураДанных.Формула = "";
СтруктураДанных.ФормулаПредставление = "";
СтруктураДанных.Заголовок = "";
СтруктураДанных.ВключитьЗначение = Ложь;
КонецЕсли;
КонецЕсли;
СтруктураДанных.МассивСтрок = ВыделенныеСтроки;
УстановитьПараметрыРасшифровки(СтруктураДанных);
УстановитьПроизвольнуюФормулу(СтруктураДанных);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПроизвольнуюФормулу(СтруктураДанных)
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланПроизводства");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Расширенный", Истина);
ПараметрыФормы.Вставить("ВключитьЗначение", СтруктураДанных.ВключитьЗначение);
ПараметрыФормы.Вставить("ЗаголовокЗначения", ""+СтруктураДанных.ПараметрыРасшифровки.Отбор.Номенклатура +
?(ЗначениеЗаполнено(СтруктураДанных.ПараметрыРасшифровки.Отбор.Характеристика)," (" + СтруктураДанных.ПараметрыРасшифровки.Отбор.Характеристика + ")",""));
ПараметрыФормы.Вставить("ПараметрыРасшифровкиОперативногоПланирования", СтруктураДанных.ПараметрыРасшифровки);
ПараметрыФормы.Вставить("Формула", ?(СтруктураДанных.Формула = ПланированиеКлиентСервер.ТекстУстановкиНовойФормулы(),"", СтруктураДанных.Формула));
ПараметрыФормы.Вставить("Представление", ?(СтруктураДанных.ФормулаПредставление = ПланированиеКлиентСервер.ТекстУстановкиНовойФормулы(), "", СтруктураДанных.ФормулаПредставление));
ПараметрыФормы.Вставить("ИспользуетсяДеревоОперандов", Истина);
ПараметрыФормы.Вставить("ВыбиратьОперандПлана", Истина);
ПараметрыФормы.Вставить("ДеревоОперандов", ПоместитьДополнительныеПоляВХранилище());
ПараметрыФормы.Вставить("Операторы", АдресХранилищаДереваОператоров);
ПараметрыФормы.Вставить("КлючОбъектаСохраняемыхНастроек", "НастройкиРаботыПользователя" + ТипПлана);
ПараметрыФормы.Вставить("Отбор", ОтборПоказатели);
ПараметрыФормы.Вставить("ТипРезультата", Новый ОписаниеТипов("Число"));
ПараметрыФормы.Вставить("ФункцииИзОбщегоМодуля", ПланированиеКлиент.ФункцииИзОбщегоМодуля());
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОткрытияКонструктораУстановитьПроизвольнуюФормулу",ЭтотОбъект, СтруктураДанных);
Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ОткрытьФорму("ОбщаяФорма.КонструкторФормул", ПараметрыФормы, ЭтаФорма,,,,ОписаниеОповещения,Режим);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_УстановитьПроизвольнуюФормулу(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтруктураДанных = Новый Структура("Формула,ФормулаПредставление,ПараметрыРасшифровки,ВключитьЗначение,МассивСтрок,ПериодИзменения");
МассивСтрок = Новый Массив();
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ПродукцияПоДатам.ТекущиеДанные;
МассивСтрок.Добавить(ТекущиеДанные.ПолучитьИдентификатор());
Для каждого Операнд Из ДополнительныеПоля Цикл
Операнд.Значение = ЭтотОбъект[Операнд.Идентификатор];
КонецЦикла;
ТекущийЭлементИмя = Элементы.ПродукцияПоДатам.ТекущийЭлемент.Имя;
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
Если АктивныеПериоды.Количество() > 1 Тогда
Если СтрНайти(ТекущийЭлементИмя, "ПродукцияПоДатам" + "Количество_") = 0
И СтрНайти(ТекущийЭлементИмя, "ПродукцияПоДатам" + "КартинкаКомментарий_") = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Активируйте колонку с периодом'"));
Возврат;
Иначе
Для каждого Период Из АктивныеПериоды Цикл
Если ТекущийЭлементИмя = "ПродукцияПоДатам" + "Количество_" + Период.ИмяКолонки
ИЛИ ТекущийЭлементИмя = "ПродукцияПоДатам" + "КартинкаКомментарий_" + Период.ИмяКолонки Тогда
СтруктураДанных.Формула = ТекущиеДанные["Формула_" + Период.ИмяКолонки];
СтруктураДанных.ФормулаПредставление = ТекущиеДанные["ФормулаПредставление_" + Период.ИмяКолонки];
СтруктураДанных.ПериодИзменения = Период.ИмяКолонки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
Для каждого Период Из АктивныеПериоды Цикл
СтруктураДанных.Формула = ТекущиеДанные["Формула_" + Период.ИмяКолонки];
СтруктураДанных.ФормулаПредставление = ТекущиеДанные["ФормулаПредставление_" + Период.ИмяКолонки];
СтруктураДанных.ПериодИзменения = Период.ИмяКолонки;
КонецЦикла;
КонецЕсли;
Иначе
ТекущиеДанные = Элементы.Продукция.ТекущиеДанные;
МассивСтрок.Добавить(ТекущиеДанные.ПолучитьИдентификатор());
Для каждого Операнд Из ДополнительныеПоля Цикл
Если ТекущиеДанные.Свойство(Операнд.Идентификатор) Тогда
Операнд.Значение = ТекущиеДанные[Операнд.Идентификатор];
КонецЕсли;
КонецЦикла;
СтруктураДанных.Формула = ТекущиеДанные.Формула;
СтруктураДанных.ФормулаПредставление = ТекущиеДанные.ФормулаПредставление;
СтруктураДанных.ПериодИзменения = "ВсеПериоды";
КонецЕсли;
СтруктураДанных.ВключитьЗначение = Истина;
СтруктураДанных.МассивСтрок = МассивСтрок;
УстановитьПараметрыРасшифровки(СтруктураДанных);
УстановитьПроизвольнуюФормулу(СтруктураДанных);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытияКонструктораУстановитьПроизвольнуюФормулу(Результат, СтруктураДанных) Экспорт
МассивСтрок = СтруктураДанных.МассивСтрок;
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Возврат;
КонецЕсли;
Если Объект.КроссТаблица Тогда
Если СтруктураДанных.Свойство("ПериодИзменения") Тогда
ИмяПериода = СтруктураДанных.ПериодИзменения;
Иначе
ИмяПериода = "ВсеПериоды";
КонецЕсли;
Для каждого ИДСтроки Из МассивСтрок Цикл
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ИмяПериода <> "ВсеПериоды" Тогда
СтрокаТоваров = ПродукцияПоДатам.НайтиПоИдентификатору(ИДСтроки);
Если СтрокаТоваров.Полуфабрикат Тогда
Продолжить;
КонецЕсли;
Если ИмяПериода = Период.ИмяКолонки Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Результат.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
ИначеЕсли ЗначениеЗаполнено(СтрокаТоваров["Формула_" + Период.ИмяКолонки]) И СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0 Тогда
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(СтрокаТоваров["Формула_" + Период.ИмяКолонки], СтрокаТоваров, ЭтаФорма.Периоды, Период, Результат.Представление);
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
КонецЕсли;
ИначеЕсли ИмяПериода = "ВсеПериоды" Тогда
СтрокаТоваров = ПродукцияПоДатам.НайтиПоИдентификатору(ИДСтроки);
Если СтрокаТоваров.Полуфабрикат Тогда
Продолжить;
КонецЕсли;
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, ЭтаФорма.Периоды, Период,Результат.Представление);
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Результат.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Объект, ЭтаФорма, СтрокаТоваров);
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
КонецЕсли;
КонецЦикла;
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Иначе
Для каждого ИДСтроки Из МассивСтрок Цикл
СтрокаТоваров = Объект.Продукция.НайтиПоИдентификатору(ИДСтроки);
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(Результат.Формула, СтрокаТоваров, Неопределено, Неопределено, Результат.Представление);
СтрокаТоваров.Формула = Результат.Формула;
СтрокаТоваров.ФормулаПредставление = РезультатВычисления.Представление;
СтрокаТоваров.ФормулаВычисление = РезультатВычисления.Вычисление;
СтрокаТоваров.КоличествоУпаковок = РезультатВычисления.Результат;
СтрокаТоваров.Отклонение = 0;
ПересчитатьКоличествоУпаковокИСуммуВСтроке(СтрокаТоваров, КэшированныеЗначения);
КонецЦикла;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
КонецЕсли;
Модифицированность = Истина;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьДопРеквизиты(Форма)
ДопРеквизиты = Новый Массив();
Если Форма.ДополнительныеПараметрыТоварыПоПериодам = Неопределено Тогда
Возврат ДопРеквизиты;
КонецЕсли;
Для каждого Поле Из Форма.ДополнительныеПараметрыТоварыПоПериодам Цикл
Если Поле.Значение.СоздаватьРеквизит Тогда
ДопРеквизиты.Добавить(Поле.Значение);
КонецЕсли;
КонецЦикла;
Возврат ДопРеквизиты;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьОперанды(Форма)
МассивОперандов = Новый Массив();
Если Форма.ДополнительныеПараметрыТоварыПоПериодам = Неопределено Тогда
Возврат МассивОперандов;
КонецЕсли;
Для каждого Поле Из Форма.ДополнительныеПараметрыТоварыПоПериодам Цикл
Если Поле.Значение.СоздаватьОперанд Тогда
МассивОперандов.Добавить(Поле.Значение);
КонецЕсли;
КонецЦикла;
Возврат МассивОперандов;
КонецФункции
&НаСервере
Функция ПоместитьДополнительныеПоляВХранилище()
Возврат Планирование.ПоместитьДополнительныеПоляВХранилище(ЭтаФорма, СтруктураНастроек.СмещениеПериода);
КонецФункции
&НаСервере
Процедура ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров)
Сценарий = Планирование.ПараметрыСценария(Объект.Сценарий);
ИспользоватьПланыПродаж = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПродаж")
И Сценарий.ИспользоватьВПланированииПродаж;
ИспользоватьПланированиеПроизводства = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства")
И Сценарий.ИспользоватьВПланированииПроизводства;
ИспользоватьДляПланированияМатериалов = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПроизводства")
И Сценарий.ИспользоватьДляПланированияМатериалов;
ИспользоватьПланыЗакупок = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеЗакупок")
И Сценарий.ИспользоватьВПланированииЗакупок;
ИспользоватьПланыСборки = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеСборкиРазборки")
И Сценарий.ИспользоватьВПланированииСборкиРазборки;
ИспользоватьПланыОстатков = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеОстатков")
И Сценарий.ИспользоватьВПланированииОстатков;
ИспользоватьПланыВнутреннихПотреблений = ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеВнутреннихПотреблений")
И Сценарий.ИспользоватьВПланированииВнутреннихПотреблений;
Идентификатор = "[ПланыПроизводства] * 1.15";
КонструкцияДляВставки = "[ПланыПроизводства] * 1.15";
Представление = НСтр("ru = 'План производства +15%'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]")
+ ?(ИспользоватьПланыОстатков, " - [ПланОстатков]" ,
?(ПланированиеПоНазначениям, " - [ФактическиеНачальныеОстатки]", " - [СвободныеОстатки]"));
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Минимальное обеспечение продаж'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = "(Макс([ПланыПроизводства], "
+ ?(ИспользоватьПланыПродаж,"[ПланыПродаж])","[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках])")
+ ?(ИспользоватьПланыОстатков," - [ПланОстатков]) * 1.1",
?(ПланированиеПоНазначениям," - [ФактическиеНачальныеОстатки]) * 1.1"," - [СвободныеОстатки]) * 1.1"));
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Максимальный план производства с учетом корректировки продаж +10%'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "0")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплектующие]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплекты]", "")
+ ?(ИспользоватьПланыВнутреннихПотреблений, " + [ПланыВнутреннихПотреблений]","")
+ ?(ИспользоватьДляПланированияМатериалов, " + [ПланыПроизводстваМатериалы]","");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Планы потребностей'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "")
+ ?(ИспользоватьПланированиеПроизводства, " + [ПланыПроизводства]", "");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Планы обеспечения'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "")
+ ?(ИспользоватьПланированиеПроизводства, " + [ПланыПроизводства]", "")
+ ?(ИспользоватьПланыПродаж, " - [ПланыПродаж]", "")
+ ?(ИспользоватьПланыСборки, " - [ПланыСборкиКомплектующие]", "")
+ ?(ИспользоватьПланыСборки, " - [ПланыРазборкиКомплекты]", "")
+ ?(ИспользоватьПланыВнутреннихПотреблений," - [ПланыВнутреннихПотреблений]","")
+ ?(ИспользоватьДляПланированияМатериалов, " - [ПланыПроизводстваМатериалы]", "");
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Отклонение планов'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонструкцияДляВставки = "ЗначениеКолонки(НомерТекущейКолонки() - 1)";
Идентификатор = КонструкцияДляВставки;
Представление = НСтр("ru = 'Значение предыдущей колонки'");
РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьФормулуИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Если СтруктураНастроек.ВариантЗаполненияСостава = "Отбор" Тогда
ПродукцияПоДатам.Очистить();
Объект.Продукция.Очистить();
ТоварыКоличествоСтрок = 0;
Оповещение = Новый ОписаниеОповещения("НастроитьФормулуИЗаполнитьЗавершение", ЭтотОбъект, Настройки);
ДобавитьТоварыПоОтборуНаКлиенте(Оповещение);
Возврат;
ИначеЕсли СтруктураНастроек.ВариантЗаполненияСостава = "НеМенять" Тогда
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
Иначе
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Настройки.Вставить("ЗаполнятьСостав", Истина);
ЗаполнитьДокумент(Настройки);
КонецЕсли;
Если Объект.КроссТаблица И Элементы.ПродукцияПоДатам.ТекущиеДанные = Неопределено Тогда
ПланированиеКлиентСервер.ОчиститьЗначениеФормулы(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьФормулуИЗаполнитьЗавершение(Результат, Настройки) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
Если Не Объект.КроссТаблица Тогда
ЗаполнитьСоставТовараПоОтбору(КэшированныеЗначения);
КонецЕсли;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецЕсли;
Если Объект.КроссТаблица И Элементы.ПродукцияПоДатам.ТекущиеДанные = Неопределено Тогда
ПланированиеКлиентСервер.ОчиститьЗначениеФормулы(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура НастроитьСмещениеИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
СтруктураНастроек = Настройки;
Настройки.Вставить("ЗаполнятьПоФормуле", Истина);
Настройки.Вставить("ЗаполнятьОперанды", Истина);
Если Настройки.Свойство("ЗаполнятьСостав") Тогда
Настройки.Удалить("ЗаполнятьСостав");
КонецЕсли;
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтборуНаКлиенте(ОповещениеОДобавлении = Неопределено)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Подбор продукции'"));
ПараметрыФормы.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь));
ПараметрыФормы.ОтборПоТипуНоменклатуры.Добавить(ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Работа"));
Если СтруктураНастроек.Свойство("ОтборНоменклатурыНастройки") Тогда
ПараметрыФормы.Вставить("ОтборНоменклатурыНастройки", СтруктураНастроек.ОтборНоменклатурыНастройки);
Иначе
ПараметрыФормы.Вставить("ОтборНоменклатурыНастройки", Неопределено)
КонецЕсли;
ДополнительныеПараметры = Новый Структура("ОповещениеОДобавлении", ОповещениеОДобавлении);
Оповещение = Новый ОписаниеОповещения("ДобавитьТоварыПоОтборуЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОткрытьФорму(
"Обработка.ПодборТоваровПоОтбору.Форма",
ПараметрыФормы,
ЭтаФорма,
УникальныйИдентификатор,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТоварыПоОтборуЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
ОбработкаВыбораПодборНаСервере(КэшированныеЗначения, Новый Структура("АдресТоваровВХранилище", Результат));
ОповеститьПользователяОЗаполненииДанных();
КонецЕсли;
Если ДополнительныеПараметры.ОповещениеОДобавлении <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОДобавлении, Результат);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСоставТовараПоОтбору(КэшированныеЗначения)
ТаблицаПериоды = ЭтаФорма.Периоды;
АктивныеПериоды = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина));
ТоварПоОтбору = Объект.Продукция.Выгрузить();
Объект.Продукция.Очистить();
Для каждого Период Из АктивныеПериоды Цикл
Для каждого СтрокаТовара Из ТоварПоОтбору Цикл
ТекущаяСтрока = Объект.Продукция.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
ТекущаяСтрока[?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска")] = Период.ДатаНачала;
ТекущаяСтрока.Формула = СтруктураНастроек.Формула;
ТекущаяСтрока.ФормулаПредставление = СтруктураНастроек.ФормулаПредставление;
ТекущаяСтрока.ФормулаВычисление = СтруктураНастроек.Формула;
КонецЦикла;
КонецЦикла;
Если ЗаполнятьСпецификациюПоПериодам И НЕ Объект.КроссТаблица Тогда
ЗаполнитьСпецификациюВСтрокахПродукции();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПараметрыРасшифровки(СтруктураДанных)
Если Объект.КроссТаблица Тогда
ТекущиеДанные = Элементы.ПродукцияПоДатам.ТекущиеДанные;
Иначе
ТекущиеДанные = Элементы.Продукция.ТекущиеДанные;
КонецЕсли;
ТипПлана = ПредопределенноеЗначение("Перечисление.ТипыПланов.ПланПроизводства");
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ОтборПоказатели.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
ОтборПоказатели.Вставить("Характеристика", ТекущиеДанные.Характеристика);
ПараметрыЗапроса = Новый Структура();
ПараметрыЗапроса.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗапроса.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗапроса.Вставить("СмещениеПериода", ДополнительныеНастройки(СтруктураНастроек).СмещениеПериода);
ПараметрыЗапроса.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗапроса.Вставить("ИспользуетсяОтборПоСегментуНоменклатуры",Ложь);
ПараметрыЗапроса.Вставить("Поля", ДополнительныеПараметрыТоварыПоПериодам);
ПараметрыЗапроса.Вставить("Отбор", ОтборПоказатели);
УстановитьПериодЗапроса(ПараметрыЗапроса);
СтруктураДанных.Вставить("ПараметрыРасшифровки", ПараметрыЗапроса);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПериодЗапроса(ПараметрыЗапроса)
Если Объект.КроссТаблица Тогда
ТекущийЭлементИмя = Элементы.ПродукцияПоДатам.ТекущийЭлемент.Имя;
ТаблицаПериоды = ЭтаФорма.Периоды;
Для каждого Период Из ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ТекущийЭлементИмя = "ПродукцияПоДатам" + "Количество_" + Период.ИмяКолонки Тогда
ПараметрыЗапроса.Вставить("НачалоПериодаСмещения", Период.ДатаНачала);
ПараметрыЗапроса.Вставить("КонецПериодаСмещения", Период.ДатаОкончания);
КонецЕсли;
КонецЦикла;
Иначе
ТекущиеДанные = Элементы.Продукция.ТекущиеДанные;
СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить("ДатаНачала", ТекущиеДанные[?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска")]);
СтруктураПоиска.Вставить("Активная", Истина);
ТаблицаПериоды = ЭтаФорма.Периоды;
МассивСтрок = ТаблицаПериоды.НайтиСтроки(СтруктураПоиска);
Если МассивСтрок.Количество() > 0 Тогда
ПараметрыЗапроса.Вставить("НачалоПериодаСмещения", МассивСтрок[0].ДатаНачала);
ПараметрыЗапроса.Вставить("КонецПериодаСмещения", МассивСтрок[0].ДатаОкончания);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля = Неопределено)
Если НЕ ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
СтруктураНастроек = Новый Структура();
СтруктураНастроек.Вставить("ВариантЗаполненияСостава", "Отбор");
СтруктураНастроек.Вставить("ВариантСмещения", "ПредыдущийПериод");
СтруктураНастроек.Вставить("СмещениеПериода", -1);
СтруктураНастроек.Вставить("ВариантЗаполненияЦен", "ВидЦены");
СтруктураНастроек.Вставить("ВидЦены",);
СтруктураНастроек.Вставить("ИспользоватьВидЦены", Ложь);
СтруктураНастроек.Вставить("Формула","[ПланыПроизводства] * 1.15");
СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru = 'Увеличение планов производства прошлых периодов на 15%'"));
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
Иначе
Если СтруктураНастроек.Свойство("Смещение") Тогда
СтруктураНастроек.Вставить("СмещениеПериода", -1 * СтруктураНастроек.Смещение);
СтруктураНастроек.Удалить("Смещение");
КонецЕсли;
ДополнительныеПараметры = Новый Структура("НеВыводитьСообщения", Истина);
Если ДополнительныеПоля <> Неопределено Тогда
МассивОперандов = Новый Массив;
Для Каждого ТекСтрока Из ДополнительныеПоля Цикл
МассивОперандов.Добавить(ТекСтрока.Идентификатор);
КонецЦикла;
ТипРезультата = Новый ОписаниеТипов("Число");
#Если Клиент Тогда
ПараметрыПроверки = РаботаСФормуламиКлиент.ПараметрыПроверкиФормулы();
ПараметрыПроверки.НеВыводитьСообщения = Истина;
РаботаСФормуламиПроверитьФормулу = РаботаСФормуламиКлиент.ПроверитьФормулу(СтруктураНастроек.Формула,
МассивОперандов, ТипРезультата, ПараметрыПроверки);
#Иначе
ПараметрыПроверки = РаботаСФормулами.ПараметрыПроверкиФормулы();
ПараметрыПроверки.НеВыводитьСообщения = Истина;
РаботаСФормуламиПроверитьФормулу = РаботаСФормулами.ПроверитьФормулу(СтруктураНастроек.Формула,
МассивОперандов, ТипРезультата, ПараметрыПроверки);
#КонецЕсли
Если Не РаботаСФормуламиПроверитьФормулу Тогда
СтруктураНастроек.Вставить("Формула","[ПланыПроизводства] * 1.15");
СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru = 'Увеличение планов производства прошлых периодов на 15%'"));
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не СтруктураНастроек.Свойство("ФильтроватьНезаполненныеСтроки") Тогда
СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
КонецЕсли;
Если Не СтруктураНастроек.Свойство("ФильтроватьПоНаличиюСпецификации") Тогда
СтруктураНастроек.Вставить("ФильтроватьПоНаличиюСпецификации", Ложь);
КонецЕсли;
Возврат СтруктураНастроек;
КонецФункции
&НаСервере
Процедура ЗаписатьДополнительныеПараметры(ДокументОбъект)
МассивДопРеквизитов = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ТекущаяСтрока Из ДокументОбъект.Продукция Цикл
ЭлементКоллекции = Объект.Продукция.Получить(ТекущаяСтрока.НомерСтроки-1);
Если ЭлементКоллекции = Неопределено Тогда
Продолжить;
КонецЕсли;
ДопПараметр = ТекущаяСтрока.ДополнительныеПараметры.Получить();
Если ТипЗнч(ДопПараметр) <> Тип("Структура") Тогда
ДопПараметр = Новый Структура();
КонецЕсли;
Для каждого ДопРеквизит Из МассивДопРеквизитов Цикл
Идентификатор = ДопРеквизит.Имя;
Если ЭлементКоллекции.Свойство(Идентификатор) Тогда
ДопПараметр.Вставить(Идентификатор,ЭлементКоллекции[Идентификатор]);
КонецЕсли;
КонецЦикла;
ТекущаяСтрока.ДополнительныеПараметры = Новый ХранилищеЗначения(ДопПараметр);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьДополнительныеПараметры(ДокументОбъект)
Для каждого ТекущаяСтрока Из ДокументОбъект.Продукция Цикл
Если ТекущаяСтрока.Полуфабрикат Тогда
Продолжить;
КонецЕсли;
ЭлементКоллекции = Объект.Продукция.Получить(ТекущаяСтрока.НомерСтроки-1);
Если ЭлементКоллекции = Неопределено Тогда
Продолжить;
КонецЕсли;
ДопРеквизиты = ТекущаяСтрока.ДополнительныеПараметры.Получить();
Если ТипЗнч(ДопРеквизиты) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
Идентификатор = ДопРеквизит.Ключ;
Если ЭлементКоллекции.Свойство(Идентификатор) Тогда
ЭлементКоллекции[Идентификатор] = ДопРеквизит.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ПересчитатьКоличествоУпаковокИСуммуВСтроке(ТекущаяСтрока, КэшированныеЗначения)
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
#Если Клиент Тогда
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
#Иначе
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииКоличестваОтклонение(СтрокаТоваров)
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если Не ЗначениеЗаполнено(СтрокаТоваров["Формула_" + Период.ИмяКолонки]) Тогда
Продолжить;
КонецЕсли;
РезультатВычисления = ПланированиеКлиент.ВычислитьПоФормуле(СтрокаТоваров["Формула_" + Период.ИмяКолонки], СтрокаТоваров, ЭтаФорма.Периоды, Период);
Если Элементы.ПродукцияПоДатам.ТекущийЭлемент.Имя = "ПродукцияПоДатам" + "Количество_" + Период.ИмяКолонки Тогда
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = РезультатВычисления.Результат - СтрокаТоваров["Количество_" + Период.ИмяКолонки];
ИначеЕсли СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0 Тогда
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
КонецЕсли;
КонецЦикла;
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтруктуруВыводаДопПараметров()
ПараметрыВыводаТаблицы = Новый Структура("Поля", ДополнительныеПараметрыТовары);
Планирование.ОбновитьСтруктуруВыводаТаблицы(ЭтотОбъект, ПараметрыВыводаТаблицы);
ПараметрыВыводаКроссТаблицы = Новый Структура("Поля", ДополнительныеПараметрыТоварыПоПериодам);
Планирование.ОбновитьСтруктуруВыводаТаблицы(ЭтотОбъект, ПараметрыВыводаКроссТаблицы);
КонецПроцедуры
&НаСервере
Процедура ДобавитьПоляИзДопПараметров(ПараметрыВывода)
ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
СтруктураПоля = Новый Структура;
СтруктураПоля.Вставить("ПрефиксРеквизитаКолонки", ДопРеквизит.Имя + "_");
СтруктураПоля.Вставить("УдалятьРеквизитыТаблицы", ДопРеквизит.УдалятьРеквизитыТаблицы);
СтруктураПоля.Вставить("СоздаватьЭлемент", Ложь);
СтруктураПоля.Вставить("ТипЭлемента", ДопРеквизит.Тип);
СтруктураПоля.Вставить("СоздаватьИтоговыеРеквизиты", Ложь);
ПараметрыВывода.Поля.Добавить(СтруктураПоля);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ДобавитьРеквизитыИзДопПараметров(СтруктураРеквизитов)
ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
Для каждого ДопРеквизит Из ДопРеквизиты Цикл
СтруктураРеквизитов.Вставить(ДопРеквизит.Имя + "_", ДопРеквизит.Имя);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамПриАктивизацииЯчейки(Элемент)
ПодключитьОбработчикОжидания("ПродукцияПоДатамПриАктивизацииЯчейкиНаКлиенте", 0.5, Истина);
КонецПроцедуры
#КонецОбласти
#Область ПроцедурыОбменаДаннымиМеждуТабличнойЧастьюИТаблицейФормы
&НаСервере
Процедура СкопироватьИзКроссТаблицы(КэшированныеЗначения, ЭтотОбъект)
Если ЭтотОбъект.КроссТаблица
Или ИспользуютсяПланируемыеОстатки Тогда
ПараметрыПреобразования = ПараметрыПреобразованияКроссТаблицы();
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
Если Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПолуфабрикатыКроссТаблица Тогда
НазадКПродукцииНаСервере();
КонецЕсли;
Планирование.ЗаполнитьТаблицуИзКроссТаблицы(ЭтотОбъект.Продукция, Объект.Продукция, ПродукцияПоДатам, ПараметрыПреобразования,
СтруктураДействий, КэшированныеЗначения, ВсеПолуфабрикатыПоДатам);
ЗаполнитьДатыЗапускаПродукции(ЭтотОбъект);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура СкопироватьВКроссТаблицу(КэшированныеЗначения)
Если Объект.КроссТаблица
Или ИспользуютсяПланируемыеОстатки Тогда
ПараметрыПреобразования = ПараметрыПреобразованияКроссТаблицы();
Для каждого СтрокаТЧ Из Объект.Продукция Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТЧ[?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска")]) Тогда
СтрокаТЧ[?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска")] = Объект.НачалоПериода;
КонецЕсли;
КонецЦикла;
ПланированиеКлиентСервер.ЗаполнитьКроссТаблицуИзТаблицы(ПродукцияПоДатам, Объект.Продукция, ПараметрыПреобразования, ВсеПолуфабрикатыПоДатам);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ПродукцияПоДатам");
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
ЗаполнитьСлужебныеРеквизиты();
КонецПроцедуры
&НаСервере
Функция ПараметрыПреобразованияКроссТаблицы()
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
СтруктураРеквизитовПериода = Новый Структура("ДатаНачала", ?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска"));
СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить("Количество_","КоличествоУпаковок");
СтруктураРеквизитов.Вставить("Отменено_","Отменено");
СтруктураРеквизитов.Вставить("Замещен_","Замещен");
СтруктураРеквизитов.Вставить("ЗамещенКЗаказу_","ЗамещенКЗаказу");
СтруктураРеквизитов.Вставить("Комментарий_","Комментарий");
Если Объект.ЗаполнятьПоФормуле Тогда
ДобавитьРеквизитыИзДопПараметров(СтруктураРеквизитов);
Иначе
СтруктураРеквизитов.Вставить("Расшифровка_","Расшифровка");
КонецЕсли;
ПоляГруппировки = "Номенклатура, Характеристика, Упаковка, Спецификация, Полуфабрикат";
Если ЗаполнятьНазначениеВТЧ Тогда
ПоляГруппировки = ПоляГруппировки + ", Назначение";
КонецЕсли;
СтруктураИтоговыхРеквизитов = Новый Структура;
СтруктураИтоговыхРеквизитов.Вставить("КоличествоУпаковок", "КоличествоУпаковок");
ПараметрыПреобразования = Новый Структура;
ПараметрыПреобразования.Вставить("ТаблицаПериоды", ТаблицаПериоды);
ПараметрыПреобразования.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПреобразования.Вставить("СтруктураРеквизитовПериода", СтруктураРеквизитовПериода);
ПараметрыПреобразования.Вставить("СтруктураРеквизитов", СтруктураРеквизитов);
ПараметрыПреобразования.Вставить("ПоляГруппировки", ПоляГруппировки);
ПараметрыПреобразования.Вставить("СтруктураИтоговыхРеквизитов", СтруктураИтоговыхРеквизитов);
Возврат ПараметрыПреобразования;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьКоличествоСтрок(Форма)
Если Форма.Объект.КроссТаблица Тогда
Форма.ТоварыКоличествоСтрок = Форма.ПродукцияПоДатам.Количество();
Иначе
Форма.ТоварыКоличествоСтрок = Форма.Объект.Продукция.Количество();
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыВидаПлана(Форма)
ПараметрыВидаПлана = Новый Структура("ЗаполнятьПодразделение, ПланированиеПоНазначениям, ЗаполнятьНазначениеВТЧ");
ЗаполнитьЗначенияСвойств(ПараметрыВидаПлана, Форма);
Возврат ПараметрыВидаПлана;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыОтбора(Форма)
ПараметрыОтбора = Новый Структура("Подразделение, Назначение, ТипПроизводственногоПроцесса");
ЗаполнитьЗначенияСвойств(ПараметрыОтбора, Форма.Объект);
Возврат ПараметрыОтбора;
КонецФункции
&НаКлиенте
Функция ПроверитьЗаполнениеШапки()
ОчиститьСообщения();
ЗаполненоКорректно = Истина;
Если НЕ ЗначениеЗаполнено(Объект.Сценарий) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Сценарий"" не заполнено'"),
Объект.Ссылка,
"Объект.Сценарий");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Вид плана"" не заполнено'"),
Объект.Ссылка,
"Объект.ВидПлана");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЗаполнятьПодразделение И НЕ ЗначениеЗаполнено(Объект.Подразделение) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Подразделение-диспетчер"" не заполнено'"),
Объект.Ссылка,
"Объект.Подразделение");
ЗаполненоКорректно = Ложь;
КонецЕсли;
Если ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)).Количество() = 0 Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Параметры периода заданы неверно. Заполнение невозможно'"),
Объект.Ссылка);
ЗаполненоКорректно = Ложь;
КонецЕсли;
Возврат ЗаполненоКорректно;
КонецФункции
#Область ЗаполнениеВФоне
&НаКлиенте
Процедура ЗаполнитьДокумент(Настройки)
ЗаполнитьДокументЗавершение(Настройки);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОбработатьРезультатЗаполненияПоФормуле(Форма)
ПоследнийПериод = Форма.Периоды[Форма.Периоды.Количество()-1];
УдаляемыеСтроки = Новый Массив;
ПредыдущийПериод = Неопределено;
ЗнакКорректировки = Планирование.ПолучитьЗнакКорректировки(Форма);
Если Форма.Объект.Замещающий Тогда
ОсновнойОперандПлана = Планирование.ОсновнойОперандПлана(Форма);
ОсновнойОперандПланаСОтбором = Планирование.ОсновнойОперандПлана(Форма, Истина);
Иначе
ОсновнойОперандПлана = "";
ОсновнойОперандПланаСОтбором = "";
КонецЕсли;
ТаблицаПериоды = Форма.Периоды;
Для каждого Период Из ТаблицаПериоды Цикл
Для Каждого СтрокаТоваров Из Форма.ПродукцияПоДатам Цикл
Если СтрокаТоваров.Полуфабрикат Тогда
Продолжить;
КонецЕсли;
Если Форма.ИспользуютсяПланируемыеОстатки Тогда
НовыйПланОстатков = Форма.ПериодыПлановОстатка.НайтиПоЗначению(Период.ДатаНачала) <> Неопределено;
НовыйПланОстатковСОтбором = Форма.ПериодыПлановОстаткаСОтбором.НайтиПоЗначению(Период.ДатаНачала) <> Неопределено;
Планирование.ВычислитьРассчитываемыеОперанды(СтрокаТоваров, Период, ПредыдущийПериод, НовыйПланОстатков, "_", ОсновнойОперандПлана, ЗнакКорректировки);
Планирование.ВычислитьРассчитываемыеОперанды(СтрокаТоваров, Период, ПредыдущийПериод, НовыйПланОстатковСОтбором, "СОтбором_", ОсновнойОперандПланаСОтбором, ЗнакКорректировки);
КонецЕсли;
Если Период.Активная Тогда
РезультатВычисления = Планирование.ВычислитьПоФормуле(Форма.СтруктураНастроек.Формула, СтрокаТоваров, Форма.Периоды, Период, Форма.СтруктураНастроек.ФормулаПредставление);
Если Форма.ИспользуютсяПланируемыеОстатки Тогда
СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицит_"+Период.ИмяКолонки] = СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицит_"+Период.ИмяКолонки]
+ ЗнакКорректировки * РезультатВычисления.Результат;
Если СтрокаТоваров.Свойство("НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки) Тогда
СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки] = СтрокаТоваров["НакопленныйПланируемыйКонечныйДефицитСОтбором_"+Период.ИмяКолонки]
+ ЗнакКорректировки * РезультатВычисления.Результат;
КонецЕсли;
КонецЕсли;
СтрокаТоваров["Формула_" + Период.ИмяКолонки] = Форма.СтруктураНастроек.Формула;
СтрокаТоваров["ФормулаПредставление_" + Период.ИмяКолонки] = РезультатВычисления.Представление;
СтрокаТоваров["ФормулаВычисление_" + Период.ИмяКолонки] = РезультатВычисления.Вычисление;
СтрокаТоваров["Количество_" + Период.ИмяКолонки] = РезультатВычисления.Результат;
СтрокаТоваров["Отклонение_" + Период.ИмяКолонки] = 0;
ПриИзмененииКоличестваСуммыСтроки(Форма.Объект, Форма, СтрокаТоваров);
КонецЕсли;
Если Период = ПоследнийПериод
И СтрокаТоваров.КоличествоУпаковок = 0 Тогда
УдаляемыеСтроки.Добавить(СтрокаТоваров);
КонецЕсли;
КонецЦикла;
ПредыдущийПериод = Период;
КонецЦикла;
Если Форма.СтруктураНастроек.ВариантЗаполненияСостава = "Формула"
Или Форма.СтруктураНастроек.ФильтроватьНезаполненныеСтроки Тогда
Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл
Форма.ПродукцияПоДатам.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДокументНаСервере(Знач ПараметрыЗадания, КэшированныеЗначения)
Если ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле") Тогда
ПодготовитьПараметрыЗаполненияДокументаПоФормуле(ПараметрыЗадания, КэшированныеЗначения);
ИначеЕсли ПараметрыЗадания.Свойство("ЗаполнятьПоПравилу") Тогда
ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения);
ИначеЕсли ПараметрыЗадания.Свойство("ЗаполнитьДляЗамещения") Тогда
ПодготовитьПараметрыЗаполненияДокументаДляЗамещения(ПараметрыЗадания, КэшированныеЗначения);
КонецЕсли;
Если ПараметрыЗадания.Свойство("ПланироватьПолуфабрикаты") Тогда
ПодготовитьПараметрыЗаполненияДокументаПолуфабрикатами(ПараметрыЗадания, КэшированныеЗначения);
КонецЕсли;
НаименованиеЗадания = НСтр("ru = 'Заполнение документа плана:'") + " " + Строка(Объект.Ссылка);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыВыполнения.ОжидатьЗавершение = 0;
ПараметрыВыполнения.ДополнительныйРезультат = ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле");
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
Результат = ДлительныеОперации.ВыполнитьВФоне(
"Документы.ПланПроизводства.ЗаполнитьДокумент",
ПараметрыЗадания,
ПараметрыВыполнения);
АдресХранилища = Результат.АдресРезультата;
Если ПараметрыЗадания.Свойство("ЗаполнятьПоФормуле") Тогда
АдресХранилищаДополнительный = Результат.АдресДополнительногоРезультата;
Иначе
АдресХранилищаДополнительный = "";
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоФормуле(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ТипПлана = Перечисления.ТипыПланов.ПланПроизводства;
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоАктивныхПериодов", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("НачалоПериодаСмещения", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("КонецПериодаСмещения", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("НеПереопределено", Истина);
ПараметрыЗадания.Вставить("ТипПлана", ТипПлана);
ПараметрыЗадания.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗадания.Вставить("НаправлениеДеятельности", НаправлениеДеятельности);
ПараметрыЗадания.Вставить("ЗаполнятьПоФормуле", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланПроизводства");
ПараметрыЗадания.Вставить("ИмяКолонкиРезультата", "КоличествоУпаковок");
ПараметрыЗадания.Вставить("ЗаполнятьНазначениеВТЧ", ЗаполнятьНазначениеВТЧ);
ПараметрыЗадания.Вставить("ЗаполнятьСпецификациюПоПериодам", ЗаполнятьСпецификациюПоПериодам);
ПараметрыЗадания.Вставить("ТипПроизводстванногоПроцесса", Объект.ТипПроизводственногоПроцесса);
ПараметрыЗадания.Вставить("ПараметрыВыбораСпецификаций", ПараметрыВыбораСпецификаций);
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборПоказатели = ПланированиеКлиентСервер.ОтборДляЗаполненияПоказателей(ТипПлана, ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыЗадания.Вставить("Отбор", ОтборПоказатели);
МассивИменНаборов = Новый Массив();
Если ПараметрыЗадания.Свойство("ЗаполнятьОперанды") Тогда
МассивОператоров = ПолучитьОперанды(ЭтотОбъект);
Для каждого Элемент Из МассивОператоров Цикл
МассивИменНаборов.Добавить(Элемент.Имя);
КонецЦикла;
КонецЕсли;
ПараметрыЗадания.Вставить("МассивИменНаборов", МассивИменНаборов);
ЗаполняемаяТЧ = Объект.Продукция.Выгрузить(Новый Структура("Полуфабрикат", Ложь));
Если ПараметрыЗадания.Свойство("ЗаполнятьСостав") Тогда
ЗаполняемаяТЧ.Очистить();
МассивИменНаборов = Новый Массив();
Если ПараметрыЗадания.ВариантЗаполненияСостава = "Формула" Тогда
МассивИменНаборов = ПланированиеКлиентСервер.ОперандыТекстовойФормулы(ПараметрыЗадания.Формула);
Иначе
МассивИменНаборов.Добавить(ПараметрыЗадания.ВариантЗаполненияСостава);
КонецЕсли;
ПараметрыЗадания.Вставить("МассивИменНаборовЗаполнения", МассивИменНаборов);
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
ПараметрыЗадания.КлючОбщихНастроек,
"НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор,
Настройки);
КонецПроцедуры
&НаСервере
Функция ПодготовитьПараметрыЗаполненияДокументаДляЗамещения(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ТипПлана = Перечисления.ТипыПланов.ПланПроизводства;
СтатусыЗаполнения = Планирование.ПолучитьСтатусыЗаполнения(Объект.Сценарий);
ПараметрыЗадания.Вставить("Статусы", СтатусыЗаполнения);
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоПериодаСмещения", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("КонецПериодаСмещения", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("ТипПлана", ТипПлана);
ПараметрыЗадания.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗадания.Вставить("ЗаполнятьНазначениеВТЧ",
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидПлана,"ЗаполнятьНазначениеВТЧ"));
ПараметрыЗадания.Вставить("Назначение", Объект.Назначение);
ПараметрыЗадания.Вставить("ЗаполнитьДляЗамещения", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланПроизводства");
ПараметрыЗадания.Вставить("ИмяКолонкиРезультата", "КоличествоУпаковок");
ЗаполняемаяТЧ = Объект.Продукция.Выгрузить(Новый Структура("Полуфабрикат", Ложь));
Настройки = Новый Структура;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ПараметрыЗадания.КлючОбщихНастроек, "НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор, Настройки);
КонецФункции
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения)
Если Объект.ОбновитьДополнить <> 0 Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗадания.Вставить("КроссТаблица", Объект.КроссТаблица);
ПараметрыЗадания.Вставить("ИзменитьРезультатНа", Объект.ИзменитьРезультатНа);
ПараметрыЗадания.Вставить("ТочностьОкругления", Объект.ТочностьОкругления);
ПараметрыЗадания.Вставить("Статус", Объект.Статус);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ПараметрыЗадания.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗадания.Вставить("Назначение", Объект.Назначение);
ПараметрыЗадания.Вставить("ЗаполнятьПоПравилу", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланПроизводства");
ПараметрыЗадания.Вставить("ЗаполнятьСпецификациюПоПериодам", ЗаполнятьСпецификациюПоПериодам);
ПараметрыЗадания.Вставить("ТипПроизводстванногоПроцесса", Объект.ТипПроизводственногоПроцесса);
ПараметрыЗадания.Вставить("ПараметрыВыбораСпецификаций", ПараметрыВыбораСпецификаций);
ЗаполняемаяТЧ = Объект.Продукция.Выгрузить(Новый Структура("Полуфабрикат", Ложь));
Если Объект.ОбновитьДополнить = 0 Тогда
ЗаполняемаяТЧ.Очистить();
КонецЕсли;
Если НЕ ОтборУстановлен Тогда
ПараметрыОтбора = ПараметрыОтбора(ЭтаФорма);
ПараметрыВидаПлана = ПараметрыВидаПлана(ЭтаФорма);
ОтборЗначения = ПланированиеКлиентСервер.ОтборДляВыборки(ПараметрыОтбора, ПараметрыВидаПлана);
ПараметрыЗадания.Вставить("Отбор", ОтборЗначения);
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ПравилоЗаполнения", ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Настройки.Вставить("ПользовательскиеНастройки", ПолучитьИзВременногоХранилища(АдресПользовательскихНастроек));
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
ПараметрыЗадания.КлючОбщихНастроек,
"НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор,
Настройки);
КонецПроцедуры
&НаСервере
Функция ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения, ЗаполнениеПолуфабрикатов = Ложь)
Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("Документ.ПланПроизводства.Формы.ФормаДокумента.ПолучитьРезультатЗаполненияНаСервере");
Таблица = ПолучитьИзВременногоХранилища(АдресХранилища);
КоличествоОбработанныхСтрок = Таблица.Количество();
Объект.Продукция.Загрузить(Таблица);
НовоеНачалоПериода = Объект.НачалоПериода;
КоличествоОпераций = 0;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(
Объект.Продукция,
СтруктураДействий,
КэшированныеЗначения);
Для каждого СтрокаТовара Из Объект.Продукция Цикл
КоличествоОпераций = КоличествоОпераций + 1;
Если СтрокаТовара.Полуфабрикат
И ЗначениеЗаполнено(СтрокаТовара.ДатаВыпуска)
И СтрокаТовара.ДатаВыпуска < Объект.НачалоПериода Тогда
НовоеНачалоПериода = Мин(НовоеНачалоПериода, СтрокаТовара.ДатаВыпуска);
КонецЕсли;
КонецЦикла;
ОценкаПроизводительности.ЗафиксироватьЗамерДлительнойОперации(Замер,
КоличествоОпераций/10,
"ОбработкаСтрокТЧ");
Если ЗаполнятьСпецификацию И НовоеНачалоПериода < Объект.НачалоПериода Тогда
Объект.НачалоПериода = НовоеНачалоПериода;
ПриИзмененииПериодовНаСервере(Истина);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Начало периода плана скорректировано автоматически по периодам полуфабрикатов.'"),
Объект.Ссылка,
"Объкт.НачалоПериода");
КонецЕсли;
ЗаполнитьДатыЗапускаПродукции();
ИспользуютсяПланируемыеОстатки = Таблица.Колонки.Найти("ПланируемыеНачальныеОстатки") <> Неопределено
И Не ЗаполнениеПолуфабрикатов;
ИспользуютсяПланируемыеОстаткиСОтбором = Таблица.Колонки.Найти("ПланируемыеНачальныеОстаткиСОтбором") <> Неопределено
И Не ЗаполнениеПолуфабрикатов;
Если ИспользуютсяПланируемыеОстатки Тогда
ПериодыПлановОстатка.Очистить();
ПериодыПлановОстаткаСОтбором.Очистить();
Для Каждого Строка Из Таблица Цикл
Если Строка.ПланируемыеНачальныеОстатки<>0 Тогда
Если ПериодыПлановОстатка.НайтиПоЗначению(Строка.ДатаВыпуска) = Неопределено Тогда
ПериодыПлановОстатка.Добавить(Строка.ДатаВыпуска);
КонецЕсли;
КонецЕсли;
Если ИспользуютсяПланируемыеОстаткиСОтбором
И Строка.ПланируемыеНачальныеОстаткиСОтбором<>0 Тогда
Если ПериодыПлановОстаткаСОтбором.НайтиПоЗначению(Строка.ДатаВыпуска) = Неопределено Тогда
ПериодыПлановОстаткаСОтбором.Добавить(Строка.ДатаВыпуска);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(АдресХранилищаДополнительный)
И ПолучитьИзВременногоХранилища(АдресХранилищаДополнительный) <> Неопределено Тогда
ТаблицаПериоды = ПолучитьИзВременногоХранилища(АдресХранилищаДополнительный);
Иначе
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
КонецЕсли;
ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, Ложь);
ОценкаПроизводительности.ЗафиксироватьЗамерДлительнойОперации(Замер,
ЭтаФорма.ПолучитьРеквизиты("ПродукцияПоДатам").Количество()/10,
"ОбновитьСтруктуруКроссТаблицы");
СкопироватьВКроссТаблицу(КэшированныеЗначения);
Объект.ЗаполненоАвтоматически = Истина;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
ЗаполнитьСпецификациюВСтрокахПродукции(,Истина,ЗаполнениеПолуфабрикатов);
ОтборПоТипуНоменклатуры = НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь);
ОтборПоТипуНоменклатуры.Добавить(Перечисления.ТипыНоменклатуры.Работа);
Если Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки Тогда
Продукция = ПродукцияПоДатам;
Иначе
Продукция = Объект.Продукция;
КонецЕсли;
Индекс = Продукция.Количество();
Пока Индекс > 0 Цикл
Индекс = Индекс -1;
СтрокаТЧ = Продукция[Индекс];
Если ОтборПоТипуНоменклатуры.Найти(СтрокаТЧ.ТипНоменклатуры) = Неопределено
ИЛИ (СтруктураНастроек.ФильтроватьПоНаличиюСпецификации И СтрокаТЧ.Спецификация.Пустая()) Тогда
Продукция.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
ЕстьПолуфабрикаты = Продукция.НайтиСтроки(Новый Структура("Полуфабрикат", Истина)).Количество() > 0;
ЗначенияБылиПересчитаны = Ложь;
Если Объект.ЗаполнятьПоФормуле
И СтруктураНастроек <> Неопределено
И (ИспользуютсяПланируемыеОстатки
Или (Объект.КроссТаблица
И (СтрНайти(СтруктураНастроек.Формула,"НомерТекущейКолонки") <> 0
Или СтрНайти(СтруктураНастроек.Формула,"ЗначениеКолонки") <> 0))) Тогда
ЗначенияБылиПересчитаны = Истина;
ОбработатьРезультатЗаполненияПоФормуле(ЭтаФорма);
ИначеЕсли СтруктураНастроек.ФильтроватьНезаполненныеСтроки Тогда
УдаляемыеСтроки = Новый Массив;
Для Каждого СтрокаТоваров Из Продукция Цикл
Если СтрокаТоваров.КоличествоУпаковок = 0 Тогда
УдаляемыеСтроки.Добавить(СтрокаТоваров);
КонецЕсли;
КонецЦикла;
Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл
Продукция.Удалить(УдаляемаяСтрока);
КонецЦикла;
КонецЕсли;
Если Не Объект.КроссТаблица И ИспользуютсяПланируемыеОстатки Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
Если Не Объект.КроссТаблица Или ЗначенияБылиПересчитаны Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
РассчитатьКоличествоСтрок(ЭтаФорма);
ИспользуютсяПланируемыеОстатки = Ложь;
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанныхСтрок/10);
КонецФункции
&НаКлиенте
Процедура ЗаполнитьДокументОтветНаВопрос(Результат, Настройки) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Настройки.Вставить("ПланироватьПолуфабрикаты", Истина);
ЗаполнитьДокументЗавершение(Настройки);
ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда
Если Настройки.Свойство("ПланироватьПолуфабрикаты") Тогда
Настройки.Удалить("ПланироватьПолуфабрикаты")
КонецЕсли;
ЗаполнитьДокументЗавершение(Настройки);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДокументЗавершение(Настройки)
ОповеститьПользователяОНачалеЗаполненииДанных();
БылиЗапланированыПолуфабрикаты = ЕстьПолуфабрикаты;
Результат = ЗаполнитьДокументНаСервере(Настройки, КэшированныеЗначения);
Если НЕ Результат.Статус = "Выполнено" Тогда
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗаполнитьДокументОповещение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания);
Иначе
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения);
Если Объект.ЗаполнятьПоФормуле
И Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(
ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
КонецЕсли;
ОповеститьПользователяОЗаполненииДанных();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДокументОповещение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
Попытка
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения);
Если Объект.ЗаполнятьПоФормуле
И Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(
ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
КонецЕсли;
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Ложь);
ОповеститьПользователяОЗаполненииДанных();
Исключение
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПолуфабрикатами(ПараметрыЗадания, КэшированныеЗначения)
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
ПараметрыЗадания.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗадания.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыЗадания.Вставить("НачалоПериода", Объект.НачалоПериода);
ПараметрыЗадания.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗадания.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗадания.Вставить("ПланироватьПолуфабрикаты", Истина);
ПараметрыЗадания.Вставить("КлючОбщихНастроек", "Документ.ПланПроизводства");
ПараметрыЗадания.Вставить("ЗаполнятьСпецификациюПоПериодам", ЗаполнятьСпецификациюПоПериодам);
ПараметрыЗадания.Вставить("ТипПроизводственногоПроцесса", Объект.ТипПроизводственногоПроцесса);
ПараметрыЗадания.Вставить("ПараметрыВыбораСпецификаций", ПараметрыВыбораСпецификаций);
ПараметрыЗадания.Вставить("УправлениеПроизводством2_2", Объект.УправлениеПроизводством2_2);
ПараметрыЗадания.Вставить("Сценарий", Объект.Сценарий);
ПараметрыЗадания.Вставить("СпособРасчетаПотребностейВМатериалах", Объект.СпособРасчетаПотребностейВМатериалах);
ПараметрыЗадания.Вставить("ПереноситьПотребностьПодразделенийЧерезПеремещения", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидПлана, "ПереноситьПотребностьПодразделенийЧерезПеремещения"));
ЗаполняемаяТЧ = Объект.Продукция.Выгрузить(Новый Структура("Полуфабрикат", Ложь));
Настройки = Новый Структура;
Если ПараметрыЗадания.Свойство("ЗаполнятьПоПравилу") Тогда
Настройки.Вставить("ПравилоЗаполнения", ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Настройки.Вставить("ПользовательскиеНастройки", ПолучитьИзВременногоХранилища(АдресПользовательскихНастроек));
КонецЕсли;
Настройки.Вставить("ЗаполняемаяТЧ", ЗаполняемаяТЧ);
Настройки.Вставить("Периоды", ЭтаФорма.Периоды.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
ПараметрыЗадания.КлючОбщихНастроек,
"НастройкиФоновогоЗадания_"+ПараметрыЗадания.УникальныйИдентификатор,
Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ЗапланироватьПолуфабрикатыЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ЗапланироватьПолуфабрикатыНаКлиенте();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗапланироватьПолуфабрикатыНаКлиенте()
ОповеститьПользователяОНачалеЗаполненииДанных();
Настройки = Новый Структура;
Настройки.Вставить("ПланироватьПолуфабрикаты", Истина);
Результат = ЗаполнитьДокументНаСервере(Настройки, КэшированныеЗначения);
Если НЕ Результат.Статус = "Выполнено" Тогда
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗапланироватьПолуфабрикатыОповещение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания);
Иначе
ПолучитьРезультатЗаполненияПолуфабрикатов();
ОповеститьПользователяОЗаполненииДанных();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗапланироватьПолуфабрикатыОповещение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
Попытка
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения, Истина);
Если Объект.ЗаполнятьПоФормуле
И Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(
ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
КонецЕсли;
ОповеститьПользователяОЗаполненииДанных();
Исключение
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьРезультатЗаполненияПолуфабрикатов()
НовоеНачалоПериода = Неопределено;
Если ЕстьИзменениеПериодаПриЗаполненииПолуфабрикатов(НовоеНачалоПериода, КэшированныеЗначения) Тогда
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Изменить периоды и добавить полуфабрикаты'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена);
ТекстВопроса = НСтр("ru = 'Для добавления полуфабрикатов необходимо изменить период планирования с %НачалоПериода% по %ОкончаниеПериода%. Изменить период?'");
ТекстВопроса = СтрЗаменить(ТекстВопроса, "%НачалоПериода%", Формат(НовоеНачалоПериода, "ДЛФ=D"));
ТекстВопроса = СтрЗаменить(ТекстВопроса, "%ОкончаниеПериода%", Формат(Объект.ОкончаниеПериода, "ДЛФ=D"));
ДополнительныеПараметры = Новый Структура("НовоеНачалоПериода", НовоеНачалоПериода);
Оповещение = Новый ОписаниеОповещения("ПолучитьРезультатЗаполненияПолуфабрикатовЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки);
Возврат;
Иначе
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения, Истина);
КонецЕсли;
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Ложь);
КонецПроцедуры
&НаСервере
Функция ЕстьИзменениеПериодаПриЗаполненииПолуфабрикатов(НовоеНачалоПериода, КэшированныеЗначения)
Таблица = ПолучитьИзВременногоХранилища(АдресХранилища);
НайденныеСтроки = Таблица.НайтиСтроки(Новый Структура("Полуфабрикат", Истина));
Если НайденныеСтроки.Количество() = 0 Тогда
Возврат Ложь;
Иначе
НовоеНачалоПериода = Объект.НачалоПериода;
Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
Если ЗначениеЗаполнено(НайденнаяСтрока.ДатаВыпуска) И НайденнаяСтрока.ДатаВыпуска < Объект.НачалоПериода Тогда
НовоеНачалоПериода = Мин(НовоеНачалоПериода, НайденнаяСтрока.ДатаВыпуска);
КонецЕсли;
КонецЦикла;
Если НовоеНачалоПериода < Объект.НачалоПериода Тогда
НовоеНачалоПериода = ПланированиеКлиентСервер.РассчитатьДатуНачалаПериода(НовоеНачалоПериода, Объект.Периодичность);
Возврат Истина;
КонецЕсли;
КонецЕсли;
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения, Истина);
Возврат Ложь;
КонецФункции
&НаКлиенте
Процедура ПолучитьРезультатЗаполненияПолуфабрикатовЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ПолучитьРезультатЗаполненияПолуфабрикатовНаСервере(ДополнительныеПараметры.НовоеНачалоПериода, КэшированныеЗначения);
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Ложь);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьРезультатЗаполненияПолуфабрикатовНаСервере(НовоеНачалоПериода, КэшированныеЗначения)
Объект.НачалоПериода = ПланированиеКлиентСервер.РассчитатьДатуНачалаПериода(НовоеНачалоПериода, Объект.Периодичность);
ПриИзмененииПериодовНаСервере();
ПолучитьРезультатЗаполненияНаСервере(КэшированныеЗначения, Истина);
КонецПроцедуры
#КонецОбласти
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьОповещениеПолуфабрикатов(Форма, НеобходимоПерепланировать)
Форма.Элементы.ГруппаОповещенияПолуфабрикатов.Видимость = НеобходимоПерепланировать
И Форма.ЗаполнятьСпецификацию
И Форма.ЕстьПолуфабрикаты
И НЕ Форма.ПланироватьПолуфабрикатыАвтоматически;
КонецПроцедуры
&НаСервере
Процедура УдалитьПолуфабрикатыНаСервере()
Если Объект.КроссТаблица Тогда
Продукция = ПродукцияПоДатам;
Иначе
Продукция = Объект.Продукция;
КонецЕсли;
НайденныеСтроки = Продукция.НайтиСтроки(Новый Структура("Полуфабрикат", Истина));
Для каждого СтрокаТЧ Из НайденныеСтроки Цикл
Продукция.Удалить(СтрокаТЧ);
КонецЦикла;
ПолуфабрикатыПоДатам.Очистить();
ВсеПолуфабрикатыПоДатам.Очистить();
ЕстьПолуфабрикаты = Продукция.НайтиСтроки(Новый Структура("Полуфабрикат", Истина)).Количество() > 0;
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура УдалитьПустыеСтрокиНаСервере()
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
НеобходимоПересчитыватьИтоги = Ложь;
Индекс = ПродукцияПоДатам.Количество() -1;
Пока Индекс >= 0 Цикл
СтрокаТЧ = ПродукцияПоДатам[Индекс];
Если СтрокаТЧ.КоличествоУпаковок <> 0 Тогда
Индекс = Индекс - 1;
Продолжить;
КонецЕсли;
ЭтоПустаяСтрока = Истина;
Для каждого Период Из АктивныеПериоды Цикл
Если СтрокаТЧ["Количество_"+Период.ИмяКолонки] <> 0 Тогда
ЭтоПустаяСтрока = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоПустаяСтрока Тогда
ПродукцияПоДатам.Удалить(Индекс);
НеобходимоПересчитыватьИтоги = Истина;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Если НеобходимоПересчитыватьИтоги Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПоДатамПриАктивизацииЯчейкиНаКлиенте()
Если Объект.ЗаполнятьПоФормуле Тогда
ПланированиеКлиентСервер.ОтобразитьЗначениеДополнительныхПараметров(ЭтотОбъект, ПолучитьДопРеквизиты(ЭтотОбъект), "ПродукцияПоДатам");
КонецЕсли;
АктивныеПериоды = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина));
ТекущиеДанные = Элементы.ПродукцияПоДатам.ТекущиеДанные;
Если АктивныеПериоды.Количество() = 1 Тогда
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущиеДанные <> Неопределено Тогда
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущиеДанные, "Расшифровка_" + АктивныеПериоды[0].ИмяКолонки);
КонецЕсли;
Возврат;
КонецЕсли;
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
ЯчейкаНайдена = Ложь;
Если Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПолуфабрикатыКроссТаблица Тогда
Элемент = Элементы.ПолуфабрикатыПоДатам;
ЭлементыЯчейкаОтменена = Элементы.ЯчейкаОтменена1;
ЭлементыКомментарийКЯчейке = Элементы.КомментарийКЯчейке1;
ПолеПродукция = "ПолуфабрикатыПоДатамКоличество_";
Иначе
Элемент = Элементы.ПродукцияПоДатам;
ЭлементыЯчейкаОтменена = Элементы.ЯчейкаОтменена;
ЭлементыКомментарийКЯчейке = Элементы.КомментарийКЯчейке;
ПолеПродукция = "ПродукцияПоДатам" + "Количество_";
КонецЕсли;
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ТекущиеДанные = Неопределено
Или (ТекущиеДанные.Полуфабрикат
И Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница <> Элементы.ГруппаПолуфабрикатыКроссТаблица) Тогда
ЭлементыЯчейкаОтменена.Доступность = ЯчейкаНайдена;
ЭлементыКомментарийКЯчейке.Доступность = ЯчейкаНайдена;
Возврат;
КонецЕсли;
Если Элемент.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из АктивныеПериоды Цикл
Если Элемент.ТекущийЭлемент.Имя = ПолеПродукция+Период.ИмяКолонки Тогда
ЯчейкаОтменена = ТекущиеДанные["Отменено_"+ Период.ИмяКолонки];
КомментарийКЯчейке = ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки];
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущиеДанные["Количество_"+ Период.ИмяКолонки] <> 0 Тогда
Расшифровка = ПланированиеКлиент.СформироватьРасшифровку(ТекущиеДанные, "Расшифровка_"+ Период.ИмяКолонки);
Иначе
Расшифровка = "";
КонецЕсли;
ЯчейкаНайдена = Истина;
Прервать;
Иначе
Расшифровка = "";
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЭлементыЯчейкаОтменена.Доступность = ЯчейкаНайдена;
ЭлементыКомментарийКЯчейке.Доступность = ЯчейкаНайдена;
КонецПроцедуры
&НаСервере
Процедура НазадКПродукцииНаСервере()
Отбор = Новый Структура("Номенклатура, Характеристика, Назначение, Спецификация");
ЗаполнитьЗначенияСвойств(Отбор, ПолуфабрикатыПоДатам[0]);
СтрокиКУдалению = ВсеПолуфабрикатыПоДатам.НайтиСтроки(Отбор);
Для Каждого СтрокаКУдалению Из СтрокиКУдалению Цикл
ВсеПолуфабрикатыПоДатам.Удалить(СтрокаКУдалению);
КонецЦикла;
Для Каждого Строка Из ПолуфабрикатыПоДатам Цикл
НоваяСтрока = ВсеПолуфабрикатыПоДатам.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
КонецЦикла;
Отбор.Вставить("Полуфабрикат", Истина);
СтрокаПолуфабрикат = ПродукцияПоДатам.НайтиСтроки(Отбор)[0];
СтрокаПолуфабрикат.Количество = 0;
Для каждого СтрокаПериода Из ЭтаФорма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаПолуфабрикат["Количество_" + СтрокаПериода.ИмяКолонки] = 0;
Для Каждого Строка Из ПолуфабрикатыПоДатам Цикл
Если Строка["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
СтрокаПолуфабрикат["Количество_" + СтрокаПериода.ИмяКолонки] = СтрокаПолуфабрикат["Количество_" + СтрокаПериода.ИмяКолонки] + Строка["Количество_" + СтрокаПериода.ИмяКолонки];
СтрокаПолуфабрикат.Количество = СтрокаПолуфабрикат.Количество + Строка["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
КонецЦикла;
СтрокаПолуфабрикат.КоличествоУпаковок = СтрокаПолуфабрикат.Количество;
Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПродукцияКроссТаблица;
КонецПроцедуры
&НаСервере
Процедура ПродукцияПоДатамВыборНаСервере(Отбор)
ПолуфабрикатыПоДатам.Загрузить(ВсеПолуфабрикатыПоДатам.Выгрузить(Отбор));
Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПолуфабрикатыКроссТаблица;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПланыПоДефицитуНаСервере(КэшированныеЗначения)
ТекушийОбъект = РеквизитФормыВЗначение("Объект");
Планирование.ЗаполнитьПланыПоДефициту(Объект.Сценарий,
Объект.ВидПлана,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекушийОбъект);
ЗначениеВДанныеФормы(ТекушийОбъект, Объект);
КоличествоОпераций = 0;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(
Объект.Продукция,
СтруктураДействий,
КэшированныеЗначения);
Для каждого СтрокаТовара Из Объект.Продукция Цикл
КоличествоОпераций = КоличествоОпераций + 1;
Если СтрокаТовара.Полуфабрикат
И ЗначениеЗаполнено(СтрокаТовара.ДатаВыпуска)
И СтрокаТовара.ДатаВыпуска < Объект.НачалоПериода Тогда
НовоеНачалоПериода = Мин(НовоеНачалоПериода, СтрокаТовара.ДатаВыпуска);
КонецЕсли;
КонецЦикла;
ЗаполнитьСпецификациюВСтрокахПродукции(,Истина);
ЗаполнитьДатыЗапускаПродукции();
ЗаполнитьСлужебныеРеквизиты();
ОтборПоТипуНоменклатуры = НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре(Ложь);
ОтборПоТипуНоменклатуры.Добавить(Перечисления.ТипыНоменклатуры.Работа);
Продукция = Объект.Продукция;
Индекс = Продукция.Количество();
Пока Индекс > 0 Цикл
Индекс = Индекс -1;
СтрокаТЧ = Продукция[Индекс];
Если ОтборПоТипуНоменклатуры.Найти(СтрокаТЧ.ТипНоменклатуры) = Неопределено Тогда
Продукция.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
РассчитатьКоличествоСтрок(ЭтаФорма);
КонецПроцедуры
#КонецОбласти
#Область ЗамещениеПланов
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыЗамещения(Знач Объект)
ПараметрыЗамещения = Новый Структура;
ПараметрыЗамещения.Вставить("Ссылка", Объект.Ссылка);
ПараметрыЗамещения.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыЗамещения.Вставить("Статус", Объект.Статус);
ПараметрыЗамещения.Вставить("Дата", Объект.Дата);
ПараметрыЗамещения.Вставить("НачалоПериодаЗамещения", Объект.НачалоПериодаЗамещения);
ПараметрыЗамещения.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
ПараметрыЗамещения.Вставить("Периодичность", Объект.Периодичность);
ПараметрыЗамещения.Вставить("Подразделение", Объект.Подразделение);
ПараметрыЗамещения.Вставить("Назначение", Объект.Назначение);
Возврат ПараметрыЗамещения
КонецФункции
&НаСервере
Процедура ОбновитьПризнакЗамещения()
Для Каждого Строка Из Объект.Продукция Цикл
Строка.Замещен = Ложь;
Строка.ЗамещенКЗаказу = Ложь;
КонецЦикла;
Если Не Объект.Замещающий Тогда
Возврат;
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| ЗамещенныеПериоды.ЗамещенныйПериод КАК ЗамещенныйПериод,
| ЗамещенныеПериоды.ЗамещенКЗаказу КАК ЗамещенКЗаказу,
| ЗамещенныеПериоды.Замещен КАК Замещен
|ПОМЕСТИТЬ ЗамещенныеПериоды
|ИЗ
| &ЗамещенныеПериоды КАК ЗамещенныеПериоды
|;
|
|
|ВЫБРАТЬ
| &ДатаЗапускаВыпуска КАК Дата,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаЗапускаВыпуска, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаЗапускаВыпуска, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаЗапускаВыпуска, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаЗапускаВыпуска, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаЗапускаВыпуска, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаЗапускаВыпуска, ГОД)
| ИНАЧЕ &ДатаЗапускаВыпуска
| КОНЕЦ КАК Период,
| Продукция.Полуфабрикат КАК Полуфабрикат,
| Продукция.ДатаВыпускаПродукцииПолуфабриката КАК ДатаВыпускаПродукцииПолуфабриката,
| ВЫБОР &Периодичность
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
| ТОГДА НАЧАЛОПЕРИОДА(Продукция.ДатаВыпускаПродукцииПолуфабриката, НЕДЕЛЯ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
| ТОГДА НАЧАЛОПЕРИОДА(Продукция.ДатаВыпускаПродукцииПолуфабриката, ДЕКАДА)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
| ТОГДА НАЧАЛОПЕРИОДА(Продукция.ДатаВыпускаПродукцииПолуфабриката, МЕСЯЦ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
| ТОГДА НАЧАЛОПЕРИОДА(Продукция.ДатаВыпускаПродукцииПолуфабриката, КВАРТАЛ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
| ТОГДА НАЧАЛОПЕРИОДА(Продукция.ДатаВыпускаПродукцииПолуфабриката, ПОЛУГОДИЕ)
| КОГДА ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
| ТОГДА НАЧАЛОПЕРИОДА(Продукция.ДатаВыпускаПродукцииПолуфабриката, ГОД)
| ИНАЧЕ Продукция.ДатаВыпускаПродукцииПолуфабриката
| КОНЕЦ КАК ПериодПродукцииПолуфабрика
|ПОМЕСТИТЬ Продукция
|ИЗ
| &Продукция КАК Продукция
|;
|
|
|ВЫБРАТЬ
| Продукция.Дата КАК Дата,
| Продукция.Период КАК Период,
| Продукция.Полуфабрикат КАК Полуфабрикат
|ПОМЕСТИТЬ ПродукцияОбъединение
|ИЗ
| Продукция КАК Продукция
|ГДЕ
| НЕ Продукция.Полуфабрикат
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Продукция.ДатаВыпускаПродукцииПолуфабриката,
| Продукция.ПериодПродукцииПолуфабрика,
| Продукция.Полуфабрикат
|ИЗ
| Продукция КАК Продукция
|ГДЕ
| Продукция.Полуфабрикат
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПродукцияОбъединение.Дата КАК Дата,
| МАКСИМУМ(ЗамещенныеПериоды.ЗамещенКЗаказу) КАК ЗамещенКЗаказу,
| МАКСИМУМ(ЗамещенныеПериоды.Замещен) КАК Замещен,
| ПродукцияОбъединение.Полуфабрикат КАК Полуфабрикат
|ИЗ
| ЗамещенныеПериоды КАК ЗамещенныеПериоды
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПродукцияОбъединение КАК ПродукцияОбъединение
| ПО ЗамещенныеПериоды.ЗамещенныйПериод = ПродукцияОбъединение.Период
|
|СГРУППИРОВАТЬ ПО
| ПродукцияОбъединение.Дата,
| ПродукцияОбъединение.Полуфабрикат";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
"&ДатаЗапускаВыпуска",
?(ЭтоРазборка, "Продукция.ДатаЗапуска", "Продукция.ДатаВыпуска"));
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ЗамещенныеПериоды", ЗамещенныеПериоды.Выгрузить());
Запрос.УстановитьПараметр("Продукция", Объект.Продукция.Выгрузить());
Запрос.УстановитьПараметр("Периодичность", Объект.Периодичность);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить("Полуфабрикат", Выборка.Полуфабрикат);
Если Выборка.Полуфабрикат Тогда
СтруктураПоиска.Вставить("ДатаВыпускаПродукцииПолуфабриката", Выборка.Дата);
Иначе
СтруктураПоиска.Вставить(?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска"), Выборка.Дата);
КонецЕсли;
ЗамещаемыеСтроки = Объект.Продукция.НайтиСтроки(СтруктураПоиска);
Для Каждого Строка Из ЗамещаемыеСтроки Цикл
Строка.Замещен = Выборка.Замещен;
Строка.ЗамещенКЗаказу = Выборка.ЗамещенКЗаказу;;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьЗамещенныеПериоды()
ПараметрыЗамещения = ПараметрыЗамещения(Объект);
Результат = Планирование.ПолучитьЗамещенныеПериоды(ПараметрыЗамещения, "ПланПроизводства", "НачалоПериодаЗамещения");
ЗамещенныеПериоды.Загрузить(Результат);
КонецФункции
&НаКлиенте
Процедура ЗамещениеФорматированнаяСтрокаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = ПараметрыЗамещения(Объект);
ПараметрыФормы.Вставить("НавигационнаяСсылкаФорматированнойСтроки", НавигационнаяСсылкаФорматированнойСтроки);
ОткрытьФорму("РегистрСведений.ЗамещениеПланов.Форма.ЗамещениеПланов", ПараметрыФормы);
КонецПроцедуры
&НаСервереБезКонтекста
Функция КонтрольЗамещенияПланаНаСервере(Ссылка)
Возврат Планирование.КонтрольЗамещенияПлана(Ссылка);
КонецФункции
&НаСервере
Процедура ОбновитьНачалоПериодаЗамещения()
ТекстЗапроса =
"ВЫБРАТЬ
| Продукция.Полуфабрикат КАК Полуфабрикат,
| &ДатаЗапускаВыпуска КАК Дата,
| Продукция.Количество КАК Количество
|ПОМЕСТИТЬ Продукция
|ИЗ
| &Продукция КАК Продукция
|;
|
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| Продукция.Дата КАК Дата
|ИЗ
| Продукция КАК Продукция
|ГДЕ
| НЕ Продукция.Полуфабрикат
| И Продукция.Дата >= &НачалоПериода
|
|УПОРЯДОЧИТЬ ПО
| Дата";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
"&ДатаЗапускаВыпуска",
?(ЭтоРазборка, "Продукция.ДатаЗапуска", "Продукция.ДатаВыпуска"));
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Продукция", Объект.Продукция.Выгрузить());
Запрос.УстановитьПараметр("НачалоПериода",Объект.НачалоПериода);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Объект.НачалоПериодаЗамещения = Выборка.Дата;
Иначе
Объект.НачалоПериодаЗамещения = Объект.НачалоПериода;
КонецЕсли;
Объект.НачалоПериодаЗамещения = ПланированиеКлиентСерверПовтИсп.РассчитатьДатуНачалаПериода(Объект.НачалоПериодаЗамещения, Объект.Периодичность);
КонецПроцедуры
#КонецОбласти
#Область КорректировкиПлановыхПотребностей
&НаКлиенте
Процедура ДекорацияОтмененныеКорректировкиПотребностейНажатие(Элемент)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("План", Объект.Ссылка);
ПараметрыФормы.Вставить("ПоказыватьНазначение", Элементы.ПродукцияНазначение.Видимость);
ПараметрыФормы.Вставить("Отбор", Новый Структура("План", Объект.Ссылка));
ОткрытьФорму(
"Документ.КорректировкаПлановыхПотребностей.Форма.ФормаСписка",
ПараметрыФормы,
ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ДекорацияОтмененныеКорректировкиПотребностейКПроверкеНажатие(Элемент)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("План", Объект.Ссылка);
ПараметрыФормы.Вставить("ПоказыватьНазначение", Элементы.ПродукцияНазначение.Видимость);
ПараметрыФормы.Вставить("Отбор", Новый Структура("План", Объект.Ссылка));
ПараметрыФормы.Вставить("Статус", ПредопределенноеЗначение("Перечисление.СтатусыПлановыхКорректировок.КПроверке"));
ОткрытьФорму(
"Документ.КорректировкаПлановыхПотребностей.Форма.ФормаСписка",
ПараметрыФормы,
ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура СкорректироватьПотребность(Команда)
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("План", Объект.Ссылка);
ДанныеЗаполнения.Вставить("Сценарий", Объект.Сценарий);
ДанныеЗаполнения.Вставить("ВидПлана", Объект.ВидПлана);
ДанныеЗаполнения.Вставить("Период", Объект.НачалоПериода);
ДанныеЗаполнения.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
ДанныеЗаполнения.Вставить("Характеристика", ТекущаяСтрока.Характеристика);
ДанныеЗаполнения.Вставить("Назначение", ТекущаяСтрока.Назначение);
ДанныеЗаполнения.Вставить("Количество", ТекущаяСтрока.Количество);
ПараметрыФормы = Новый Структура("ДанныеЗаполнения", ДанныеЗаполнения);
ОткрытьФорму("Документ.КорректировкаПлановыхПотребностей.Форма.ФормаДокумента", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура СкорректироватьПотребностьЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
ТекущаяСтрока.Количество = ДополнительныеПараметры.КОбеспечению;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, Новый Структура("ПересчитатьКоличествоУпаковок"), КэшированныеЗначения);
Элементы.Продукция.РежимВводаСтрок = РежимВводаСтрокТаблицы.ПослеТекущейСтроки;
Если ЗначениеЗаполнено(ДополнительныеПараметры.НоменклатураКорректировка)
И ДополнительныеПараметры.КОбеспечениюКорректировка > 0 Тогда
ПараметрыОтбора = Новый Структура();
ПараметрыОтбора.Вставить("Номенклатура", ДополнительныеПараметры.НоменклатураКорректировка);
ПараметрыОтбора.Вставить("Характеристика", ДополнительныеПараметры.ХарактеристикаКорректировка);
ПараметрыОтбора.Вставить("Назначение", ДополнительныеПараметры.НазначениеКорректировка);
СтрокиКорректировки = Объект.Продукция.НайтиСтроки(ПараметрыОтбора);
Если СтрокиКорректировки.Количество()>0 Тогда
СтрокиКорректировки[0].Количество = ДополнительныеПараметры.КОбеспечениюКорректировка;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокиКорректировки[0], Новый Структура("ПересчитатьКоличествоУпаковок"), КэшированныеЗначения);
Иначе
НоваяСтрока = Объект.Продукция.Добавить();
НоваяСтрока.Номенклатура = ДополнительныеПараметры.НоменклатураКорректировка;
НоваяСтрока.Характеристика = ДополнительныеПараметры.ХарактеристикаКорректировка;
НоваяСтрока.Назначение = ДополнительныеПараметры.НазначениеКорректировка;
НоваяСтрока.Количество = ДополнительныеПараметры.КОбеспечениюКорректировка;
НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество;
НоваяСтрока.ДатаВыпуска = ДополнительныеПараметры.Период;
ПродукцияНоменклатураПриИзмененииНаСервере(НоваяСтрока.ПолучитьИдентификатор(), КэшированныеЗначения);
КонецЕсли;
КонецЕсли;
Элементы.Продукция.РежимВводаСтрок = РежимВводаСтрокТаблицы.ВКонецСписка;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузкаДанныхИзФайла
&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайла(ДополнительныеПараметры)
ПараметрыЗагрузки = ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных();
ПараметрыЗагрузки.ПолноеИмяТабличнойЧасти = "ПланПроизводства.Продукция";
ПараметрыЗагрузки.Заголовок = НСтр("ru = 'Загрузка таблицы ""Продукция"" из файла'");
ПараметрыЗагрузки.ДополнительныеПараметры = ДополнительныеПараметры;
ПараметрыЗагрузки.КолонкиМакета = ПланированиеКлиент.ОписаниеКолонокМакетаДляЗагрузкиНоменклатуры(ДополнительныеПараметры);
Оповещение = Новый ОписаниеОповещения("ПоказатьФормуЗагрузкиИзФайлаЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки(ПараметрыЗагрузки, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если АдресЗагруженныхДанных = Неопределено Тогда
Возврат;
КонецЕсли;
ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры)
ЗагруженныеДанные = ПолучитьИзВременногоХранилища(АдресЗагруженныхДанных);
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
Если Объект.КроссТаблица Тогда
СкопироватьИзКроссТаблицы(КэшированныеЗначения, Объект);
КонецЕсли;
ДобавитьТовары(ЗагруженныеДанные, КэшированныеЗначения, Истина);
Если Объект.КроссТаблица Тогда
ПродукцияПоДатам.Очистить();
Отказ = Ложь;
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("ИмяТЧ", "Продукция");
ПараметрыПроверки.Вставить("ПредставлениеТЧ", ЗаголовокТабличнойЧасти(Объект.ТипПроизводственногоПроцесса));
ПараметрыПроверки.Вставить("Периодичность", Объект.Периодичность);
ПараметрыПроверки.Вставить("ДатаНачала", Объект.НачалоПериода);
ПараметрыПроверки.Вставить("ДатаОкончания", Объект.ОкончаниеПериода);
ПараметрыПроверки.Вставить("ИмяПоляДатыПериода", ?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска"));
ПараметрыПроверки.Вставить("ПредставлениеДатыПериода", ?(ЭтоРазборка, НСтр("ru = 'Дата запуска'"), НСтр("ru = 'Дата выпуска'")));
ПараметрыПроверки.Вставить("ПрефиксПутиКТЧ", "Объект.");
ПланированиеКлиентСервер.ПроверитьДатуПериодаТЧ(Объект, Отказ, ПараметрыПроверки);
Если Отказ Тогда
ОбщегоНазначения.СообщитьПользователю(СтрШаблон(
НСтр("ru = 'В строках списка ""%1"" указаны даты за границами планирования - строки были удалены.'"),
ЗаголовокТабличнойЧасти(Объект.ТипПроизводственногоПроцесса)));
КонецЕсли;
ПереключитьПериодыВКолонкиНаСервере(КэшированныеЗначения);
КонецЕсли;
ЗаполнитьСпецификациюВСтрокахПродукции(Неопределено, Истина);
КонецПроцедуры
#КонецОбласти
#Область Прочее
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ПродукцияПоДатамНоменклатураЕдиницаИзмерения";
ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "ПродукцияПоДатам.Упаковка";
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма, ПараметрыУсловногоОформления);
ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ПолуфабрикатыПоДатамНоменклатураЕдиницаИзмерения";
ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "ПолуфабрикатыПоДатам.Упаковка";
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма, ПараметрыУсловногоОформления);
ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ПродукцияНоменклатураЕдиницаИзмерения";
ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "Объект.Продукция.Упаковка";
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма, ПараметрыУсловногоОформления);
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма,
"ПродукцияПоДатамХарактеристика",
"ПродукцияПоДатам.ХарактеристикиИспользуются");
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма,
"ПолуфабрикатыПоДатамХарактеристика",
"ПолуфабрикатыПоДатам.ХарактеристикиИспользуются");
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма,
"ПродукцияХарактеристика",
"Объект.Продукция.ХарактеристикиИспользуются");
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма,
"СписокПолуфабрикатовХарактеристика",
"СписокПолуфабрикатов.ХарактеристикиИспользуются");
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,
"ПродукцияПоДатамНазначение",
"ПродукцияПоДатам.ТипНоменклатуры",
Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,
"ПолуфабрикатыПоДатамНазначение",
"ПолуфабрикатыПоДатам.ТипНоменклатуры",
Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,
"ПродукцияНазначение",
"Продукция.ТипНоменклатуры",
Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма,
"СписокПолуфабрикатовНазначение",
"СписокПолуфабрикатов.ТипНоменклатуры",
Ложь);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Продукция.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Продукция.Отменено");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Продукция.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Продукция.Замещен");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Продукция.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Продукция.Полуфабрикат");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстПредопределенногоЗначения);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПродукцияПоДатам.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПродукцияПоДатам.Полуфабрикат");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстПредопределенногоЗначения);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыПоДатам.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолуфабрикатыПоДатам.Полуфабрикат");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстПредопределенногоЗначения);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПродукцияСпецификация.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Продукция.Спецификация");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Статус");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланов.Утвержден;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненныйРеквизит);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Спецификация не подобрана'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПродукцияПоДатамСпецификация.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПродукцияПоДатам.Спецификация");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Статус");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланов.Утвержден;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненныйРеквизит);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Спецификация не подобрана'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПолуфабрикатовКЗаказу.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Статус");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыПланов.Утвержден;
Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформлениеКроссТаблицы()
Если НЕ Объект.КроссТаблица Тогда
Возврат;
КонецЕсли;
ТекущийШрифт = Элементы.ПродукцияПоДатам.Шрифт;
ЗачеркнутыйШрифт = Новый Шрифт(ТекущийШрифт,,,,,,Истина);
ЦветТекстаОтмененнойСтрокиДокумента = ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента;
АктивныеПериоды = ЭтотОбъект["Периоды"].НайтиСтроки(Новый Структура("Активная", Истина));
ЭтоОдинПериод = АктивныеПериоды.Количество() = 1;
Для каждого Период Из АктивныеПериоды Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ПродукцияПоДатам" + "Количество_"+Период.ИмяКолонки);
ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПродукцияПоДатам.Отменено_"+Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПродукцияПоДатам.Полуфабрикат");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ЗачеркнутыйШрифт);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ПродукцияПоДатам" + "Количество_"+Период.ИмяКолонки);
ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПродукцияПоДатам.Замещен_"+ Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПродукцияПоДатам.Полуфабрикат");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаОтмененнойСтрокиДокумента);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ПолуфабрикатыПоДатамКоличество_"+Период.ИмяКолонки);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолуфабрикатыПоДатам.Отменено_"+Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ЗачеркнутыйШрифт);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ПолуфабрикатыПоДатамКоличество_"+Период.ИмяКолонки);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолуфабрикатыПоДатам.Замещен_"+ Период.ИмяКолонки);
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветТекстаОтмененнойСтрокиДокумента);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИнтервалЗавершение(Период, ДополнительныеПараметры) Экспорт
Оповещение = Новый ОписаниеОповещения("ПриИзмененииПериодовНаКлиенте", ЭтотОбъект);
ПланированиеКлиент.ПриИзмененииПериодаПлана(ЭтаФорма, "ПродукцияПоДатам", Оповещение);
КонецПроцедуры
&НаСервере
Процедура СохранитьНовыйПериодСервер()
ПланированиеКлиентСервер.СохранитьЗначенияПроверяемыхРеквизитов(Объект, ЭтаФорма, "РеквизитыДоИзменения");
НадписьПериодичностьВалюта = НСтр("ru = 'Периодичность: %Периодичность%'");
НадписьПериодичностьВалюта = СтрЗаменить(НадписьПериодичностьВалюта,"%Периодичность%",Строка(Объект.Периодичность));
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ПриИзмененииКоличестваСуммыСтроки(Объект, Форма, СтрокаТоваров)
Количество = 0;
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная ИЛИ СтрокаТоваров["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
Количество = Количество + СтрокаТоваров["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
СтрокаТоваров.КоличествоУпаковок = Количество;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоговыеПоказатели(Форма, РассчитыватьСтроки = Истина, ОбновитьВсеПолуфабрикаты = Ложь)
Объект = Форма.Объект;
Если НЕ Объект.КроссТаблица Тогда
Возврат;
КонецЕсли;
Если ОбновитьВсеПолуфабрикаты Тогда
Продукция = Форма.ВсеПолуфабрикатыПоДатам;
ИначеЕсли Форма.Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаПолуфабрикатыКроссТаблица Тогда
Продукция = Форма.ПолуфабрикатыПоДатам;
Иначе
Продукция = Форма.ПродукцияПоДатам;
КонецЕсли;
Форма["КоличествоУпаковок"] = 0;
ПрефиксКолонкиКоличество = "ПродукцияПоДатам" + "Количество_";
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] = 0;
КонецЦикла;
Для каждого СтрокаТЧ Из Продукция Цикл
Если РассчитыватьСтроки Тогда
СтрокаТЧ.КоличествоУпаковок = 0;
КонецЕсли;
ПериодЗамещен = Ложь;
Если Форма.Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаПолуфабрикатыКроссТаблица
Или ОбновитьВсеПолуфабрикаты Тогда
Отбор = Новый Структура("ДатаНачала", СтрокаТЧ.ДатаВыпускаПродукцииПолуфабриката);
Периоды = Форма.Периоды.НайтиСтроки(Отбор);
Если Периоды.Количество()>0 Тогда
ПериодЗамещен = Периоды[0].Замещен;
КонецЕсли;
КонецЕсли;
Для каждого СтрокаПериода Из Форма.Периоды Цикл
Если НЕ СтрокаПериода.Активная Тогда
Продолжить;
КонецЕсли;
Если СтрокаТЧ.Полуфабрикат Тогда
СтрокаТЧ["Замещен_"+ СтрокаПериода.ИмяКолонки] = ПериодЗамещен;
Иначе
СтрокаТЧ["Замещен_"+ СтрокаПериода.ИмяКолонки] = СтрокаПериода.Замещен;
СтрокаТЧ["ЗамещенКЗаказу_"+ СтрокаПериода.ИмяКолонки] = СтрокаПериода.ЗамещенКЗаказу;
КонецЕсли;
Если СтрокаТЧ["Отменено_" + СтрокаПериода.ИмяКолонки] Тогда
Продолжить;
КонецЕсли;
Если РассчитыватьСтроки Тогда
СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЕсли;
Форма[ПрефиксКолонкиКоличество + СтрокаПериода.ИмяКолонки] = Форма[ПрефиксКолонкиКоличество
+ СтрокаПериода.ИмяКолонки]
+ СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
КонецЦикла;
Форма["КоличествоУпаковок"] = Форма["КоличествоУпаковок"] + СтрокаТЧ["КоличествоУпаковок"];
ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(Форма, СтрокаТЧ);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
УправлениеПредприятием = ПолучитьФункциональнуюОпцию("УправлениеПредприятием");
Если Объект.ЗаполнятьПоФормуле Тогда
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
Иначе
ИнициализироватьСтруктуруНастроек(РеквизитФормыВЗначение("Объект"));
КонецЕсли;
КодыСостоянийРасчетаПланаПроизводства = Документы.ПланПроизводства.КодыСостоянийРасчетаПланаПроизводства();
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Объект.Сценарий,
"ОтображатьНомерПериода, ИспользоватьДляПланированияМатериалов, ПланированиеПоНазначениям");
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыСценария, "ОтображатьНомерПериода, ПланированиеПоНазначениям");
ЗаполнятьСпецификацию = ПараметрыСценария.ИспользоватьДляПланированияМатериалов;
ЭтоРазборка = (Объект.ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка);
ПриИзмененииПериодовНаСервере();
СкопироватьВКроссТаблицу(Неопределено);
ЕстьПолуфабрикаты = Объект.Продукция.НайтиСтроки(Новый Структура("Полуфабрикат", Истина)).Количество() > 0;
УстановитьПометкуКроссТаблицы(ЭтаФорма);
РаботаСТабличнымиЧастями.ИнициализироватьКэшСтрок(Элементы.Продукция);
ПрочитатьУстановитьПараметрыВыбораСпецификаций();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизиты()
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются",
Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры",
Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул",
Новый Структура("Номенклатура", "Артикул"));
Если Объект.КроссТаблица Или ИспользуютсяПланируемыеОстатки Тогда
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(
ПродукцияПоДатам,
СтруктураДействий);
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(
ВсеПолуфабрикатыПоДатам,
СтруктураДействий);
Для каждого СтрокаТЧ Из ПродукцияПоДатам Цикл
Для каждого Период Из ЭтотОбъект["Периоды"] Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(СтрокаТЧ["Комментарий_"+ Период.ИмяКолонки]);
КонецЦикла;
КонецЦикла;
Для каждого СтрокаТЧ Из ВсеПолуфабрикатыПоДатам Цикл
Для каждого Период Из ЭтотОбъект["Периоды"] Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(СтрокаТЧ["Комментарий_"+ Период.ИмяКолонки]);
КонецЦикла;
КонецЦикла;
ЗаполнитьНаправлениеДеятельности(ПродукцияПоДатам);
Иначе
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(
Объект.Продукция,
СтруктураДействий);
Для каждого СтрокаТЧ Из Объект.Продукция Цикл
СтрокаТЧ.КартинкаКомментарий = ЗначениеЗаполнено(СтрокаТЧ.Комментарий);
КонецЦикла;
ЗаполнитьНаправлениеДеятельности(Новый Массив);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаправлениеДеятельности(Строки)
МассивНазначений = Новый Массив;
МассивНазначений.Добавить(Объект.Назначение);
Для каждого Строка Из Строки Цикл
МассивНазначений.Добавить(Строка.Назначение);
КонецЦикла;
ЗначенияРеквизитов = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивНазначений, "НаправлениеДеятельности");
НаправлениеДеятельности = ЗначенияРеквизитов[Объект.Назначение];
Для каждого Строка Из Строки Цикл
Строка.НаправлениеДеятельности = ЗначенияРеквизитов[Строка.Назначение];
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииПериодовНаСервере(КорректироватьНачалоОкончаниеПериода = Ложь, ОбновитьНачалоПериодаЗамещения = Ложь)
Если КорректироватьНачалоОкончаниеПериода Тогда
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(Объект.Периодичность, Объект.НачалоПериода, Объект.ОкончаниеПериода, ТекущаяДатаСеанса());
КонецЕсли;
ТаблицаПериоды = РеквизитФормыВЗначение("Периоды", Тип("ТаблицаЗначений"));
Если Объект.Замещающий
И ЗначениеЗаполнено(Объект.Периодичность) Тогда
Если ОбновитьНачалоПериодаЗамещения Тогда
Объект.НачалоПериодаЗамещения = Объект.НачалоПериода;
КонецЕсли;
ЗаполнитьЗамещенныеПериоды();
Планирование.ОбновитьГиперссылкуЗамещение(ЭтаФорма);
Иначе
ЗамещенныеПериоды.Очистить();
ЗамещениеФорматированнаяСтрока = Новый ФорматированнаяСтрока(Новый Массив);
КонецЕсли;
Планирование.ЗаполнитьТаблицуПериодов(ТаблицаПериоды, Объект.Периодичность, Объект.НачалоПериода, Объект.ОкончаниеПериода, ОтображатьНомерПериода, ЗамещенныеПериоды);
ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, Истина);
Если Объект.КроссТаблица Тогда
СохранитьНовыйПериодСервер();
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланПроизводства");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтруктуруКроссТаблицы(ТаблицаПериоды, ПересчитыватьИтоговыеПоказатели = Истина)
КоличествоПериодов = ТаблицаПериоды.НайтиСтроки(Новый Структура("Активная", Истина)).Количество();
ЭтоОдинПериод = КоличествоПериодов = 1;
ПолеДата = ?(ЭтоРазборка, "ПродукцияДатаЗапуска", "ПродукцияДатаВыпуска");
Элементы[ПолеДата].СписокВыбора.Очистить();
Для каждого Период Из ТаблицаПериоды Цикл
Если НЕ Период.Активная Тогда
Продолжить;
КонецЕсли;
Элементы[ПолеДата].СписокВыбора.Добавить(НачалоДня(Период.ДатаНачала), Период.Заголовок);
КонецЦикла;
Элементы.ПродукцияПоДатамКоличествоУпаковок.Видимость = НЕ ЭтоОдинПериод;
Элементы.КомментарийКЯчейке.Видимость = Объект.КроссТаблица И НЕ ЭтоОдинПериод;
Элементы.ЯчейкаОтменена.Видимость = Объект.КроссТаблица И НЕ ЭтоОдинПериод;
Если НЕ Объект.КроссТаблица
И Не ИспользуютсяПланируемыеОстатки Тогда
Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПродукцияТаблица;
ЗначениеВРеквизитФормы(ТаблицаПериоды,"Периоды");
СохранитьНовыйПериодСервер();
ОбновитьПризнакЗамещения();
Возврат;
КонецЕсли;
ПараметрыВывода = Новый Структура;
ПараметрыВывода.Вставить("ИмяРеквизитаКроссТаблицы", "ПродукцияПоДатам");
ПараметрыВывода.Вставить("ЭлементФормыКроссТаблицы", "ПродукцияПоДатам");
ПараметрыВывода.Вставить("ТаблицаПериодов", ТаблицаПериоды);
ПараметрыВывода.Вставить("Периодичность", Объект.Периодичность);
ПараметрыВывода.Вставить("Поля", Новый Массив());
Если НЕ ЭтоОдинПериод Тогда
Планирование.ДобавитьПолеКроссТаблицыГруппаКомментарияСКартинкой(ПараметрыВывода);
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииКоличества");
Планирование.ДобавитьПолеКроссТаблицыКоличество(
ПараметрыВывода,
Истина,
НЕ ЭтоОдинПериод,
ЭтоОдинПериод,
СтруктураДействий);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииОтменено");
Планирование.ДобавитьПолеКроссТаблицыОтменено(ПараметрыВывода, ЭтоОдинПериод, СтруктураДействий);
СтруктураДействий = Новый Структура;
Планирование.ДобавитьПолеКроссТаблицыЗамещен(ПараметрыВывода, ЭтоОдинПериод И Объект.Замещающий, СтруктураДействий);
Планирование.ДобавитьПолеКроссТаблицыЗамещенКЗаказу(ПараметрыВывода,Ложь, СтруктураДействий);
Если ЭтоОдинПериод Тогда
Планирование.ДобавитьПолеКроссТаблицыГруппаКомментарияСКартинкой(ПараметрыВывода);
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриИзменении", "Подключаемый_ПриИзмененииКомментария");
СтруктураДействий.Вставить("НачалоВыбора", "Подключаемый_НачалоВыбораКомментария");
Планирование.ДобавитьПолеКроссТаблицыКомментарий(ПараметрыВывода, ЭтоОдинПериод, СтруктураДействий);
Если Объект.ЗаполнятьПоФормуле Тогда
ДобавитьПоляИзДопПараметров(ПараметрыВывода);
Иначе
Планирование.ДобавитьПолеКроссТаблицыРасшифровка(ПараметрыВывода);
КонецЕсли;
Планирование.ОбновитьСтруктуруВыводаКроссТаблицы(ЭтаФорма, ПараметрыВывода);
ПараметрыВывода.Вставить("ИмяРеквизитаКроссТаблицы", "ПолуфабрикатыПоДатам");
ПараметрыВывода.Вставить("ЭлементФормыКроссТаблицы", "ПолуфабрикатыПоДатам");
Планирование.ОбновитьСтруктуруВыводаКроссТаблицы(ЭтаФорма, ПараметрыВывода);
ПараметрыВывода.Вставить("ИмяРеквизитаКроссТаблицы", "ВсеПолуфабрикатыПоДатам");
ПараметрыВывода.Вставить("ЭлементФормыКроссТаблицы", "");
Планирование.ОбновитьСтруктуруВыводаКроссТаблицы(ЭтаФорма, ПараметрыВывода);
ЗначениеВРеквизитФормы(ТаблицаПериоды,"Периоды");
УстановитьУсловноеОформление();
УстановитьУсловноеОформлениеКроссТаблицы();
Если ПересчитыватьИтоговыеПоказатели Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
РассчитатьИтоговыеПоказатели(ЭтаФорма,,Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СценарийПриИзмененииСервер()
Если Объект.ВидПлана <> ЭтаФорма["РеквизитыДоИзменения"].ВидПлана
ИЛИ (Объект.Сценарий <> ЭтаФорма["РеквизитыДоИзменения"].Сценарий
И НЕ ЗначениеЗаполнено(Объект.ВидПлана)) Тогда
ОбновлятьВидПлана = Истина;
Иначе
ОбновлятьВидПлана = Ложь;
КонецЕсли;
ПараметрыСценария = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Сценарий,
"Периодичность,
|ОтображатьНомерПериода,
|ИспользоватьДляПланированияМатериалов,
|ПланированиеПоНазначениям,
|СценарийБюджетирования,
|СпособРасчетаПотребностейВМатериалах");
ЗаполнитьЗначенияСвойств(Объект, ПараметрыСценария);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыСценария);
ЗаполнятьСпецификацию = ПараметрыСценария.ИспользоватьДляПланированияМатериалов;
Если ОбновлятьВидПлана Тогда
Объект.ВидПлана = Планирование.ПолучитьВидПланаПоУмолчанию(Перечисления.ТипыПланов.ПланПроизводства, Объект.Сценарий);
КонецЕсли;
Если ПланированиеКлиентСервер.НеобходимоОбновитьИнтерфейс(Объект, ЭтаФорма, "РеквизитыДоИзменения") Тогда
ПриИзмененииПериодовНаСервере(Истина);
КонецЕсли;
Если ОбновлятьВидПлана Тогда
ВидПланаПриИзмененииСервер(Истина);
Объект.ЗаполненоАвтоматически = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВидПланаПриИзмененииСервер(ОбновлятьПравило = Ложь)
ОбновлятьПравило = ОбновлятьПравило ИЛИ Объект.ВидПлана <> ЭтаФорма["РеквизитыДоИзменения"].ВидПлана;
ПараметрыВидаПлана = ПолучитьПараметрыВидаПлана(Объект.ВидПлана, ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек);
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана,, "КоличествоПериодов");
Если ПараметрыВидаПлана.ЗаполнятьПоДефициту = Истина Тогда
Объект.КроссТаблица = Ложь;
ПереключитьПериодыВСтрокиНаСервере(Неопределено);
КонецЕсли;
Если ПланироватьПолуфабрикатыАвтоматически Тогда
УдалитьПолуфабрикатыНаСервере();
КонецЕсли;
Если ОбновлятьПравило Тогда
ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыВидаПлана, "КоличествоПериодов");
Если КоличествоПериодов > 0 Тогда
Объект.ОкончаниеПериода = Неопределено;
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(
Объект.Периодичность,
Объект.НачалоПериода,
Объект.ОкончаниеПериода,
ТекущаяДатаСеанса(),
ПараметрыВидаПлана.КоличествоПериодов);
КонецЕсли;
ЗаполнитьЗначенияСвойств(Объект, ПараметрыВидаПлана);
Если Объект.Замещающий Тогда
Объект.НачалоПериодаЗамещения = Объект.НачалоПериода;
КонецЕсли;
Объект.ПравилоЗаполнения.Загрузить(ПолучитьИзВременногоХранилища(АдресПравилаЗаполнения));
Объект.ЗаполненоАвтоматически = Ложь;
ЭтоРазборка = (Объект.ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка);
Планирование.ПроверитьСуществованиеУжеСозданныхПланов(Объект, "ПланПроизводства");
ИнициализироватьНастроекПриЧтенииНаСервере(РеквизитФормыВЗначение("Объект"));
Если ПараметрыВидаПлана.Свойство("СтруктураНастроек")
И ПараметрыВидаПлана.СтруктураНастроек <> Неопределено Тогда
СтруктураНастроек = ПараметрыВидаПлана.СтруктураНастроек;
КонецЕсли;
ПриИзмененииПериодовНаСервере();
ПрочитатьУстановитьПараметрыВыбораСпецификаций();
ЗаполнитьСпецификациюВСтрокахПродукции(,Истина);
КонецЕсли;
ЗаполнятьСпецификациюПоПериодам = ПараметрыВидаПлана.ЗаполнятьСпецификациюПоПериодам;
СохранитьНовыйПериодСервер();
Если ОбновлятьПравило И ЗначениеЗаполнено(Объект.ВидПлана) Тогда
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
КонецЕсли;
УстановитьВидимость();
Элементы.ГруппаПродукция.Заголовок = ЗаголовокТабличнойЧасти(Объект.ТипПроизводственногоПроцесса);
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимость()
ИспользоватьОбособленноеОбеспечениеЗаказов = ПолучитьФункциональнуюОпцию("ИспользоватьОбособленноеОбеспечениеЗаказов");
Элементы.ВидПлана.Доступность = ЗначениеЗаполнено(Объект.Сценарий);
Элементы.Подразделение.Видимость = ЗаполнятьПодразделение ИЛИ ЗначениеЗаполнено(Объект.Подразделение);
Элементы.ПродукцияНастроитьИЗаполнитьПоПравилуЗаполнения.Видимость = НЕ ЗапретитьРедактированиеПравила;
Элементы.ПродукцияПоДатамНастроитьИЗаполнитьПоПравилуЗаполнения.Видимость = НЕ ЗапретитьРедактированиеПравила;
Элементы.ПродукцияЗаполнить.Видимость = Не Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияРазбитьСтроку.Видимость = Не Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияПоДатамЗаполнить.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ПродукцияЗаполнитьПродукцию.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияПоДатамЗаполнитьПродукцию.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ПродукцияЗаполнитьПоказатели.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияПоДатамЗаполнитьПоказатели.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ПродукцияГруппаИзменитьКоличество.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияГруппаПоДатамИзменитьКоличество.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ТоварыДополнительныеПараметрыФормула.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ТоварыДополнительныеПараметрыОтклонение.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Если Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы.Найти("ПродукцияПоДатам" + "Отклонение") <> Неопределено Тогда
Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы["ПродукцияПоДатам" + "Отклонение"].Видимость = Объект.ЗаполнятьПоФормуле;
КонецЕсли;
Если Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы.Найти("ПродукцияПоДатам" + "ФормулаВычисление") <> Неопределено Тогда
Элементы.ТоварыПоПериодамДополнительныеПараметры.ПодчиненныеЭлементы["ПродукцияПоДатам" + "ФормулаВычисление"].Видимость = Объект.ЗаполнятьПоФормуле;
КонецЕсли;
Элементы.ТоварыДополнительныеПараметры.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияЗаполнитьНазначениеПоЗначению.Видимость = ЗаполнятьНазначениеВТЧ;
Элементы.ПродукцияПоДатамЗаполнитьНазначениеПоЗначению.Видимость = ЗаполнятьНазначениеВТЧ;
Элементы.ПродукцияСпецификация.Видимость = ЗаполнятьСпецификацию;
Элементы.ПродукцияПоДатамСпецификация.Видимость = ЗаполнятьСпецификацию;
Элементы.СостояниеРасчетаПланаПроизводства.Видимость = ЗаполнятьСпецификацию;
Элементы.ФормаПересчитатьПланПотребленияМатериалов.Видимость = ЗаполнятьСпецификацию;
Элементы.СпособРасчетаПотребностейВМатериалах.Видимость = ЗаполнятьСпецификацию
И УправлениеДаннымиОбИзделиях.ДоступноОписаниеВероятностиПримененияМатериалов();
ПланироватьПолуфабрикатыВручную = ЗаполнятьСпецификацию
И НЕ ПланироватьПолуфабрикатыАвтоматически
И УправлениеПредприятием
И НЕ ЭтоРазборка;
Элементы.ПродукцияЗапланироватьПолуфабрикаты.Видимость = ПланироватьПолуфабрикатыВручную И Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияПоДатамЗапланироватьПолуфабрикаты.Видимость = ПланироватьПолуфабрикатыВручную;
Элементы.ПродукцияУдалитьПолуфабрикаты.Видимость = ПланироватьПолуфабрикатыВручную;
Элементы.ПродукцияПоДатамУдалитьПолуфабрикаты.Видимость = ПланироватьПолуфабрикатыВручную;
Элементы.ПродукцияДатаВыпускаПродукцииПолуфабриката.Видимость = ПланироватьПолуфабрикатыВручную;
Элементы.ПродукцияДатаВыпуска.Видимость = НЕ ЭтоРазборка;
Если Не ПолучитьФункциональнуюОпцию("УправлениеПредприятием") Тогда
Элементы.ПотребностьРассчитанаУТКА.Видимость = Истина;
Элементы.ПотребностьОжидаетРасчетаУТКА.Видимость = Истина;
Элементы.ПотребностьРассчитываетсяУТКА.Видимость = Истина;
Элементы.ПотребностьОтменяетсяУТКА.Видимость = Истина;
Элементы.ПотребностьНеРассчитанаЕстьОшибкиУТКА.Видимость = Истина;
Элементы.ПотребностьРассчитана.Видимость = Ложь;
Элементы.ПотребностьОжидаетРасчета.Видимость = Ложь;
Элементы.ПотребностьРассчитывается.Видимость = Ложь;
Элементы.ПотребностьОтменяется.Видимость = Ложь;
Элементы.ПотребностьНеРассчитанаЕстьОшибки.Видимость = Ложь;
КонецЕсли;
ПравоПросмотраСтатейБюджетов = ПравоДоступа("Просмотр", Метаданные.Справочники.СтатьиБюджетов);
Элементы.СтатьяБюджетов.Видимость = Объект.ОтражаетсяВБюджетировании И ПравоПросмотраСтатейБюджетов;
Элементы.Расшифровка.Видимость = Не Объект.ЗаполнятьПоФормуле;
Элементы.ПродукцияПоДатамКонтекстноеМенюГруппаПоФормуле.Видимость = Объект.ЗаполнятьПоФормуле;
Элементы.ПродукцияКонтекстноеМенюГруппаПоФормуле.Видимость = Объект.ЗаполнятьПоФормуле И Не Объект.ЗаполнятьПоДефициту;
ПоказыватьНазначения = ПланированиеПоНазначениям И ИспользоватьОбособленноеОбеспечениеЗаказов;
Элементы.Назначение.Видимость = ПоказыватьНазначения И Не ЗаполнятьНазначениеВТЧ;
Элементы.ПродукцияНазначение.Видимость = ПоказыватьНазначения И ЗаполнятьНазначениеВТЧ;
Элементы.ПродукцияПоДатамНазначение.Видимость = ПоказыватьНазначения И ЗаполнятьНазначениеВТЧ;
Элементы.ПолуфабрикатыПоДатамНазначение.Видимость = ПоказыватьНазначения И ЗаполнятьНазначениеВТЧ;
Элементы.СписокПолуфабрикатовНазначение.Видимость = ПоказыватьНазначения И ЗаполнятьНазначениеВТЧ;
Элементы.ГруппаПолуфабрикаты.Видимость = АвтоДопланированиеПолуфабрикатов(ЭтотОбъект) И НЕ ЭтоРазборка;
УстановитьОповещениеПолуфабрикатов(ЭтотОбъект, Ложь);
Элементы.ПродукцияЗамещен.Видимость = Объект.Замещающий;
ДоступноОписаниеТипаПроизводственногоПроцесса = УправлениеДаннымиОбИзделиях.ДоступноОписаниеТипаПроизводственногоПроцесса();
Элементы.ТипПроизводственногоПроцесса.Видимость = ДоступноОписаниеТипаПроизводственногоПроцесса;
Если Не Объект.ЗаполнятьПоДефициту Тогда
Элементы.НадписьЕстьОтмененныеКорректировкиОбеспечения.Видимость = Ложь;
КонецЕсли;
Элементы.ПродукцияЗаполнитьПоДефицитам.Видимость = Объект.ЗаполнятьПоДефициту;
Элементы.ЗаполнятьАвтоматически.Видимость = Объект.ЗаполнятьПоДефициту;
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Элементы.НачалоОкончаниеПериода.Доступность = Не Объект.ЗаполнятьПоДефициту;
КонецЕсли;
Элементы.ПродукцияКорректировкаОбеспечения.Видимость = Объект.ЗаполнятьПоДефициту;
Элементы.ФормаГруппаПериоды.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияВставитьСтроки.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияКонтекстноеМенюРазбитьСтроку.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияПодобратьТовары.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияЗагрузитьИзExcel.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияExcel.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияИзменитьФлагОтменыСтрокПлана.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияКонтекстноеМенюИзменитьФлагОтменыСтрокПлана.Видимость = Не Объект.ЗаполнятьПоДефициту;
Элементы.ПродукцияОтменено.Видимость = Не Объект.ЗаполнятьПоДефициту;
ОбновитьОтображенияКорректировок();
ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефициту();
ПрочитатьЕстьОтмененныеКорректировкиОбеспечения();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте()
Если Не Объект.ЗаполнятьПоДефициту Тогда
Элементы.ГруппаОповещенияЗаполнениеПоДефициту.Видимость = Ложь;
ОтключитьОбработчикОжидания("ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте");
Иначе
ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефициту();
Если ТаймерКонтроляПересчетаДефецитов = 0 Тогда
ТаймерКонтроляПересчетаДефецитов = 2;
Иначе
ТаймерКонтроляПересчетаДефецитов = Мин(ТаймерКонтроляПересчетаДефецитов*1.5, 60);
КонецЕсли;
ПодключитьОбработчикОжидания("ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефицитуНаКлиенте", ТаймерКонтроляПересчетаДефецитов, Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьОтображениеГруппыОповещенияЗаполнитьПоДефициту()
Если Не Объект.ЗаполнятьПоДефициту Тогда
Элементы.ГруппаОповещенияЗаполнениеПоДефициту.Видимость = Ложь;
Иначе
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РасчетДефицитовПлановПоЭтапам.Сценарий КАК Сценарий
|ИЗ
| РегистрСведений.РасчетДефицитовПлановПоЭтапам КАК РасчетДефицитовПлановПоЭтапам
|ГДЕ
| РасчетДефицитовПлановПоЭтапам.Пересчитать
| И РасчетДефицитовПлановПоЭтапам.Сценарий = &Сценарий
| И РасчетДефицитовПлановПоЭтапам.ВидПлана = &ВидПлана
| И РасчетДефицитовПлановПоЭтапам.ПериодПланирования = &ПериодПланирования";
Запрос.УстановитьПараметр("Сценарий", Объект.Сценарий);
Запрос.УстановитьПараметр("ВидПлана", Объект.ВидПлана);
Запрос.УстановитьПараметр("ПериодПланирования", Объект.НачалоПериода);
Выборка = Запрос.Выполнить().Выбрать();
Видимость = Выборка.Следующий();
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,"ГруппаОповещенияЗаполнениеПоДефициту","Видимость", Видимость);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьОтображенияКорректировок()
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| КорректировкаПлановыхПотребностей.Ссылка КАК Ссылка,
| СУММА(ВЫБОР
| КОГДА КорректировкаПлановыхПотребностей.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыПлановыхКорректировок.КПроверке)
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ) КАК КоличествоКПроверке
|ИЗ
| Документ.КорректировкаПлановыхПотребностей КАК КорректировкаПлановыхПотребностей
|ГДЕ
| КорректировкаПлановыхПотребностей.План = &План
| И КорректировкаПлановыхПотребностей.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыПлановыхКорректировок.КПроверке), ЗНАЧЕНИЕ(Перечисление.СтатусыПлановыхКорректировок.Утверждена))
|
|СГРУППИРОВАТЬ ПО
| КорректировкаПлановыхПотребностей.Ссылка";
Запрос.УстановитьПараметр("План", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Элементы.НадписьЕстьОтмененныеКорректировкиПотребности.Видимость = Истина;
Если Выборка.КоличествоКПроверке = 0 Тогда
Элементы.НадписьКорректировкиПлановыхПотребностей.Заголовок = НСтр("ru = 'Имеются корректировки потребностей'");
Элементы.ДекорацияОтмененныеКорректировкиПотребностейКПроверке.Видимость = Ложь;
Элементы.ДекорацияОтмененныеКорректировкиПотребностей.Видимость = Истина;
Иначе
Элементы.НадписьКорректировкиПлановыхПотребностей.Заголовок = НСтр("ru = 'Имеются отмененные корректировки потребностей к проверке'");
Элементы.ДекорацияОтмененныеКорректировкиПотребностейКПроверке.Видимость = Истина;
Элементы.ДекорацияОтмененныеКорректировкиПотребностей.Видимость = Ложь;
КонецЕсли;
Иначе
Элементы.НадписьЕстьОтмененныеКорректировкиПотребности.Видимость = Ложь;
КонецЕсли;
Элементы.НадписьЕстьОтмененныеКорректировкиПотребности.Видимость = Не Запрос.Выполнить().Пустой();
Элементы.ЗаполнятьАвтоматически.Видимость = Объект.ЗаполнятьПоДефициту;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПараметрыВидаПлана(Знач ВидПлана, Знач ОбновлятьПравило, АдресПравилаЗаполнения, АдресПользовательскихНастроек)
Реквизиты = "КоличествоПериодов,
|ЗаполнятьПодразделение,
|Замещающий,
|ЗапретитьРедактированиеПравила,
|ЗапретитьРедактированиеФормулы,
|ЗаполнятьПоФормуле,
|ЗаполнятьНазначениеВТЧ,
|ПланироватьПолуфабрикатыАвтоматически,
|ОтражаетсяВБюджетировании,
|СтатьяБюджетов,
|ТипПроизводственногоПроцесса,
|ЗаполнятьСпецификациюПоПериодам,
|ЗаполнятьПоДефициту,
|Родитель,
|ЗаполнятьАвтоматически";
ПараметрыВидаПлана = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидПлана, Реквизиты);
Если ОбновлятьПравило Тогда
АдресПравилаЗаполнения = Планирование.ПолучитьАдресПравилаЗаполненияПоУмолчанию(Перечисления.ТипыПланов.ПланПроизводства, ВидПлана, АдресПравилаЗаполнения);
АдресПользовательскихНастроек = Планирование.ПолучитьАдресПользовательскихНастроекПоУмолчанию(Перечисления.ТипыПланов.ПланПроизводства, ВидПлана, АдресПользовательскихНастроек);
СтруктураНастроек = Планирование.ПолучитьНастройкиПоУмолчанию(Перечисления.ТипыПланов.ПланПроизводства, ВидПлана);
Если СтруктураНастроек.Свойство("Формула") Тогда
ПараметрыВидаПлана.Вставить("СтруктураНастроек", СтруктураНастроек);
КонецЕсли;
Для каждого Элемент Из СтруктураНастроек Цикл
ПараметрыВидаПлана.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
КонецЕсли;
Возврат ПараметрыВидаПлана;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьСвязанныеРеквизитыОбъекта(Объект, Форма)
Если Объект.КроссТаблица
Или Форма.ИспользуютсяПланируемыеОстатки Тогда
Товары = Форма.ПродукцияПоДатам;
Иначе
Товары = Объект.Продукция;
КонецЕсли;
Если НЕ Форма.ЗаполнятьПодразделение Тогда
Объект.Подразделение = Неопределено;
КонецЕсли;
Если НЕ Форма.ПланированиеПоНазначениям Тогда
Объект.Назначение = Неопределено;
КонецЕсли;
Для каждого СтрокаТЧ Из Товары Цикл
Если Не Форма.ЗаполнятьСпецификацию Тогда
СтрокаТЧ.Спецификация = Неопределено;
КонецЕсли;
Если НЕ Форма.ПланированиеПоНазначениям
Или СтрокаТЧ.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Услуга")
Или СтрокаТЧ.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.МногооборотнаяТара") Тогда
СтрокаТЧ.Назначение = Неопределено;
ИначеЕсли НЕ Форма.ЗаполнятьНазначениеВТЧ Тогда
Если СтрокаТЧ.Полуфабрикат
И Не ЗначениеЗаполнено(СтрокаТЧ.Назначение) Тогда
Продолжить;
КонецЕсли;
СтрокаТЧ.Назначение = Объект.Назначение;
СтрокаТЧ.НаправлениеДеятельности = Форма.НаправлениеДеятельности;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьПользователяОЗаполненииДанных()
ПоказатьОповещениеПользователя(
НСтр("ru = 'Заполнение данных в документ завершено'"),
,
,
БиблиотекаКартинок.Информация32);
Если БылиЗапланированыПолуфабрикаты Тогда
БылиЗапланированыПолуфабрикаты = Ложь;
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Продолжить'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена);
Оповещение = Новый ОписаниеОповещения("ЗапланироватьПолуфабрикатыЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, НСтр("ru = 'Все полуфабрикаты будут перепланированы. Продолжить?'"), Кнопки);
Возврат;
КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьПользователяОНачалеЗаполненииДанных()
Состояние(НСтр("ru = 'Выполняется заполнение данных в документ'"));
КонецПроцедуры
&НаСервере
Функция ПолучитьАдресТаблицыПериодов()
Возврат ПоместитьВоВременноеХранилище(ЭтаФорма.Периоды.Выгрузить(), УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ДобавитьТовары(ТаблицаТоваров, КэшированныеЗначения = Неопределено, ЗагрузкаИзФайла = Ложь)
Модифицированность = Истина;
СтруктураДействий = Новый Структура;
ИдентификаторыСтрок = Новый Массив;
Если НЕ Объект.КроссТаблица Тогда
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
КонецЕсли;
КэшированныеЗначенияОбработкаСтрок = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
ОбрабатываемыеСтроки = Новый Массив();
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
Объект.ЗаполненоАвтоматически = Ложь;
Если Объект.КроссТаблица И НЕ ЗагрузкаИзФайла Тогда
ТекущаяСтрока = ПродукцияПоДатам.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
АктуальныйПериод = ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина))[0];
Если ТекущаяСтрока["Количество_" + АктуальныйПериод.ИмяКолонки] = 0
И ТекущаяСтрока.Количество <> 0 Тогда
ТекущаяСтрока["Количество_" + АктуальныйПериод.ИмяКолонки] = ТекущаяСтрока.КоличествоУпаковок;
КонецЕсли;
Если НЕ Объект.ЗаполнятьПоФормуле И ТекущаяСтрока["Расшифровка_" + АктуальныйПериод.ИмяКолонки] = ""
И ТекущаяСтрока.Расшифровка <> "" Тогда
ТекущаяСтрока["Расшифровка_" + АктуальныйПериод.ИмяКолонки] = ТекущаяСтрока.Расшифровка;
КонецЕсли;
Иначе
ТекущаяСтрока = Объект.Продукция.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
Если Не ЗначениеЗаполнено(ТекущаяСтрока[?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска")]) Тогда
ТекущаяСтрока[?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска")] = Объект.НачалоПериода;
КонецЕсли;
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЕсли;
ИдентификаторыСтрок.Добавить(ТекущаяСтрока.ПолучитьИдентификатор());
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Продукция,
КэшированныеЗначенияОбработкаСтрок);
Если Объект.КроссТаблица Тогда
ПланированиеКлиентСервер.РассчитатьНомерСтрокиКроссТаблицы(ЭтаФорма, "ПродукцияПоДатам");
ТоварыКоличествоСтрок = ПродукцияПоДатам.Количество();
Иначе
ТоварыКоличествоСтрок = Объект.Продукция.Количество();
КонецЕсли;
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
ЗаполнитьСлужебныеРеквизиты();
Если НЕ ЗагрузкаИзФайла Тогда
ЗаполнитьСпецификациюВСтрокахПродукции(ИдентификаторыСтрок, Истина);
КонецЕсли;
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецПроцедуры
&НаСервере
Процедура ПолучитьЗагруженныеТоварыИзХранилища(АдресТоваровВХранилище, КэшированныеЗначения = Неопределено)
ТоварыИзХранилища = ПолучитьИзВременногоХранилища(АдресТоваровВХранилище);
ДобавитьТовары(ТоварыИзХранилища, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДаннымиДляЗамещения()
Если НЕ ПроверитьЗаполнениеШапки() Тогда
Возврат;
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("ЗаполнитьДляЗамещения");
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаКлиенте
Процедура КонтрольРассчетаПланаПроизводства()
Если Объект.Ссылка.Пустая() ИЛИ НЕ ЗаполнятьСпецификацию Тогда
Возврат;
КонецЕсли;
СостояниеРасчета = СостояниеРасчетаПланаПроизводства(Объект.Ссылка);
Если ОжидатьЗавершениеКорректировки
И СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.Рассчитывается Тогда
ОжидатьЗавершениеКорректировки = Ложь;
ПодключитьОбработчикОжидания("КонтрольРассчетаПланаПроизводства", 1, Истина);
Возврат;
КонецЕсли;
Элементы.СтраницаНеРассчитан.Видимость = (СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.НеРассчитан);
Элементы.СтраницаРассчитан.Видимость = (СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.Рассчитан);
Элементы.СтраницаОжидаетРасчета.Видимость = (СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.ОжидаетРасчета);
Элементы.СтраницаРассчитывается.Видимость = (СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.Рассчитывается);
Элементы.СтраницаОтменяется.Видимость = (СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.Отменяется);
Элементы.СтраницаНеРассчитанЕстьОшибки.Видимость = (СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.НеРассчитанЕстьОшибки);
ЗаблокироватьСписокПолуфабрикатов = СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.ОжидаетРасчета
ИЛИ СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.Рассчитывается
ИЛИ СостояниеРасчета.Код = КодыСостоянийРасчетаПланаПроизводства.Отменяется;
Если ЗаблокироватьСписокПолуфабрикатов Тогда
ПолуфабрикатыСостояниеРасчета = НСтр("ru = 'рассчитываются'");
ЗаблокироватьСписокПолуфабрикатов();
ПодключитьОбработчикОжидания("КонтрольРассчетаПланаПроизводства", 2, Истина);
Иначе
ПолуфабрикатыСостояниеРасчета = "";
РазблокироватьОбновитьСтраницуПолуфабрикаты();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаблокироватьСписокПолуфабрикатов()
Элементы.ПолуфабрикатыУправление.Доступность = Ложь;
Элементы.ИнформационныйТекст.ТолькоПросмотр = Истина;
Элементы.СписокПолуфабрикатов.ТолькоПросмотр = Истина;
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокПолуфабрикатов, "Регистратор", Неопределено, ВидСравненияКомпоновкиДанных.Равно,, Истина);
КонецПроцедуры
&НаСервере
Процедура РазблокироватьСписокПолуфабрикатов()
Элементы.ПолуфабрикатыУправление.Доступность = Истина;
Элементы.ИнформационныйТекст.ТолькоПросмотр = Ложь;
Элементы.СписокПолуфабрикатов.ТолькоПросмотр = Ложь;
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокПолуфабрикатов, "Регистратор", Неопределено, ВидСравненияКомпоновкиДанных.Равно,, Ложь);
КонецПроцедуры
&НаСервере
Процедура РазблокироватьОбновитьСтраницуПолуфабрикаты()
РазблокироватьСписокПолуфабрикатов();
ОбновитьСтраницуПолуфабрикаты();
КонецПроцедуры
&НаСервере
Процедура УстановитьСвойстваДинамическогоСпискаПолуфабрикатов(ЕстьОтборПоВхождениямПолуфабриката = Ложь)
СписокОтборов = Новый Структура();
СписокОтборов.Вставить("ЕстьОтборПоВхождениямПолуфабриката", ЕстьОтборПоВхождениямПолуфабриката);
СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
ТекстЗапроса = РегистрыНакопления.ПланыПроизводства.ТекстЗапросаДинамическогоСписокПолуфабрикатов(СписокОтборов);
СвойстваСписка.ТекстЗапроса = ТекстЗапроса;
СвойстваСписка.ОсновнаяТаблица = СписокПолуфабрикатов.ОсновнаяТаблица;
СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписокПолуфабрикатов, СвойстваСписка);
ДинамическийСписокПолуфабрикатовИнициализирован = Истина;
ДинамическийСписокПолуфабрикатовЕстьОтборПоВхождениямПолуфабриката = ЕстьОтборПоВхождениямПолуфабриката;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СостояниеРасчетаПланаПроизводства(Ссылка)
Массив = Новый Массив;
Массив.Добавить(Ссылка);
Возврат Документы.ПланПроизводства.СостоянияРасчетаПланаПроизводства(Массив).Получить(Ссылка);
КонецФункции
&НаКлиенте
Процедура УстановитьОтменуИКомментарийЯчейки()
ЯчейкаНайдена = Ложь;
Если Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПолуфабрикатыКроссТаблица Тогда
ЭлементыПродукцияПоДатам = Элементы.ПолуфабрикатыПоДатам;
ЭлементыЯчейкаОтменена = Элементы.ЯчейкаОтменена1;
ЭлементыКомментарийКЯчейке = Элементы.КомментарийКЯчейке1;
ПолеПродукция = "ПолуфабрикатыПоДатамКоличество_";
Иначе
ЭлементыПродукцияПоДатам = Элементы.ПродукцияПоДатам;
ЭлементыЯчейкаОтменена = Элементы.ЯчейкаОтменена;
ЭлементыКомментарийКЯчейке = Элементы.КомментарийКЯчейке;
ПолеПродукция = "ПродукцияПоДатам" + "Количество_";
КонецЕсли;
ТекущиеДанные = ЭлементыПродукцияПоДатам.ТекущиеДанные;
Если ТекущиеДанные = Неопределено
Или (ТекущиеДанные.Полуфабрикат
И Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница <> Элементы.ГруппаПолуфабрикатыКроссТаблица) Тогда
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
ЭлементыЯчейкаОтменена.Доступность = ЯчейкаНайдена;
ЭлементыКомментарийКЯчейке.Доступность = ЯчейкаНайдена;
Возврат;
КонецЕсли;
Если ЭлементыПродукцияПоДатам.ТекущийЭлемент <> Неопределено Тогда
Для каждого Период Из ЭтаФорма.Периоды.НайтиСтроки(Новый Структура("Активная", Истина)) Цикл
Если ЭлементыПродукцияПоДатам.ТекущийЭлемент.Имя = ПолеПродукция+Период.ИмяКолонки Тогда
ТекущиеДанные["Отменено_"+ Период.ИмяКолонки] = ЯчейкаОтменена;
ТекущиеДанные["Комментарий_"+ Период.ИмяКолонки] = КомментарийКЯчейке;
ТекущиеДанные["КартинкаКомментарий_"+ Период.ИмяКолонки] = ЗначениеЗаполнено(КомментарийКЯчейке);
ЯчейкаНайдена = Истина;
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ ЯчейкаНайдена Тогда
ЯчейкаОтменена = Ложь;
КомментарийКЯчейке = "";
КонецЕсли;
ЭлементыЯчейкаОтменена.Доступность = ЯчейкаНайдена;
ЭлементыКомментарийКЯчейке.Доступность = ЯчейкаНайдена;
КонецПроцедуры
&НаКлиенте
Процедура КомментарийКЯчейкеНачалоВыбораЗавершение(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
Если ВведенныйТекст = Неопределено Тогда
Возврат;
КонецЕсли;
КомментарийКЯчейке = ВведенныйТекст;
Модифицированность = Истина;
КомментарийКЯчейкеПриИзменении(Элементы.КомментарийКЯчейке);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьФлагОтменыСтрокПланаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено ИЛИ Результат = КодВозвратаДиалога.Отмена Тогда
Возврат
КонецЕсли;
Если Объект.КроссТаблица Тогда
Если Элементы.ГруппаПродукцияПредставления.ТекущаяСтраница = Элементы.ГруппаПолуфабрикатыКроссТаблица Тогда
ВыделенныеСтроки = Элементы.ПолуфабрикатыПоДатам.ВыделенныеСтроки;
Иначе
ВыделенныеСтроки = Элементы.ПродукцияПоДатам.ВыделенныеСтроки;
КонецЕсли;
Иначе
ВыделенныеСтроки = Элементы.Продукция.ВыделенныеСтроки;
КонецЕсли;
Если ВыделенныеСтроки.Количество() > 0 Тогда
РассчитатьИтоговыеПоказатели(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НастроитьИЗаполнитьПоПравилуЗаполненияЗавершение(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
ОтборУстановлен = Настройки.ОтборУстановлен;
Настройки.Вставить("ЗаполнятьПоПравилу", Истина);
ЗаполнитьЗначенияСвойств(Объект, Настройки, "ОбновитьДополнить, ИзменитьРезультатНа, ТочностьОкругления");
ЗаполнитьДокумент(Настройки);
КонецПроцедуры
&НаСервере
Процедура ОбновитьСтраницуПолуфабрикаты(Инициализация = Ложь)
Если Не АвтоДопланированиеПолуфабрикатов(ЭтаФорма) Тогда
Возврат;
КонецЕсли;
КоличествоСтрок = РегистрыНакопления.ПланыПроизводства.РассчитатьКоличествоПолуфабрикатов(Объект.Ссылка);
ПолуфабрикатыСостояниеРасчета = Формат(КоличествоСтрок, "ЧН=");
ПроверитьЕстьОтмененныеКорректировки();
Обновление = (Не Инициализация И Не ТребуетсяУстановитьПараметрыДинамическогоСписка());
Если Обновление Тогда
Элементы.СписокПолуфабрикатов.Обновить();
Иначе
Если Не ДинамическийСписокПолуфабрикатовИнициализирован Тогда
УстановитьСвойстваДинамическогоСпискаПолуфабрикатов();
КонецЕсли;
СписокПолуфабрикатов.Параметры.УстановитьЗначениеПараметра("ПланПроизводства", Объект.Ссылка);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ТребуетсяУстановитьПараметрыДинамическогоСписка()
Если Не ДинамическийСписокПолуфабрикатовИнициализирован Тогда
Возврат Истина;
КонецЕсли;
Параметр = Новый ПараметрКомпоновкиДанных("ПланПроизводства");
ЗначениеПараметра = СписокПолуфабрикатов.Параметры.НайтиЗначениеПараметра(Параметр);
Возврат ( ЗначениеПараметра = Неопределено ИЛИ ЗначениеПараметра.Значение <> Объект.Ссылка );
КонецФункции
&НаСервере
Процедура ПрочитатьУстановитьПараметрыВыбораСпецификаций()
ПараметрыВыбораСпецификаций = УправлениеДаннымиОбИзделиях.ПараметрыВыбораСпецификаций(Объект, Документы.ПланПроизводства);
МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(Элементы.ПродукцияСпецификация);
МассивЭлементов.Добавить(Элементы.ПродукцияПоДатамСпецификация);
УправлениеДаннымиОбИзделияхКлиентСервер.УстановитьПараметрыВыбораСпецификаций(МассивЭлементов, ПараметрыВыбораСпецификаций);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция АвтоДопланированиеПолуфабрикатов(Форма)
Возврат Форма.ЗаполнятьСпецификацию
И Форма.ПланироватьПолуфабрикатыАвтоматически
И Форма.УправлениеПредприятием;
КонецФункции
&НаСервере
Процедура ПроверитьЕстьОтмененныеКорректировки()
Возврат;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьДатуЗапускаПродукции(Форма, ТекущиеДанные)
Объект = Форма.Объект;
Если ЗначениеЗаполнено(Объект.Сценарий)
И ЗначениеЗаполнено(ТекущиеДанные.ДатаВыпуска)
И ЗначениеЗаполнено(ТекущиеДанные.Спецификация)
И НЕ Форма.ЭтоРазборка Тогда
ТекущиеДанные.ДатаЗапуска = РассчитатьДатуЗапускаСервер(
Объект.Сценарий,
ТекущиеДанные.Спецификация,
ТекущиеДанные.ДатаВыпуска,
ТекущиеДанные.ДатаЗапуска,
РаботаСТабличнымиЧастямиКлиентСервер.КэшСтроки(Форма.Элементы.Продукция, Форма),
Новый Структура("ДатаВыпуска, ДатаЗапуска", "ДатаВыпуска", "ДатаЗапуска"),
Объект.СпособРасчетаПотребностейВМатериалах);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция РассчитатьДатуЗапускаСервер(Сценарий, Спецификация, ДатаВыпуска, ДатаЗапуска, ДанныеДоИзменения, ИменаПолей, СпособРасчетаМатериалов)
Если ЗначениеЗаполнено(ДанныеДоИзменения[ИменаПолей.ДатаЗапуска])
И ЗначениеЗаполнено(ДанныеДоИзменения[ИменаПолей.ДатаВыпуска])
И ЗначениеЗаполнено(ДанныеДоИзменения.Спецификация) Тогда
НормативнаяДатаЗапускаДоИзменения = Планирование.РассчитатьДатуЗапуска(
Сценарий,
ДанныеДоИзменения[ИменаПолей.ДатаВыпуска],
ДанныеДоИзменения.Спецификация,
СпособРасчетаМатериалов);
Если НормативнаяДатаЗапускаДоИзменения <> ДанныеДоИзменения[ИменаПолей.ДатаЗапуска] Тогда
Возврат ДатаЗапуска;
КонецЕсли;
КонецЕсли;
Возврат Планирование.РассчитатьДатуЗапуска(Сценарий, ДатаВыпуска, Спецификация, СпособРасчетаМатериалов);
КонецФункции
&НаСервере
Процедура ЗаполнитьДатыЗапускаПродукции(ЭтотОбъект = Неопределено)
Если ЭтотОбъект = Неопределено Тогда
ЭтотОбъект = Объект;
КонецЕсли;
Если ЭтотОбъект.Продукция.Количество() = 0 ИЛИ ЭтоРазборка Тогда
Возврат;
КонецЕсли;
Планирование.ПолучитьДлительностьСпецификацийИЗаполнитьДатыПоГрафику(
ЭтотОбъект.Продукция,
"ДатаВыпуска",
"ДатаЗапуска",
ЭтотОбъект.Сценарий,
Ложь,
ЭтотОбъект.СпособРасчетаПотребностейВМатериалах);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ЗаголовокТабличнойЧасти(ТипПроизводственногоПроцесса)
ТипПроцесса = ?(ТипПроизводственногоПроцесса.Пустая(),
ПредопределенноеЗначение("Перечисление.ТипыПроизводственныхПроцессов.Сборка"),
ТипПроизводственногоПроцесса);
Возврат ПроизводствоКлиентСервер.ЗаголовокТабличнойЧастиПоТипуПроцесса(ТипПроцесса);
КонецФункции
&НаСервере
Процедура ЗаполнитьСпецификациюВСтрокахПродукции(Знач Идентификаторы = Неопределено, РежимПроверитьЗаполнить = Ложь, ТолькоНезаполненные = Ложь)
Модифицированность = Истина;
МассивСтрок = Новый Массив;
ОписаниеТаблицы = ОписаниеТаблицыПродукции(ЭтаФорма);
Если Идентификаторы <> Неопределено Тогда
Для каждого Идентификатор Из Идентификаторы Цикл
Строка = ОписаниеТаблицы.ТЧ.НайтиПоИдентификатору(Идентификатор);
Если ТолькоНезаполненные И ЗначениеЗаполнено(Строка.Спецификация) Тогда
Продолжить;
КонецЕсли;
МассивСтрок.Добавить(Строка);
КонецЦикла;
Иначе
Для каждого Строка Из ОписаниеТаблицы.ТЧ Цикл
Если ТолькоНезаполненные И ЗначениеЗаполнено(Строка.Спецификация) Тогда
Продолжить;
КонецЕсли;
МассивСтрок.Добавить(Строка);
КонецЦикла;
КонецЕсли;
ДанныеОбИзделиях = Новый Массив;
Для каждого Строка Из МассивСтрок Цикл
ДанныеОбИзделии = УправлениеДаннымиОбИзделияхКлиентСервер.СобратьДанныеОбИзделииДляВыбораСпецификации(
Объект, Строка, ПараметрыВыбораСпецификаций, ЭтаФорма, Новый Структура("КлючПутейКДанным", ОписаниеТаблицы.ПутьКДанным));
Если РежимПроверитьЗаполнить Тогда
ДанныеОбИзделии.Вставить("ТекущаяСпецификация", Строка.Спецификация);
КонецЕсли;
ДанныеОбИзделиях.Добавить(ДанныеОбИзделии);
КонецЦикла;
УправлениеДаннымиОбИзделиях.ЗаполнитьСпецификациюВСтроках(МассивСтрок, ДанныеОбИзделиях, ПараметрыВыбораСпецификаций);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеТаблицыПродукции(Форма)
Объект = Форма.Объект;
Результат = Новый Структура("ТЧ, ИмяТЧ, ПутьКДанным");
Если Объект.КроссТаблица ИЛИ Форма.ИспользуютсяПланируемыеОстатки Тогда
Результат.ПутьКДанным = "ПродукцияПоДатам";
Результат.ТЧ = Форма.ПродукцияПоДатам;
Результат.ИмяТЧ = "ПродукцияПоДатам";
Иначе
Результат.ПутьКДанным = "Объект.Продукция";
Результат.ТЧ = Объект.Продукция;
Результат.ИмяТЧ = "Продукция";
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Функция ПараметрыПереходаКОшибкамРасчетаПланаПроизводства(Ссылка)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Данные", Ссылка);
ПараметрыФормы.Вставить("СобытиеЖурналаРегистрации", ПроизводствоСервер.СобытиеОбработкаОчередиЗаданий());
ОтборПоУровню = Новый СписокЗначений;
ОтборПоУровню.Добавить("Ошибка", "Ошибка");
ПараметрыФормы.Вставить("Уровень", ОтборПоУровню);
Возврат ПараметрыФормы;
КонецФункции
&НаСервере
Функция ПоместитьПродукциюВХранилище()
Если Объект.КроссТаблица Тогда
ПродукцияДляРаспределения = ПродукцияПоДатам.Выгрузить(, "Номенклатура, Характеристика");
Иначе
ПродукцияДляРаспределения = Объект.Продукция.Выгрузить(, "Номенклатура, Характеристика");
КонецЕсли;
Возврат ПоместитьВоВременноеХранилище(ПродукцияДляРаспределения);
КонецФункции
&НаКлиенте
Процедура РаспределениеКоличестваЗавершение(ПараметрыРаспределения, ДополнительныеПараметры) Экспорт
Если ПараметрыРаспределения = Неопределено Тогда
Возврат;
КонецЕсли;
Если ПараметрыРаспределения.Операция = "ПоНормеВыпуска"
И ПараметрыРаспределения.ВариантРаспределенияПоНормеВыпуска = "КратностьИзделий" Тогда
РаспределитьКоличествоПоИзделиямНаСервере(ПараметрыРаспределения.АдресХранилищаКратность);
Возврат;
КонецЕсли;
ВыделенныеСтроки = ?(Объект.КроссТаблица, Элементы.ПродукцияПоДатам.ВыделенныеСтроки,
Элементы.Продукция.ВыделенныеСтроки);
НовоеКоличествоПериодов = КоличествоПериодов;
Если ПараметрыРаспределения.Операция = "ПоПериодам" Тогда
НовоеКоличествоПериодов = ПараметрыРаспределения.КоличествоПериодов;
ИначеЕсли ПараметрыРаспределения.Операция = "ПоНормеВыпуска" Тогда
Для Каждого НомерСтроки Из ВыделенныеСтроки Цикл
Строка = ?(Объект.КроссТаблица, ПродукцияПоДатам.НайтиПоИдентификатору(НомерСтроки),
Объект.Продукция.НайтиПоИдентификатору(НомерСтроки));
МассивНовоеКоличество = РассчитатьНовоеКоличество(Строка.КоличествоУпаковок, ПараметрыРаспределения);
Если МассивНовоеКоличество.Количество() > НовоеКоличествоПериодов Тогда
НовоеКоличествоПериодов = МассивНовоеКоличество.Количество();
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НовоеКоличествоПериодов > КоличествоПериодов Тогда
КоличествоПериодов = НовоеКоличествоПериодов;
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(Объект.Периодичность, Объект.НачалоПериода,
Объект.ОкончаниеПериода, , НовоеКоличествоПериодов, Истина);
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ТаблицаПериоды = ЭтотОбъект["Периоды"];
СтрокиДляПересчетаДатыЗапуска = Новый Массив;
СтрокиДляУдаления = Новый Массив;
Для Каждого НомерСтроки Из ВыделенныеСтроки Цикл
Строка = ?(Объект.КроссТаблица, ПродукцияПоДатам.НайтиПоИдентификатору(НомерСтроки),
Объект.Продукция.НайтиПоИдентификатору(НомерСтроки));
МассивНовоеКоличество = РассчитатьНовоеКоличество(Строка.КоличествоУпаковок, ПараметрыРаспределения);
Индекс = 0;
Для каждого Период Из ТаблицаПериоды Цикл
Если Индекс > МассивНовоеКоличество.ВГраница() Тогда
Прервать;
КонецЕсли;
Если НЕ Период.Активная ИЛИ Период.НомерКолонки <= 0 Тогда
Продолжить;
КонецЕсли;
Если Объект.КроссТаблица Тогда
Строка["Количество_" + Период.ИмяКолонки] = МассивНовоеКоличество[Индекс];
Иначе
НоваяСтрока = Объект.Продукция.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
НоваяСтрока.КоличествоУпаковок = МассивНовоеКоличество[Индекс];
НоваяСтрока[?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска")] = Период.ДатаНачала;
СтрокиДляПересчетаДатыЗапуска.Добавить(НоваяСтрока.ПолучитьИдентификатор());
ПересчитатьКоличествоУпаковокИСуммуВСтроке(НоваяСтрока, КэшированныеЗначения);
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
Если Не Объект.КроссТаблица Тогда
СтрокиДляУдаления.Добавить(Строка);
КонецЕсли;
КонецЦикла;
Если Не Объект.КроссТаблица Тогда
ДатыЗапускаДобавленныхСтрок(СтрокиДляПересчетаДатыЗапуска);
Для Каждого Строка Из СтрокиДляУдаления Цикл
Объект.Продукция.Удалить(Строка);
КонецЦикла;
КонецЕсли;
Модифицированность = Истина;
РассчитатьИтоговыеПоказатели(ЭтотОбъект);
РассчитатьКоличествоСтрок(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Функция РассчитатьНовоеКоличество(КоличествоИзделий, ПараметрыРаспределения)
МассивНовоеКоличество = Новый Массив;
Если ПараметрыРаспределения.Операция = "ПоНормеВыпуска" Тогда
МассивНовоеКоличество = КратноеРаспределениеИзделий(КоличествоИзделий, ПараметрыРаспределения.Кратность);
ИначеЕсли ПараметрыРаспределения.Операция = "ПоПериодам" Тогда
НовоеКоличествоПериодов = ПараметрыРаспределения.КоличествоПериодов;
Если ПараметрыРаспределения.ВариантРаспределенияПоПериодам = "Пропорционально" Тогда
НовоеКоличество = Окр(КоличествоИзделий / НовоеКоличествоПериодов, ПараметрыРаспределения.ТочностьОкругления + 3);
КоличествоКРаспределению = КоличествоИзделий;
Для индекс = 0 По НовоеКоличествоПериодов - 1 Цикл
Если КоличествоКРаспределению <= НовоеКоличество Или НовоеКоличество = 0 Тогда
МассивНовоеКоличество.Добавить(КоличествоКРаспределению);
КоличествоКРаспределению = 0;
Иначе
МассивНовоеКоличество.Добавить(НовоеКоличество);
КоличествоКРаспределению = КоличествоКРаспределению - НовоеКоличество;
КонецЕсли;
КонецЦикла;
Иначе
ИтогДолей = 0;
Для Каждого Доля Из ПараметрыРаспределения.Доли Цикл
ИтогДолей = ИтогДолей + Доля;
КонецЦикла;
ЗначениеДоли = КоличествоИзделий / ИтогДолей;
МассивНовоеКоличество = Новый Массив;
Для Каждого Доля Из ПараметрыРаспределения.Доли Цикл
МассивНовоеКоличество.Добавить(Окр(ЗначениеДоли * Доля, ПараметрыРаспределения.ТочностьОкругления + 3));
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат МассивНовоеКоличество;
КонецФункции
&НаСервере
Процедура ДатыЗапускаДобавленныхСтрок(СтрокиДляПересчетаДатыЗапуска)
Для Каждого Элемент Из СтрокиДляПересчетаДатыЗапуска Цикл
РассчитатьДатуЗапускаПродукции(ЭтотОбъект, Объект.Продукция.НайтиПоИдентификатору(Элемент));
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура РаспределитьКоличествоПоИзделиямНаСервере(АдресХранилищаКратность)
ПараметрыОтбора = Новый Структура("Номенклатура, Характеристика");
КратностиИзделий = ПолучитьИзВременногоХранилища(АдресХранилищаКратность);
НовоеКоличествоПериодов = КоличествоПериодов;
Для Каждого Изделие Из КратностиИзделий Цикл
Если Изделие.Кратность = 0 Тогда
Продолжить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ПараметрыОтбора, Изделие);
СтрокиТЧ = ?(Объект.КроссТаблица, ПродукцияПоДатам.НайтиСтроки(ПараметрыОтбора),
Объект.Продукция.НайтиСтроки(ПараметрыОтбора));
Для Каждого СтрокаТЧ Из СтрокиТЧ Цикл
МассивНовоеКоличество = КратноеРаспределениеИзделий(СтрокаТЧ.КоличествоУпаковок, Изделие.Кратность);
Если МассивНовоеКоличество.Количество() > НовоеКоличествоПериодов Тогда
НовоеКоличествоПериодов = МассивНовоеКоличество.Количество();
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если НовоеКоличествоПериодов > КоличествоПериодов Тогда
КоличествоПериодов = НовоеКоличествоПериодов;
ПланированиеКлиентСервер.УстановитьНачалоОкончаниеПериодаПлана(Объект.Периодичность, Объект.НачалоПериода,
Объект.ОкончаниеПериода, , НовоеКоличествоПериодов, Истина);
ПриИзмененииПериодовНаСервере();
КонецЕсли;
ТаблицаПериоды = ЭтотОбъект["Периоды"];
Для Каждого Изделие Из КратностиИзделий Цикл
Если Изделие.Кратность = 0 Тогда
Продолжить;
КонецЕсли;
СтрокиДляУдаления = Новый Массив;
ЗаполнитьЗначенияСвойств(ПараметрыОтбора, Изделие);
СтрокиТЧ = ?(Объект.КроссТаблица, ПродукцияПоДатам.НайтиСтроки(ПараметрыОтбора),
Объект.Продукция.НайтиСтроки(ПараметрыОтбора));
Для Каждого СтрокаТЧ Из СтрокиТЧ Цикл
МассивНовоеКоличество = КратноеРаспределениеИзделий(СтрокаТЧ.КоличествоУпаковок, Изделие.Кратность);
МаксимальныйИндекс = МассивНовоеКоличество.ВГраница();
Индекс = 0;
Для каждого Период Из ТаблицаПериоды Цикл
Если Не Объект.КроссТаблица И Индекс > МаксимальныйИндекс Тогда
Прервать;
КонецЕсли;
Если НЕ Период.Активная ИЛИ Период.НомерКолонки <= 0 Тогда
Продолжить;
КонецЕсли;
Если Объект.КроссТаблица Тогда
Если Индекс > МаксимальныйИндекс Тогда
СтрокаТЧ["Количество_" + Период.ИмяКолонки] = 0;
Продолжить;
КонецЕсли;
СтрокаТЧ["Количество_" + Период.ИмяКолонки] = МассивНовоеКоличество[Индекс];
Иначе
НоваяСтрока = Объект.Продукция.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
НоваяСтрока.КоличествоУпаковок = МассивНовоеКоличество[Индекс];
НоваяСтрока[?(ЭтоРазборка, "ДатаЗапуска", "ДатаВыпуска")] = Период.ДатаНачала;
РассчитатьДатуЗапускаПродукции(ЭтотОбъект, НоваяСтрока);
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
Если Не Объект.КроссТаблица Тогда
СтрокиДляУдаления.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
Если Не Объект.КроссТаблица Тогда
Для Каждого Строка Из СтрокиДляУдаления Цикл
Объект.Продукция.Удалить(Строка);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Модифицированность = Истина;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция КратноеРаспределениеИзделий(КоличествоИзделий, Кратность)
МассивНовоеКоличество = Новый Массив;
НовоеКоличествоПериодов = Цел(КоличествоИзделий / Кратность);
КоличествоПоследнегоПериода = КоличествоИзделий - НовоеКоличествоПериодов * Кратность;
Пока НовоеКоличествоПериодов > 0 Цикл
МассивНовоеКоличество.Добавить(Кратность);
НовоеКоличествоПериодов = НовоеКоличествоПериодов - 1;
КонецЦикла;
Если КоличествоПоследнегоПериода > 0 Тогда
МассивНовоеКоличество.Добавить(КоличествоПоследнегоПериода);
КонецЕсли;
Возврат МассивНовоеКоличество;
КонецФункции
#Область КорректировкиОбеспечения
&НаСервере
Процедура ПрочитатьЕстьОтмененныеКорректировкиОбеспечения()
Если ЗаполнятьПоДефициту И ЗначениеЗаполнено(Объект.Ссылка) Тогда
Видимость = РегистрыСведений.ОтменаКорректировокПлановОбеспечения.ЕстьОтмененныеКорректировки(Объект.Ссылка);
Иначе
Видимость = Ложь;
КонецЕсли;
Элементы.НадписьЕстьОтмененныеКорректировкиОбеспечения.Видимость = Видимость;
КонецПроцедуры
&НаКлиенте
Процедура СкорректироватьОбеспечения()
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("План", Объект.Ссылка);
ПараметрыФормы.Вставить("Сценарий", Объект.Сценарий);
ПараметрыФормы.Вставить("ВидПлана", Объект.ВидПлана);
ПараметрыФормы.Вставить("Период", Объект.НачалоПериода);
ПараметрыФормы.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
ПараметрыФормы.Вставить("Характеристика", ТекущаяСтрока.Характеристика);
ПараметрыФормы.Вставить("Назначение", ТекущаяСтрока.Назначение);
ПараметрыФормы.Вставить("Обеспечить", ТекущаяСтрока.Количество);
ПараметрыФормы.Вставить("ИнтервалПотребностиОт", ТекущаяСтрока.ИнтервалПотребностиОт);
ПараметрыФормы.Вставить("ИнтервалПотребностиДо", ТекущаяСтрока.ИнтервалПотребностиДо);
ПараметрыФормы.Вставить("ЗаданИнтервалПотребности", ТекущаяСтрока.ЗаданИнтервалПотребности);
ПараметрыФормы.Вставить("Комментарий", ТекущаяСтрока.Комментарий);
ОписаниеОповещения = Новый ОписаниеОповещения("СкорректироватьОбеспечениеЗавершение",ЭтотОбъект);
ОткрытьФорму("РегистрСведений.ОтменаКорректировокПлановОбеспечения.Форма.ФормаРедактированияОбеспечения", ПараметрыФормы, ЭтаФорма,,,,ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура СкорректироватьОбеспечениеЗавершение(Настройки, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Настройки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
Если Настройки.УстановитьКорректировку Тогда
УстановитьКорректировкуОбеспечения(Настройки)
Иначе
ОтменитьКорректировкуОбеспеченияНаКлиенте(Элементы.Продукция.ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияПередНачаломИзменения(Элемент, Отказ)
Если ЗаполнятьПоДефициту
И Элемент.ТекущийЭлемент.Имя = "ПродукцияКоличествоУпаковок" Тогда
СкорректироватьОбеспечения();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПродукцияКоличествоУпаковокАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если ЗаполнятьПоДефициту Тогда
СтандартнаяОбработка = Ложь;
СкорректироватьОбеспечения();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьКорректировку(Команда)
СкорректироватьОбеспечения();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьКорректировкуОбеспечения(Настройки)
ТекущаяСтрока = Элементы.Продукция.ТекущиеДанные;
ТекущаяСтрока.Количество = Настройки.Обеспечить;
ТекущаяСтрока.ИнтервалПотребностиОт = Настройки.ИнтервалПотребностиОт;
ТекущаяСтрока.ИнтервалПотребностиДо = Настройки.ИнтервалПотребностиДо;
ТекущаяСтрока.ЗаданИнтервалПотребности = Истина;
ТекущаяСтрока.Комментарий = Настройки.Комментарий;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, Новый Структура("ПересчитатьКоличествоУпаковок"), КэшированныеЗначения);
РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьКорректировкуОбеспечения(Команда)
ВыделенныеСтроки = Элементы.Продукция.ВыделенныеСтроки;
Для каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
ВыделеннаяСтрока = Объект.Продукция.НайтиПоИдентификатору(ИдентификаторСтроки);
Если ВыделеннаяСтрока.ЗаданИнтервалПотребности Тогда
ОтменитьКорректировкуОбеспеченияНаКлиенте(ВыделеннаяСтрока);
КонецЕсли;
КонецЦикла
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьВсеКорректировки(Команда)
Для Каждого Строка Из Объект.Продукция Цикл
Если Строка.ЗаданИнтервалПотребности Тогда
ОтменитьКорректировкуОбеспеченияНаКлиенте(Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьКорректировкуОбеспеченияНаКлиенте(ТекущаяСтрока)
СтруктураЗаписи = Новый Структура();
СтруктураЗаписи.Вставить("План",Объект.Ссылка);
СтруктураЗаписи.Вставить("Номенклатура",ТекущаяСтрока.Номенклатура);
СтруктураЗаписи.Вставить("Характеристика",ТекущаяСтрока.Характеристика);
СтруктураЗаписи.Вставить("Назначение",ТекущаяСтрока.Назначение);
СтруктураЗаписи.Вставить("ПериодПланирования",Объект.НачалоПериода);
СтруктураЗаписи.Вставить("Обеспечить",ТекущаяСтрока.Количество);
СтруктураЗаписи.Вставить("ИнтервалПотребностиОт",ТекущаяСтрока.ИнтервалПотребностиОт);
СтруктураЗаписи.Вставить("ИнтервалПотребностиДо",ТекущаяСтрока.ИнтервалПотребностиДо);
ОтменитьКорректировкуОбеспеченияНаСервере(СтруктураЗаписи);
ТекущаяСтрока.ИнтервалПотребностиОт = 0;
ТекущаяСтрока.ИнтервалПотребностиДо = 0;
ТекущаяСтрока.ЗаданИнтервалПотребности = Ложь;
КонецПроцедуры
&НаСервере
Процедура ОтменитьКорректировкуОбеспеченияНаСервере(СтруктураЗаписи)
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
Возврат;
КонецЕсли;
СтруктураЗаписи.Вставить("ДатаКорректировки", ТекущаяДатаСеанса());
НаборЗаписей = РегистрыСведений.ОтменаКорректировокПлановОбеспечения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.План.Установить(СтруктураЗаписи.План);
НоваяЗапись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, СтруктураЗаписи);
НаборЗаписей.Записать();
Элементы.НадписьЕстьОтмененныеКорректировкиОбеспечения.Видимость = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСтрокиКорректировок(Команда)
Элементы.Продукция.ОтборСтрок = Новый ФиксированнаяСтруктура("ЗаданИнтервалПотребности", Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьВсе(Команда)
Элементы.Продукция.ОтборСтрок = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ДекорацияОтмененныеКорректировкиОбеспеченияНажатие(Элемент)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("План", Объект.Ссылка);
ПараметрыФормы.Вставить("ПоказыватьНазначение", Элементы.ПродукцияНазначение.Видимость);
ПараметрыФормы.Вставить("Отбор", Новый Структура("План", Объект.Ссылка));
ОткрытьФорму(
"РегистрСведений.ОтменаКорректировокПлановОбеспечения.Форма.ФормаСпискаПоПлану",
ПараметрыФормы,
ЭтотОбъект);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецОбласти