Цены (прайс-лист) / Настройка прайс-листа / Модуль формы

файл

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

	КодФормы          = "Обработка_ПрайсЛист_ФормаНастройки";
	
	// Для работоспособности процедур подбора товаров.
	ИспользоватьФильтры = Истина;
	ФлагОткрытияФормы = Истина;
	
	//ИспользоватьЦеновыеГруппы              = ПолучитьФункциональнуюОпцию("ИспользоватьЦеновыеГруппы");
	ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
	ИспользоватьУпаковкиНоменклатуры       = ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры");
	ИспользоватьНесколькоВидовЦен          = ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВидовЦен");
	ИспользуетсяЦенообразование25          = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25(Дата);

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

	СтруктураДанных = ПолучитьИзВременногоХранилища(Параметры.НастройкиПрайсЛиста);
	УстановкаЦенСервер.ЗагрузитьНастройкиОтбораПоУмолчанию(ЭтотОбъект);
	КомпоновщикНастроекОтбор.ЗагрузитьНастройки(СтруктураДанных.НастройкиКомпоновщика);

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

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

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

	СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	ПриИзмененииВариантаНаличия();

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

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

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

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

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

&НаКлиенте
Функция РасширенныеНастройкиБудутПотеряны()
	
	БудутПотеряны = Ложь;
	Если ВариантНеобходимостиУстановкиЦены <> 3	Тогда 
		БудутПотеряны = Истина;	
	КонецЕсли;	
	
	Возврат БудутПотеряны;	
	
КонецФункции

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

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

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

&НаКлиенте
Процедура ЦенаОтПриИзменении(Элемент)
	НастроитьАвтоотметкуНезаполненного(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ЦенаДоПриИзменении(Элемент)
	НастроитьАвтоотметкуНезаполненного(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ВариантНавигацииПриИзменении(Элемент)
	
	ВариантНавигацииПриИзмененииНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ВидНоменклатурыПриИзменении(Элемент)
	
	ВидНоменклатурыПриИзмененииСервер();
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеЦены

&НаКлиенте
Процедура ДеревоВыбранныеЦеныСсылкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ДеревоВыбранныеЦеныСсылкаОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ДеревоОтборовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ПодборТоваровКлиент.ДеревоОтборовВыбор(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыКомпоновщикНастроекНастройкиОтбор

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоИерархииНоменклатуры

&НаКлиенте
Процедура ДеревоИерархииНоменклатурыВыбранПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ДеревоИерархииНоменклатуры.ТекущиеДанные;
	Если ТекущиеДанные.Выбран = 2 Тогда
		ТекущиеДанные.Выбран = Ложь;
	КонецЕсли;
	
	УстановкаЦенКлиентСервер.ОтметитьРекурсивноВниз(ТекущиеДанные);
	УстановкаЦенКлиентСервер.ОтметитьРекурсивноВверх(ТекущиеДанные);
	
КонецПроцедуры

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

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

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

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

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

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

&НаСервере
Процедура ЗагрузитьРезультатыКомпоновкиНастроекКолонок()
	
	СхемаОтбора = Обработки.ПрайсЛист.ПолучитьМакет("АктуальныеВидыЦен");

	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаОтбора));
	КомпоновщикНастроек.ЗагрузитьНастройки(КомпоновщикНастроекОтборКолонок.Настройки);

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

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	ЗаписатьРеквизитДопУпорядочивания(Результат);

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

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

&НаКлиенте
Процедура ВыбратьВсеДеревоВидыЦен(Команда)
	
	УстановитьЗначенияВыбораВсехЭлементовДерева(Истина);
	
КонецПроцедуры

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

	Для Каждого Строка Из ВыбранныеЦены Цикл
		Строка.Выбрана = Вкл;
		Строка.Редактировать = Вкл;
	КонецЦикла;
		
КонецПроцедуры

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

&НаКлиенте
Процедура ОтображатьТолькоВыбранные(Команда)
	
	ДеревоВыбранныеЦеныОтображатьТолькоВыбранные = НЕ ДеревоВыбранныеЦеныОтображатьТолькоВыбранные;
	ПерезаполнитьДеревоВыбранныеЦены();
	РазвернутьДеревоВыбранныеЦены();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОтобразитьВВидеСписка(Команда)
	
	ДеревоВыбранныеЦеныВыводитьГруппы = Ложь;
	ПерезаполнитьДеревоВыбранныеЦены();
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьВВидеДерева(Команда)
	
	ДеревоВыбранныеЦеныВыводитьГруппы = Истина;
	ПерезаполнитьДеревоВыбранныеЦены();
	РазвернутьДеревоВыбранныеЦены();
	
КонецПроцедуры


&НаКлиенте
Процедура ИсключитьВсеДеревоВидыЦен(Команда)
	
	УстановитьЗначенияВыбораВсехЭлементовДерева(Ложь);

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

&НаКлиенте
Процедура ДеревоВыбранныеЦеныВыбранаПриИзменении(Элемент)

	ТекущиеДанные = Элементы.ДеревоВыбранныеЦены.ТекущиеДанные;
	Если ТекущиеДанные.ЭтоГруппа ИЛИ НЕ ТекущиеДанные.Выбран Тогда
		ТекущиеДанные.Выбран = Ложь;
		ТекущиеДанные.Редактировать = Ложь;
	КонецЕсли;

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

	ОбновитьФлагиВыбранныхЦен(ТекущиеДанные);

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

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

	ОбновитьФлагиВыбранныхЦен(ТекущиеДанные);

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

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

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

&НаКлиенте
Процедура ВыбратьВсеЗависимые(Команда)
	
	ВыбратьВсеЗависимыеЦеныНаСервере();
	РазвернутьДеревоВыбранныеЦены();
	
КонецПроцедуры


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

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


&НаКлиенте
Процедура ВыбратьВсеВлияющие(Команда)
	
	ВыбратьВсеВлияющиеЦеныНаСервере();
	РазвернутьДеревоВыбранныеЦены();
	
КонецПроцедуры

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

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

// Параметры:
// 	Результат - УникальныйИдентификатор, Строка - 
// 	ДополнительныеПараметры - Структура :
//	* ТекущиеДанные - Структура - Текущие данные по видам цен
&НаКлиенте
Процедура РедактироватьНастройкиЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	ТекущиеДанные = ДополнительныеПараметры.ТекущиеДанные;//ТекущиеДанныеСписка
	
	
	АдресХранилищаНастройкиКомпоновщика = Результат;
	
	Если АдресХранилищаНастройкиКомпоновщика <> Неопределено Тогда
		
		СтруктураДанных = УстановкаЦенВызовСервера.УстановитьНастройкиКомпоновкиДанныхДляВидаЦены(
		ТекущиеДанные.Ссылка,
		АдресХранилищаНастройкиКомпоновщика,
		АдресХранилищаНастройкиКомпоновкиДанных,
		АдресХранилищаПараметровСхемКомпоновкиПоВидамЦен);
		ТекущиеДанные.Параметры = СтруктураДанных.ОписаниеПараметров;
		
	КонецЕсли;

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

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

&НаКлиенте
Процедура СброситьОтборыПоСвойствам(Команда)
	
	СброситьОтборыПоСвойствамНаСервере();
	
КонецПроцедуры

#Область Прочее

&НаКлиенте
Процедура СообщитьОНевозможностиВыбора()
	ОчиститьСообщения();
	ТекущиеДанные = Элементы.ВыбранныеЦены.ТекущиеДанные;
	ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Нет прав на установку цен по данному виду цены'"),, "ВыбранныеЦены[" + ВыбранныеЦены.Индекс(ТекущиеДанные) + "].Ссылка");
КонецПроцедуры

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтотОбъект, Команда);
	
КонецПроцедуры

&НаКлиенте
Процедура НайтиСтрокуДереваРекурсивно(ДеревоВидовЦен, ВидЦенПоиск, Идентификатор)

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

&НаКлиенте
Процедура ОбновитьНастройкиВидовЦен(Команда = Неопределено)

	Если Элементы.ДеревоВыбранныеЦены.ТекущиеДанные <> Неопределено Тогда
		ТекущийВидЦен = Элементы.ДеревоВыбранныеЦены.ТекущиеДанные.Ссылка;
	Иначе
		ТекущийВидЦен = Неопределено;
	КонецЕсли;

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

&НаКлиенте
Процедура ДеревоВыбранныеЦеныСортироватьСписокПоВозрастанию(Команда)

	СортироватьДеревоВыбранныеЦены("Наименование");

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

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

	СортироватьДеревоВыбранныеЦены("Наименование Убыв");

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

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

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

&НаКлиенте
Процедура ОбновитьФлагиВыбранныхЦен(ТекущиеДанные)
	
	Перем НайденныеСтроки;
	
	НайденныеСтроки =  ВыбранныеЦены.НайтиСтроки(Новый Структура("Ссылка", ТекущиеДанные.Ссылка));
	Если НайденныеСтроки.Количество() Тогда
		НайденныеСтроки[0].Выбрана = ТекущиеДанные.Выбран;
		НайденныеСтроки[0].Редактировать = ТекущиеДанные.Редактировать;
	КонецЕсли;
	
КонецПроцедуры

// Обновить флаги выбранных цен на сервере.
// 
// Параметры:
//  ТекущиеДанные - см. УстановкаЦенСервер.НайтиСтрокуВидаЦенВДереве
&НаСервере
Процедура ОбновитьФлагиВыбранныхЦенНаСервере(ТекущиеДанные)
	
	Перем НайденныеСтроки;
	
	НайденныеСтроки =  ВыбранныеЦены.НайтиСтроки(Новый Структура("Ссылка", ТекущиеДанные.Ссылка));
	Если НайденныеСтроки.Количество() Тогда
		НайденныеСтроки[0].Выбрана = ТекущиеДанные.Выбран;
		НайденныеСтроки[0].Редактировать = ТекущиеДанные.Редактировать;
	КонецЕсли;
	
КонецПроцедуры


&НаСервере
Процедура УстановитьУсловноеОформление()

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ГиперссылкаЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(WindowsШрифты.DefaultGUIFont, , , Ложь, Ложь, Истина, Ложь, ));

	//

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

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

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

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

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

&НаКлиенте
Процедура ДеревоВыбранныеЦеныПриАктивизацииСтроки(Элемент)
	СтрокаИнформации = ИнформацияТекущейСтроки();
КонецПроцедуры

&НаКлиенте
Процедура ДеревоВыбранныеЦеныВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры


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

	ФорматированнаяСтрокаВидЦен = Новый ФорматированнаяСтрока(СтрокаИнформация);
	
	Возврат ФорматированнаяСтрокаВидЦен;
	
КонецФункции

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

&НаСервере
Процедура ВидНоменклатурыПриИзмененииСервер()

	ПодборТоваровСервер.ЗаполнитьДеревоОтборовНоменклатуры(ЭтотОбъект);
	
КонецПроцедуры

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

&НаСервере
Процедура СброситьОтборыПоСвойствамНаСервере()
	
	ПодборТоваровСервер.СброситьОтборыПоСвойствам(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПреобразоватьРасширеннуюНастройкуВУпрощенную(Форма)

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

&НаКлиенте
Процедура ПреобразоватьУпрощеннуюНастройкуВРасширенную(Форма)

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

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

&НаКлиенте
Процедура ВидЦеныОтборПриИзменении(Элемент)
	НастроитьАвтоотметкуНезаполненного(ЭтотОбъект);
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ВариантНаличияПриИзменении(Элемент)

	Если ВариантНаличия = 3 Тогда
		СкладНаличия = ПредопределенноеЗначение("Справочник.Склады.ПустаяСсылка");	
	КонецЕсли;

	ПриИзмененииВариантаНаличия();

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

&НаКлиенте
Процедура ПриИзмененииВариантаНаличия()

	ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "СкладНаличия", "Доступность", ВариантНаличия <> 3);

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

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

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

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

&НаСервере
Процедура СортироватьДеревоВыбранныеЦены(СписокКолонок)

	ДеревоОбъект = РеквизитФормыВЗначение("ДеревоВыбранныеЦены", Тип("ДеревоЗначений"));
	ДеревоОбъект.Строки.Сортировать(СписокКолонок);
	ЗначениеВРеквизитФормы(ДеревоОбъект, "ДеревоВыбранныеЦены");

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

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

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