План производства / Распределение количества / Модуль формы

файл

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	КоличествоПериодов = Параметры.КоличествоПериодов;
	
	Операция = "ПоНормеВыпуска";
	Кратность = 1;
	ВариантРаспределенияПоНормеВыпуска = "ВыделенныеСтроки";
	
	ВариантРаспределенияПоПериодам = "Пропорционально";
	
	ПодсказкаНормаВыпуска = НСтр("ru = 'Например, 10 шт изделий кратно 4 будет распределено по периодам как: 4, 4, 2.'");
	ПодсказкаРаспределение = НСтр("ru = 'Например, 10 шт изделий на 5 периодов будет распределено по 2 шт в каждом периоде при пропорциональном распределении.'");
	
	// Считываем сохраненный предыдущий выбор
	ПараметрыРаспределения = ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить(
		Строка(Сценарий.УникальныйИдентификатор()),
		"ПараметрыРаспределения");
	Если ТипЗнч(ПараметрыРаспределения) = Тип("Структура") Тогда
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПараметрыРаспределения,, "Доли");
		
		Если ПараметрыРаспределения.Свойство("Доли") И ВариантРаспределенияПоПериодам <> "Пропорционально" Тогда
			
			Для каждого Доля Из ПараметрыРаспределения.Доли Цикл
			
				НоваяСтрока = Доли.Добавить();
				НоваяСтрока.Доля = Доля;
			
			КонецЦикла;
			
		КонецЕсли; 
	КонецЕсли;
	
	ЗаполнитьДоли(Доли, КоличествоПериодов);
	
	ЗаполнитьИзделия(Параметры.АдресХранилищаРаспределение);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	УстановитьДоступностьВидимость();
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОперацияПриИзменении(Элемент)
	УстановитьДоступностьВидимость();
КонецПроцедуры

&НаКлиенте
Процедура ВариантРаспределенияПриИзменении(Элемент)
	УстановитьДоступностьВидимость();
КонецПроцедуры

&НаКлиенте
Процедура КоличествоПериодовПриИзменении(Элемент)
	ЗаполнитьДоли(Доли, КоличествоПериодов);
КонецПроцедуры

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

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

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура Назад(Команда)
	
	Если Операция = "ПоНормеВыпуска" Тогда
		Элементы.СтраницыПоНормеВыпуска.ТекущаяСтраница = Элементы.ГруппаПараметры;
	ИначеЕсли Операция = "ПоПериодам" Тогда
		Элементы.СтраницыПоПериодам.ТекущаяСтраница = Элементы.ГруппаОсновное;
	КонецЕсли;
	
	УстановитьДоступностьВидимость();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура УстановитьДоступностьВидимость()

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

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьДоли(Доли, КоличествоПериодов)
	
	ПредставлениеПериода = НСтр("ru = 'период'");
	
	Если КоличествоПериодов = Доли.Количество() Тогда
		
		Для каждого СтрокаТЧ Из Доли Цикл
			
			Период = Доли.Индекс(СтрокаТЧ) + 1;
			СтрокаТЧ.Период = Период;
			СтрокаТЧ.Представление = Строка(Период) + " " + ПредставлениеПериода;
		КонецЦикла;
	Иначе
	
		Доли.Очистить();
		
		Для Период =1 По КоличествоПериодов Цикл
			
			НоваяСтрока = Доли.Добавить();
			
			НоваяСтрока.Период = Период;
			НоваяСтрока.Представление = Строка(Период) + " " + ПредставлениеПериода;
			НоваяСтрока.Доля = 1;
		КонецЦикла;
	
	КонецЕсли; 

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

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

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

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

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