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

файл

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

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

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

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

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

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

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

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

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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокПоддерживаемыхЗапасов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область УсловноеОформление

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

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

&НаСервереБезКонтекста
Процедура ОформитьИсточникОбеспечения(УсловноеОформление, ИмяПоляВводаИсточникаОбеспечения,
									ПутьКПолюИсточникОбеспечения, ПутьКПолюТипОбеспечения)

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

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКПолюИсточникОбеспечения);
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<любые склады>'"));

	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляВводаИсточникаОбеспечения);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКПолюТипОбеспечения);
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыОбеспечения.Производство;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКПолюИсточникОбеспечения);
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<любые подразделения>'"));

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<сборка товаров>'"));

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляВводаИсточникаОбеспечения);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКПолюТипОбеспечения);
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыОбеспечения.Покупка;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКПолюИсточникОбеспечения);
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<любые поставщики>'"));
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКПолюИсточникОбеспечения);
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<любые переработчики>'"));
	
КонецПроцедуры

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

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

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

#Область ОбработчикиОповещений

&НаКлиенте
Процедура ДобавитьТоварыЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
	
	Если ЗначениеЗаполнено(АдресЗагруженныхДанных) Тогда
		ДобавитьПоддержанниеЗапасаТоваровНаСервере(АдресЗагруженныхДанных, Объект.Склад, ТекущаяГруппировка);
		Элементы.СписокПоддерживаемыхЗапасов.Обновить();
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура НастроитьСписокПоддерживаемыхЗапасовЗавершение(АдресНастроекКомпоновкиДанных, ДополнительныеПараметры) Экспорт
	Если ЗначениеЗаполнено(АдресНастроекКомпоновкиДанных) Тогда
		КомпоновщикНастроекПользовательский.ЗагрузитьПользовательскиеНастройки(
			ПолучитьИзВременногоХранилища(АдресНастроекКомпоновкиДанных));
		НастроитьСписокПоддерживаемыхЗапасовЗавершениеСервер();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура НастроитьСписокПоддерживаемыхЗапасовЗавершениеСервер()
	
	СохранитьНастройки();
	ЗагрузитьПользовательскиеНастройкиСписка();
	
КонецПроцедуры

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

#Область РасчетРекомендаций

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

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

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

	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

#Область НастройкаФормы

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

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

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

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

#Область Команды_Группировка_Служебные

&НаСервереБезКонтекста
Функция ИмяНовойГруппировкиПоУмолчанию(СвойстваВыделенныхСтрок)
	
	Возврат Справочники.ГруппировкиТоварныхОграничений.ИмяНовойГруппировкиПоУмолчанию(СвойстваВыделенныхСтрок);
	
КонецФункции

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

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

#Область Команды_Запасы_Служебные

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

&НаКлиенте
Процедура ЗаполнитьРесурс(Ресурс)
	Перем ЗначениеРесурса;
	
	ЗаголовокОкнаВводаЗначения =
		?(Ресурс = "МинимальноеКоличествоЗапаса",  НСтр("ru = 'Введите минимальный запас'"),
		?(Ресурс = "МаксимальноеКоличествоЗапаса", НСтр("ru = 'Введите максимальный запас'"),
		?(Ресурс = "СтраховоеКоличествоЗапаса",    НСтр("ru = 'Введите страховой запас'"),
		?(Ресурс = "НормаПотребления",             НСтр("ru = 'Введите норму потребления в день'"),
			НСтр("ru = 'Выберите обеспечение заказов'")))));
	
	ТекстСообщенияОбОшибке =
		?(Ресурс = "МинимальноеКоличествоЗапаса", НСтр("ru = 'Заполнение минимального запаса возможно только для строк с поддержанием запаса ""Min - max"".'"),
		?(Ресурс = "МаксимальноеКоличествоЗапаса", НСтр("ru = 'Заполнение максимального запаса возможно только для строк с поддержанием запаса ""Min - max"".'"),
		?(Ресурс = "СтраховоеКоличествоЗапаса", НСтр("ru = 'Заполнение страхового запаса возможно только для строк с поддержанием запаса ""Расчет по норме"", ""Расчет по статистике"".'"),
		?(Ресурс = "НормаПотребления", НСтр("ru = 'Заполнение нормы потребления возможно только для строк с поддержанием запаса ""Расчет по норме"".'"), 
		НСтр("ru = 'Заполнение обеспечения заказа возможно только для строк с поддержанием запаса.'")))));
	
	ТекстРесурсЗаполнен =
		?(Ресурс = "МинимальноеКоличествоЗапаса",  НСтр("ru = 'Минимальный запас заполнен.'"),
		?(Ресурс = "МаксимальноеКоличествоЗапаса", НСтр("ru = 'Максимальный запас заполнен.'"),
		?(Ресурс = "СтраховоеКоличествоЗапаса",    НСтр("ru = 'Страховой запас заполнен.'"),
		?(Ресурс = "НормаПотребления",             НСтр("ru = 'Норма потребления заполнена.'"),
			НСтр("ru = 'Обеспечение заказов заполнено.'")))));
	
	ДополнительныеПараметры = Новый Структура("Ресурс, ТекстРесурсЗаполнен, ТекстСообщенияОбОшибке");
	ДополнительныеПараметры.Ресурс                 = Ресурс;
	ДополнительныеПараметры.ТекстРесурсЗаполнен    = ТекстРесурсЗаполнен;
	ДополнительныеПараметры.ТекстСообщенияОбОшибке = ТекстСообщенияОбОшибке;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗаполнитьРесурсПослеВводаЗначения", ЭтотОбъект, ДополнительныеПараметры);
	
	Если Ресурс = "ОбеспечениеЗаказовПриПоддержанииЗапаса" Тогда
		ПоказатьВводЗначения(ОписаниеОповещения, ЗначениеРесурса, ЗаголовокОкнаВводаЗначения,
			Новый ОписаниеТипов("ПеречислениеСсылка.ОбеспечениеЗаказовПриПоддержанииЗапаса"));
	Иначе
		ПоказатьВводЧисла(ОписаниеОповещения, ЗначениеРесурса, ЗаголовокОкнаВводаЗначения, 15, 3);
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область НастройкаСписка

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

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

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

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

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

&НаСервере
Процедура УстановитьСтандартныеНастройкиНаСервере()
	
	УстановитьСтандартныеПользовательскиеНастройкиСписка();
	ЗагрузитьПользовательскиеНастройкиСписка();
	
КонецПроцедуры

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

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

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

// Параметры:
//   ЭлементыПриемник - КоллекцияЭлементовОтбораКомпоновкиДанных, КоллекцияЭлементовПорядкаКомпоновкиДанных - Элементы в которые нужно заполнить.
//   ЭлементыИсточник - КоллекцияЭлементовОтбораКомпоновкиДанных, КоллекцияЭлементовПорядкаКомпоновкиДанных - Элементы которыми нужно заполнить.
&НаСервереБезКонтекста
Процедура ЗаполнитьСвойстваНастройки(ЭлементыПриемник,ЭлементыИсточник)
	Для Каждого ЭлементИсточник Из ЭлементыИсточник Цикл
		ТипИсточника = ТипЗнч(ЭлементИсточник);
		ЭлементПриемник = ЭлементыПриемник.Добавить(ТипИсточника);
		ЗаполнитьЗначенияСвойств(ЭлементПриемник, ЭлементИсточник);
		Если ТипИсточника=Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
			ЗаполнитьСвойстваНастройки(ЭлементПриемник.Элементы, ЭлементИсточник.Элементы);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

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

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

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

КонецФункции

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

&НаСервере
Процедура ОбработкаИзмененияРежимаПросмотра()
	УстановитьРежимРекомендацийИПросмотра();
	СинхронизироватьНастройкиКомпоновщиков();
	ЗагрузитьПользовательскиеНастройкиСписка();
КонецПроцедуры

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

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

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

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

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

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

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

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

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