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

файл

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

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

	УстановитьУсловноеОформление();
	
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);

	//

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

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

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

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

	//

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

&НаСервере
Процедура ПеречитатьВидыЦенПоставщикаНаСервере()
	
	УстановкаЦенСервер.ПеречитатьВыбранныеЦены(ЭтаФорма);
	
КонецПроцедуры

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

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