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

файл

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

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

	ЗакрыватьПриВыборе = Ложь;

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПереключательЗаказПодЗаказПриИзменении(Элемент)
	МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ЗаказПодЗаказ");
	ПриПереключенииМетодаОбеспечения();
КонецПроцедуры

&НаКлиенте
Процедура ПереключательМинМаксПриИзменении(Элемент)
	МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаМинМакс");
	ПриПереключенииМетодаОбеспечения();
КонецПроцедуры

&НаКлиенте
Процедура ПереключательНаСрокПоНормеПриИзменении(Элемент)
	МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоНорме");
	ПриПереключенииМетодаОбеспечения();
	РассчитатьЗапасы();
КонецПроцедуры

&НаКлиенте
Процедура ПереключательНаСрокПоСтатистикеПриИзменении(Элемент)
	МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике");
	ПриПереключенииМетодаОбеспечения();
	РассчитатьЗапасы();
КонецПроцедуры

&НаКлиенте
Процедура ПереключательСпособаУнаследованныйПриИзменении(Элемент)
	ПереключательСпособа = 0;
	ПриПереключенииСпособаОбеспечения();
	РассчитатьЗапасы();
КонецПроцедуры

&НаКлиенте
Процедура ПереключательСпособаИндивидуальныйПриИзменении(Элемент)
	ПереключательСпособа = 1;
	ПриПереключенииСпособаОбеспечения();
	РассчитатьЗапасы();
КонецПроцедуры

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

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

&НаКлиенте
Процедура Записать(Команда)
	
	ЗаписатьНаКлиенте();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)

	Если ЗаписатьНаКлиенте() Тогда
		Закрыть();
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте

// Возвращаемое значение:
//  см. СтруктураПараметровЦиклаПоставкиПоГрафикуРаботы
Функция ПараметрыЦиклаПоставкиОсновногоСпособаОбеспечения()
	
	Возврат ?(ПереключательСпособа = 1, ПараметрыЦиклаПоставкиПоГрафикуРаботыИндивидуальные,
			                            ПараметрыЦиклаПоставкиПоГрафикуРаботыУнаследованные);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СтруктураПараметровЦиклаПоставкиПоГрафикуРаботы()
	
	СтруктураПараметров = Новый Структура();
	
	СтруктураПараметров.Вставить("СрокИсполненияЗаказа", 0);
	СтруктураПараметров.Вставить("ОбеспечиваемыйПериод", 0);
	СтруктураПараметров.Вставить("НеЗаполненКалендарьПредприятия", Ложь);
	СтруктураПараметров.Вставить("НеЗаполненКалендарьСклада", Ложь);
	
	Возврат СтруктураПараметров;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЕстьОшибкиЦиклаПоставки(ПараметрыЦиклаПоставки)
	
	Возврат ПараметрыЦиклаПоставки.НеЗаполненКалендарьПредприятия
			Или ПараметрыЦиклаПоставки.НеЗаполненКалендарьСклада;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ТекстОшибкиЦиклаПоставки(ПараметрыЦиклаПоставки)
	
	Текст = "";
	Если ПараметрыЦиклаПоставки.НеЗаполненКалендарьПредприятия Тогда
		
		Текст = НСтр("ru = 'Ошибка расчета даты поставки и/или границы обеспечиваемого периода по способу обеспечения. Заполните календарь предприятия'");
		
	ИначеЕсли ПараметрыЦиклаПоставки.НеЗаполненКалендарьСклада Тогда
		
		Текст = НСтр("ru = 'Ошибка расчета интервала до даты поставки и / или между поставками. Заполните календарь работы склада'");
		
	КонецЕсли;
	
	Возврат Текст;
	
КонецФункции

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

&НаКлиенте
Функция ЗаписатьНаКлиенте(НеПроверятьЗаполнение = Ложь)

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

&НаКлиенте
Процедура ПриПереключенииСпособаОбеспечения()
	
	Если Параметры.РежимОткрытия = "ТолькоМетод" ИЛИ Параметры.РежимОткрытия = "ТолькоПараметры" Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.СтраницыИндивидуальныйСпособ.ТекущаяСтраница = ?(ПереключательСпособа = 1,
		Элементы.СтраницаИспользоватьСпособ,
		Элементы.СтраницаНеИспользоватьСпособ);
		
	Сроки = ПараметрыЦиклаПоставкиОсновногоСпособаОбеспечения();
	
	СпособОбеспеченияСтрокой =
		?(ПереключательСпособа = 1 И Не ЗначениеЗаполнено(СпособИндивидуальный), "",
		?(ЕстьОшибкиЦиклаПоставки(Сроки), ТекстОшибкиЦиклаПоставки(Сроки), 
		?(Сроки.СрокИсполненияЗаказа > 0 И Сроки.ОбеспечиваемыйПериод > 0, СтрШаблон(
			НСтр("ru = 'Ближайшее поступление (пополнение запаса) ожидается через %1 дн и обеспечивает период %2 дн.'"),
			Сроки.СрокИсполненияЗаказа,
			Сроки.ОбеспечиваемыйПериод),
		?(Сроки.СрокИсполненияЗаказа = 0 И Сроки.ОбеспечиваемыйПериод = 0,
			НСтр("ru = 'Поступление (пополнение запаса) возможно в любой день, обеспечиваемый период не ограничен.'"),
		?(Сроки.СрокИсполненияЗаказа > 0 И Сроки.ОбеспечиваемыйПериод = 0, СтрШаблон(
				НСтр("ru = 'Ближайшее поступление (пополнение запаса) ожидается через %1 дн, обеспечиваемый период не ограничен.'"),
				Сроки.СрокИсполненияЗаказа),
		СтрШаблон(
			НСтр("ru = 'Поступление (пополнение запаса) возможно в любой день и обеспечивает период %1 дн.'"),
			Сроки.ОбеспечиваемыйПериод))))));
	
КонецПроцедуры

&НаКлиенте
Процедура ПриПереключенииМетодаОбеспечения()
	
	Если Параметры.РежимОткрытия = "ТолькоСпособ" Тогда
		Возврат;
	КонецЕсли;
	
	ПереключательЗаказПодЗаказ      = 0;
	ПереключательМинМакс            = 0;
	ПереключательНаСрокПоНорме      = 0;
	ПереключательНаСрокПоСтатистике = 0;
	
	Если МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ЗаказПодЗаказ") Тогда
		ПереключательЗаказПодЗаказ = 1;
	ИначеЕсли МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаМинМакс") Тогда
		ПереключательМинМакс = 1;
	ИначеЕсли МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоНорме") Тогда
		ПереключательНаСрокПоНорме = 1;
	Иначе
		// Отрабатываем Метод обеспечения = "ПоддержаниеЗапасаНаСрокПоСтатистике".
		ПереключательНаСрокПоСтатистике = 1;
	КонецЕсли;

	Если Не ЗначениеЗаполнено(ОбеспечениеЗаказовПриПоддержанииЗапаса) Тогда
		ОбеспечениеЗаказовПриПоддержанииЗапаса = ПредопределенноеЗначение("Перечисление.ОбеспечениеЗаказовПриПоддержанииЗапаса.ЗаСчетЗапасов");
	КонецЕсли;

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

&НаКлиенте
Процедура РассчитатьЗапасы()
	
	РассчитываетсяИндивидуально = НСтр("ru = 'индивидуальный расчет для номенклатуры'");
	ОшибкаРасчетаЦиклПоставки   = НСтр("ru = 'ошибка расчета (нет данных графика работы)'");
	
	Если Параметры.РежимОткрытия = "ТолькоМетод" ИЛИ Параметры.РежимОткрытия = "ТолькоПараметры" Тогда
		МинимальныйЗапасСтрокой = РассчитываетсяИндивидуально;
		МаксимальныйЗапасСтрокой = РассчитываетсяИндивидуально;
		СреднедневноеПотреблениеСтрокой = РассчитываетсяИндивидуально;
		Элементы.МинимальныйЗапасСтрокой.ЦветТекста = ЦветПоясняющейНадписи;
		Элементы.МаксимальныйЗапасСтрокой.ЦветТекста = ЦветПоясняющейНадписи;
		Элементы.СреднедневноеПотреблениеСтрокой.ЦветТекста = ЦветПоясняющейНадписи;
		
		Возврат;
	КонецЕсли;
	
	Сроки = ПараметрыЦиклаПоставкиОсновногоСпособаОбеспечения();
	ЕстьОшибкиЦиклаПоставки = ЕстьОшибкиЦиклаПоставки(Сроки);
	
	Если МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоНорме") Тогда
		
		Если Не ЕстьОшибкиЦиклаПоставки Тогда
			МинимальныйЗапасРасчетный  = Сроки.СрокИсполненияЗаказа * НормаПотребления;
			МаксимальныйЗапасРасчетный = Сроки.ОбеспечиваемыйПериод * НормаПотребления;
		Иначе
			МинимальныйЗапасРасчетный  = 0;
			МаксимальныйЗапасРасчетный = 0;
		КонецЕсли;
		
		МинимальныйЗапасСтрокой =
			?(ЕстьОшибкиЦиклаПоставки, ОшибкаРасчетаЦиклПоставки,
			
			?(НормаПотребления = 0,
				НСтр("ru = 'задайте норму потребления'"),
			
			?(Сроки.СрокИсполненияЗаказа = 0, СтрШаблон(
				НСтр("ru = '0.000 %1 (на 0 дн)'"),
				ЕдиницаИзмерения),
					
			СтрШаблон(
				НСтр("ru = '%1 %2 (на %3 дн)'"),
				Формат(МинимальныйЗапасРасчетный, "ЧДЦ=3"),
				ЕдиницаИзмерения,
				Сроки.СрокИсполненияЗаказа))));
		
		МаксимальныйЗапасСтрокой =
			?(ЕстьОшибкиЦиклаПоставки, ОшибкаРасчетаЦиклПоставки,
		
			?(НормаПотребления = 0,
				НСтр("ru = 'задайте норму потребления'"),
				
			?(Сроки.ОбеспечиваемыйПериод = 0, СтрШаблон(
				НСтр("ru = '0.000 %1 (на 0 дн)'"),
				ЕдиницаИзмерения),
				
			СтрШаблон(
				НСтр("ru = '%1 %2 (на %3 дн)'"),
				Формат(МаксимальныйЗапасРасчетный, "ЧДЦ=3"),
				ЕдиницаИзмерения,
				Сроки.ОбеспечиваемыйПериод))));
		
		Элементы.МинимальныйЗапасСтрокой.ЦветТекста = ?(ЕстьОшибкиЦиклаПоставки Или НормаПотребления = 0,
			ЦветОшибки, ЦветИзСтиля);
			
		Элементы.МаксимальныйЗапасСтрокой.ЦветТекста = ?(ЕстьОшибкиЦиклаПоставки Или НормаПотребления = 0,
			ЦветОшибки, ЦветИзСтиля);
		
	ИначеЕсли МетодОбеспечения = ПредопределенноеЗначение("Перечисление.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаНаСрокПоСтатистике") Тогда
		
		Если Не ЕстьОшибкиЦиклаПоставки Тогда
			МинимальныйЗапасРасчетный  = Сроки.СрокИсполненияЗаказа    * СреднедневноеПотребление;
			МаксимальныйЗапасРасчетный = Сроки.ОбеспечиваемыйПериод    * СреднедневноеПотребление;
		Иначе
			МинимальныйЗапасРасчетный  = 0;
			МаксимальныйЗапасРасчетный = 0;
		КонецЕсли;
		
		МинимальныйЗапасСтрокой =
			?(ЕстьОшибкиЦиклаПоставки, ОшибкаРасчетаЦиклПоставки,
			
			?(СреднедневноеПотребление = 0,
				НСтр("ru = 'нет потребления по статистике'"),
			
			?(Сроки.СрокИсполненияЗаказа = 0, СтрШаблон(
				НСтр("ru = '0.000 %1 (на 0 дн)'"),
				ЕдиницаИзмерения),
				
			СтрШаблон(
				НСтр("ru = '%1 %2 (на %3 дн)'"),
				Формат(МинимальныйЗапасРасчетный, "ЧДЦ=3"),
				ЕдиницаИзмерения,
				Сроки.СрокИсполненияЗаказа))));
		
		МаксимальныйЗапасСтрокой =
			?(ЕстьОшибкиЦиклаПоставки, ОшибкаРасчетаЦиклПоставки,
			
			?(СреднедневноеПотребление = 0,
				НСтр("ru = 'нет потребления по статистике'"),
				
			?(Сроки.ОбеспечиваемыйПериод = 0, СтрШаблон(
				НСтр("ru = '0.000 %1 (на 0 дн)'"),
				ЕдиницаИзмерения),
				
			СтрШаблон(
				НСтр("ru = '%1 %2 (на %3 дн)'"),
				Формат(МаксимальныйЗапасРасчетный, "ЧДЦ=3"),
				ЕдиницаИзмерения,
				Сроки.ОбеспечиваемыйПериод))));
		
		СреднедневноеПотреблениеСтрокой =
			?(ЗначениеЗаполнено(ДлительнаяОперация), НСтр("ru = 'статистика рассчитывается...'"),
			
			?(ЕстьОшибкиЦиклаПоставки, ОшибкаРасчетаЦиклПоставки,
			
			?(СреднедневноеПотребление = 0, СтрШаблон(
				НСтр("ru = 'нет статистики за %1 - %2'"),
				Формат(ДанныеЗаПериод.ДатаНачала,    "ДЛФ=D"),
				Формат(ДанныеЗаПериод.ДатаОкончания, "ДЛФ=D")),
				
			СтрШаблон(
				НСтр("ru = '%1 (+/- %2) %3 (статистика за %4 - %5)'"),
				Формат(СреднедневноеПотребление, "ЧДЦ=3"),
				Формат(СреднееОтклонение, "ЧДЦ=3; ЧН=0.000"),
				ЕдиницаИзмерения,
				Формат(ДанныеЗаПериод.ДатаНачала,    "ДЛФ=D"),
				Формат(ДанныеЗаПериод.ДатаОкончания, "ДЛФ=D")))));
		
		Элементы.МинимальныйЗапасСтрокой.ЦветТекста = ?(ЕстьОшибкиЦиклаПоставки Или СреднедневноеПотребление = 0,
			ЦветОшибки, ЦветИзСтиля);
			
		Элементы.МаксимальныйЗапасСтрокой.ЦветТекста = ?(ЕстьОшибкиЦиклаПоставки Или СреднедневноеПотребление = 0,
			ЦветОшибки, ЦветИзСтиля);
			
		Элементы.СреднедневноеПотреблениеСтрокой.ЦветТекста = ?(СреднедневноеПотребление = 0,
			ЦветОшибки, ЦветИзСтиля);
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция ПараметрыЦиклаПоставкиПоГрафикуРаботыВызовСервера(КлючПотребности, СпособОбеспечения, НачалоПериода)
	Возврат ПараметрыЦиклаПоставкиПоГрафикуРаботы(КлючПотребности, СпособОбеспечения, НачалоПериода);
КонецФункции

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

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