Установка цен номенклатуры / Форма документа / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ

&НаКлиенте
Перем СтараяНоменклатура; // Используется в механизмах обработчиков событий табличной части Товары

&НаКлиенте
Перем СтараяХарактеристика; // Используется в механизмах обработчиков событий табличной части Товары

&НаКлиенте
Перем ИзмененаЦена; // Используется в механизмах обработчиков событий табличной части Товары

&НаКлиенте
Перем СтрокаДобавлена;

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

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

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

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

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

	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

	// ИнтеграцияС1СДокументооборотом
	ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПриСозданииНаСервере(ЭтотОбъект);
	// Конец ИнтеграцияС1СДокументооборотом

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

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

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

	ПроверитьВерсиюЦенообразования(Объект.Ссылка, Объект.Товары.Количество(), Объект.Товары2_5.Количество());

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

	// СтандартныеПодсистемы.УправлениеДоступом
	УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.УправлениеДоступом

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

	МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.Свойства
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

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

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

	МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ТекущийОбъект, ПараметрыЗаписи);

	// ИнтеграцияС1СДокументооборотом
	ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	// Конец ИнтеграцияС1СДокументооборотом
	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

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

	МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);

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

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

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

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

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

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

	МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтотОбъект, ПараметрыЗаписи);

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	Если ТекущаяСтраница = Элементы.ГруппаУстановкаЦен Тогда
		
		ПриПереходеКУстановкеЦен();
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ДеревоЦенПослеУдаления(Элемент)
	ДеревоЦенПослеУдаленияНаСервере();
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ДеревоЦенЦенаПриИзменении(Элемент)
	
	ИзмененаЦена = Истина;
	
	ДеревоЦенЦенаПриИзмененииКлиент(Элемент);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ДеревоЦенУпаковкаПриИзменении(Элемент)

	ДеревоЦенУпаковкаПриИзмененииКлиент(Элемент);

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

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

	ДеревоЦенВалютаПриИзмененииКлиент(Элемент);

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

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

	ОчиститьСообщения();

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

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

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


// Обработчик "НачалоВыбора" для поля "Формула"
// 
// Параметры:
// 	Элемент - ПолеФормы
// 	ДанныеВыбора - СписокЗначений
// 	СтандартнаяОбработка - Булево
//@skip-warning
&НаКлиенте
Процедура Подключаемый_ДеревоЦенФормулаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

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

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

&НаКлиенте
Процедура Подключаемый_ДеревоЦенФормулаПриИзменении(Элемент)
	
	ИзмененаЦена = Истина;
	
	ДеревоЦенЦенаПриИзмененииКлиент(Элемент);

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

	УстановитьВидимостьКолонокРедактирования(Истина);
	
КонецПроцедуры

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

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

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


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


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

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

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

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

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

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

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

&НаКлиенте
Процедура ИзменитьЦеныНовыйВариант(Команда)
	
	ИзменитьЦеныНаНаКлиентеПоТипуВызова();
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ДобавитьТоварыПоЦеновойГруппе(Команда)
	
	ВыбранноеЗначение = Неопределено;

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

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

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

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

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

&НаКлиенте
Процедура УдалитьТоварыБезИзмененныхЦен(Команда)
	
	УдалитьТоварыБезИзмененныхЦенНаСервере();
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ПерейтиКРедактированиюСпискаВидовЦен(Команда)
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.ГруппаВидыЦен;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПерейтиКУстановкеЦенЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПоискПоШтрихкодуЗавершение(ДанныхШтрихкода, ДополнительныеПараметры) Экспорт
	
	ОбработатьШтрихкоды(ДанныхШтрихкода);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СортироватьПоНаименованиюНоменклатуры(Команда)
	
	СортироватьНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура СортироватьПоНаименованиюНоменклатурыСУчетомИерархииВидов(Команда)
	СортироватьНаСервере("ПоНаименованиюНоменклатурыИерархияВидовНоменклатуры");
КонецПроцедуры

&НаКлиенте
Процедура СортироватьПоНаименованиюНоменклатурыСУчетомИерархииГрупп(Команда)
	СортироватьНаСервере("ПоНаименованиюНоменклатурыИерархияГрупп");
КонецПроцедуры

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

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

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

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

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

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

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

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

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

	УстановитьРассчитыватьАвтоматическиНаКлиенте(РассчитыватьАвтоматически);
	ЗафиксироватьКолонкуНоменклатуры(ЗафиксироватьКолонкуНоменклатуры);

	Если ИспользоватьОднуКолонкуДляКлючаЦен <> Результат.ИспользоватьОднуКолонкуДляКлючаЦен Тогда
		ИспользоватьОднуКолонкуДляКлючаЦен = Результат.ИспользоватьОднуКолонкуДляКлючаЦен;
		НастроитьКолонкиКлючаЦен();
	КонецЕсли;

	Если ОтображатьВлияющиеЦены <> Результат.ОтображатьВлияющиеЦены Тогда		
		ОтображатьВлияющиеЦены = Результат.ОтображатьВлияющиеЦены;
		ОтображатьВлияющиеЦеныНаКлиенте(ОтображатьВлияющиеЦены);	
	КонецЕсли;

	УстановитьВидимостьКолонокРедактирования(Истина);
	
КонецПроцедуры

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

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

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

КонецПроцедуры // ()

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

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

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

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

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

#Область ШтрихкодыИТорговоеОборудование

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

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

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

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

		Иначе
			НеизвестныеШтрихкоды.Добавить(Новый Структура("Штрихкод, Количество", Выборка.Штрихкод, 1));
		КонецЕсли;
		
	КонецЦикла;

	Если ИспользуетсяЦенообразование25 Тогда
		КэшДанных = УстановкаЦенСервер.ИнициализироватьСтруктуруКэшаДанных();
		
		ТаблицаНоменклатуры = УстановкаЦенСервер.СоздатьТаблицуНоменклатуры(ЭтотОбъект);
		

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

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

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

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

	ОбновитьСтарыеЦеныНоменклатурыНаСервере();

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

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

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

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

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

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

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

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

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

// Процедура - обработчик события "ПриИзменении" поля "ДеревоЦенХарактеристика".
//
&НаСервере
Процедура ДеревоЦенХарактеристикаПриИзмененииСервер(ИдентификаторСтроки, РассчитатьЦены = Истина)
	
	УстановкаЦенСервер.ДеревоЦенХарактеристикаПриИзменении(ЭтотОбъект, ИдентификаторСтроки, РассчитатьЦены);
	
Конецпроцедуры

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

	НастройкиОтбора.Вставить("ЗначенияОтбора", ЗначенияОтбора);
	НастройкиОтбора.Вставить("Дата", Объект.Дата);
	НастройкиОтбора.Вставить("ИспользуетсяЦенообразование25", ИспользуетсяЦенообразование25);
	НастройкиОтбора.Вставить("ИспользоватьХарактеристикиНоменклатуры", ИспользоватьХарактеристикиНоменклатуры);
	НастройкиОтбора.Вставить("ИспользоватьСерииНоменклатуры", ИспользоватьСерииНоменклатуры);
	НастройкиОтбора.Вставить("ИспользоватьУпаковкиНоменклатуры", ИспользоватьУпаковкиНоменклатуры);
	
	УстановкаЦенСервер.ПолучитьДанныеПоНоменклатуре(НастройкиОтбора, ТаблицаНоменклатуры);
	
	ТаблицаТовары = УстановкаЦенСервер.ДобавитьТовары(ЭтотОбъект, ТаблицаНоменклатуры, КэшДанных);	

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

// Устанавливает признак автоматического перерасчета цен
//
// Параметры:
// НовоеЗначение - Булево
//
&НаКлиенте
Процедура УстановитьРассчитыватьАвтоматическиНаКлиенте(НовоеЗначение)
	
	РассчитыватьАвтоматически = НовоеЗначение;
	
КонецПроцедуры

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

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

&НаСервере
Функция ДатаДляЗапросаЦенНоменклатуры()
	
	Возврат Объект.Дата - 1;
	
КонецФункции

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

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

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

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

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

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

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

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

			Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ВидНоменклатуры,", "");

			Запрос.Текст = Запрос.Текст +
			"УПОРЯДОЧИТЬ ПО
			|	ВременнаяТаблицаТовары.Номенклатура.Наименование,
			|	ВременнаяТаблицаТовары.ХарактеристикаЦО.Наименование,
			|	ВременнаяТаблицаТовары.СерияЦО.Наименование,
			|	ВременнаяТаблицаТовары.УпаковкаЦО.Наименование
			|ИТОГИ
			|	ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатурыДляЦенообразования.ПустаяСсылка) КАК ХарактеристикаЦО,
			|	ЗНАЧЕНИЕ(Справочник.СерииНоменклатурыДляЦенообразования.ПустаяСсылка) КАК СерияЦО,
			|	ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) КАК УпаковкаЦО,
			|	МИНИМУМ(Индекс)
			|ПО
			|	Номенклатура ИЕРАРХИЯ";
		Иначе

			Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ВидНоменклатуры,", "");

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

			Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ВидНоменклатуры,", "");

			Запрос.Текст = Запрос.Текст +
			"УПОРЯДОЧИТЬ ПО
			|	ВременнаяТаблицаТовары.Номенклатура.Наименование,
			|	ВременнаяТаблицаТовары.Характеристика.Наименование
			|ИТОГИ 
			|	ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
			|	МИНИМУМ(Индекс)
			|ПО
			|	Номенклатура ИЕРАРХИЯ";
		Иначе

			Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ВидНоменклатуры,", "");

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

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

	Возврат Количество

КонецФункции // ()

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

#Область КонтрольНесогласованныхИзменений

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область РаботаСБуферомОбмена

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

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

	Если ИспользуетсяЦенообразование25 Тогда

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

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

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

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

	Иначе
			
		Если ТаблицаТоваров.Колонки.Найти("Характеристика") = Неопределено Тогда
			ТаблицаТоваров.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
		КонецЕсли;
		
	КонецЕсли;

	Если ТаблицаТоваров.Колонки.Найти("Цена") = Неопределено Тогда
		ТаблицаТоваров.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
	КонецЕсли;

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

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

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

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

	Если СтрокаЦен.Свойство(ИмяКолонки) Тогда
		НоваяСтрока.Цена = СтрокаЦен[ИмяКолонки];
	КонецЕсли;
	
	Если ИспользоватьУпаковкиНоменклатуры Тогда
		
		ИмяКолонкиУпаковка = "Упаковка" + ИмяКолонки;
		Если СтрокаЦен.Свойство(ИмяКолонки) Тогда
			НоваяСтрока.Упаковка = СтрокаЦен[ИмяКолонкиУпаковка];
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

	Если ЗначениеЗаполнено(Объект.Ссылка)
		И Не Модифицированность Тогда

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

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

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

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

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

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

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

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

	//

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

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

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

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

	//

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

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

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

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

	//

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

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

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

	//

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

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

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

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

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

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтотОбъект, 
	                                                                         "ДеревоЦенХарактеристика",
	                                                                         "ДеревоЦен.ХарактеристикиИспользуются");

	//
	// не показывать измерения при выводе в случае когда используется 1 колонка для ключа цен
	// Для номенклатуры
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	// Для характеристики
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);	
	
	// Для Серии
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);

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

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

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Gray);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'ограничение доступа'"));

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

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

&НаКлиенте
Процедура ДеревоЦенЦенаПриИзмененииКлиент(Элемент)
	
	ТекущиеДанные = Элементы.ДеревоЦен.ТекущиеДанные;
	
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИмяКолонкиУпаковка = СтрЗаменить(Элемент.Имя, "ДеревоЦен" + "ВидЦены", "Упаковка" + "ВидЦены");
	ИмяКолонкиЗапретаРедактирования = СтрЗаменить(Элемент.Имя, "ДеревоЦен" + "ВидЦены", "ЗапретРедактирования" + "ВидЦены");
	
	ИзмененПроцент = Ложь;
	ИзмененаСумма = Ложь;
	ПроцентИзменения = 0;
	СуммаИзменения = 0;
	ИмяТекущейКолонки  = СтрЗаменить(Элемент.Имя, "ДеревоЦен", "");
	
	Если СтрНайти(ИмяТекущейКолонки, "ПроцентИзменения" + "ВидЦены") Тогда
		ИмяТекущейКолонки = СтрЗаменить(ИмяТекущейКолонки, "ПроцентИзменения" + "ВидЦены", "ВидЦены");
		ТекущиеДанные[ИмяТекущейКолонки] = Окр(
			ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки] * ((ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки] / 100) + 1),
			15,
			2);
		ТекущиеДанные["СуммаИзменения"+ИмяТекущейКолонки] = ТекущиеДанные[ИмяТекущейКолонки] - ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки];
		ИзмененПроцент = Истина;
		ПроцентИзменения = ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки];
		ИмяКолонкиУпаковка = СтрЗаменить(СтрЗаменить(Элемент.Имя, "ПроцентИзменения" + "ВидЦены", "ВидЦены"), 
										"ДеревоЦен" + "ВидЦены", 
										"Упаковка" + "ВидЦены");
		ИмяКолонкиЗапретаРедактирования = СтрЗаменить(СтрЗаменить(Элемент.Имя, "ПроцентИзменения" + "ВидЦены", "ВидЦены"), 
										"ДеревоЦен" + "ВидЦены", 
										"ЗапретРедактирования" + "ВидЦены");
	КонецЕсли;
	Если СтрНайти(ИмяТекущейКолонки, "СуммаИзменения" + "ВидЦены") Тогда
		ИмяТекущейКолонки = СтрЗаменить(ИмяТекущейКолонки, "СуммаИзменения" + "ВидЦены", "ВидЦены");
		ТекущиеДанные[ИмяТекущейКолонки] = ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки] + ТекущиеДанные["СуммаИзменения" + ИмяТекущейКолонки];
		Если ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки] <> 0 Тогда
			ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки] = ТекущиеДанные[ИмяТекущейКолонки] / ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки] * 100;
		Иначе
			ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки] = 0;
		КонецЕсли;
		ИзмененаСумма = Истина;
		СуммаИзменения = ТекущиеДанные["СуммаИзменения"+ИмяТекущейКолонки];
		ИмяКолонкиУпаковка = СтрЗаменить(СтрЗаменить(Элемент.Имя, "СуммаИзменения" + "ВидЦены", "ВидЦены"), 
										"ДеревоЦен" + "ВидЦены", 
										"Упаковка" + "ВидЦены");
		ИмяКолонкиЗапретаРедактирования = СтрЗаменить(СтрЗаменить(Элемент.Имя, "СуммаИзменения" + "ВидЦены", "ВидЦены"), 
										"ДеревоЦен" + "ВидЦены", 
										"ЗапретРедактирования" + "ВидЦены");
	КонецЕсли;
	Если СтрНайти(ИмяТекущейКолонки, "Формула" + "ВидЦены") Тогда
		ИмяТекущейКолонки = СтрЗаменить(ИмяТекущейКолонки, "Формула" + "ВидЦены", "ВидЦены");
		
		ТекущиеДанные["СуммаИзменения"+ИмяТекущейКолонки] = ТекущиеДанные[ИмяТекущейКолонки] - ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки];		
		Если ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки] <> 0 Тогда
			ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки] = ТекущиеДанные[ИмяТекущейКолонки] / ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки] * 100;
		Иначе
			ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки] = 0;
		КонецЕсли;
		НоваяФормула = ТекущиеДанные["Формула"+ИмяТекущейКолонки];
		ИмяКолонкиУпаковка = СтрЗаменить(СтрЗаменить(Элемент.Имя, "Формула" + "ВидЦены", "ВидЦены"), 
										"ДеревоЦен" + "ВидЦены",
										"Упаковка" + "ВидЦены");
		ИмяКолонкиЗапретаРедактирования = СтрЗаменить(СтрЗаменить(Элемент.Имя, "Формула" + "ВидЦены", "ВидЦены"), 
										"ДеревоЦен" + "ВидЦены", 
										"ЗапретРедактирования" + "ВидЦены");
	КонецЕсли;
	
	Если ТекущиеДанные[ИмяКолонкиЗапретаРедактирования] Тогда
		Возврат;
	КонецЕсли;
	
	ТекущаяСтрока = ДеревоЦен.НайтиПоИдентификатору(ТекущиеДанные.ПолучитьИдентификатор());
	
	ТекущиеДанные["ИзмененаВручную"       + ИмяТекущейКолонки] = 
							(ТекущиеДанные[ИмяТекущейКолонки] - ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки] <> 0);
	ТекущиеДанные["ИзмененаАвтоматически" + ИмяТекущейКолонки] = Ложь;
	
	ТекущиеДанные["СуммаИзменения"+ИмяТекущейКолонки] = ТекущиеДанные[ИмяТекущейКолонки] 
															- ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки];
	Если ТекущиеДанные["СтараяЦена"+ИмяТекущейКолонки] <> 0 Тогда
		ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки] = Окр(
			100 * (ТекущиеДанные[ИмяТекущейКолонки] - ТекущиеДанные["СтараяЦена"+ИмяТекущейКолонки]) 
			/ ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки], 5, 2);
	Иначе
		ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки] = 0;
	КонецЕсли;
	
	МассивСтруктурУпаковокНоменклатуры = Новый Массив;
	СоответствиеКоэффициентовУпаковокНоменклатуры = Неопределено;
	Если ИспользоватьУпаковкиНоменклатуры Тогда
		
		ТекущееЗначениеУпаковки = ТекущиеДанные[ИмяКолонкиУпаковка];
		Если ЗначениеЗаполнено(ТекущееЗначениеУпаковки) Тогда
			Структура = УстановкаЦенКлиентСервер.ИнициализироватьОписаниеУпаковкиНоменклатуры();
			Структура.Номенклатура = ТекущиеДанные.Номенклатура;
			Структура.Упаковка = ТекущееЗначениеУпаковки;
			МассивСтруктурУпаковокНоменклатуры.Добавить(Структура);
		КонецЕсли;
		
		ПараметрыВызова = УстановкаЦенКлиент.ПараметрыИзмененияВЭлементеДереваЦен("ЗаполнитьУпаковкиНоменклатуры");
		ПараметрыВызова.ИмяКолонкиУпаковка 					= ИмяКолонкиУпаковка;
		ПараметрыВызова.ИмяКолонкиЗапретаРедактирования		= ИмяКолонкиЗапретаРедактирования;
		ПараметрыВызова.МассивСтруктурУпаковокНоменклатуры 	= МассивСтруктурУпаковокНоменклатуры;
		
		УстановкаЦенКлиент.ПрименитьИзмененияВДеревеЦен(ТекущаяСтрока, ПараметрыВызова);
		
		Если МассивСтруктурУпаковокНоменклатуры.Количество() > 0 Тогда
			СоответствиеКоэффициентовУпаковокНоменклатуры = КоэффициентыУпаковокНоменклатуры(МассивСтруктурУпаковокНоменклатуры);
		КонецЕсли;
		
	КонецЕсли;
	
	// Определим коэффициент упаковки текущей цены
	КоэффициентУпаковкиЦеныИсточника = 1;
	Если ИспользоватьУпаковкиНоменклатуры Тогда
		Если ЗначениеЗаполнено(ТекущееЗначениеУпаковки) И СоответствиеКоэффициентовУпаковокНоменклатуры <> Неопределено Тогда
			РезультатПоиска = УстановкаЦенКлиентСервер.ПолучитьКоэффициентУпаковкиНоменклатуры(СоответствиеКоэффициентовУпаковокНоменклатуры, 
																								ТекущиеДанные.Номенклатура, 
																								ТекущееЗначениеУпаковки);
			Если РезультатПоиска <> Неопределено Тогда
				КоэффициентУпаковкиЦеныИсточника = РезультатПоиска;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ТекущееЗначение = ТекущиеДанные[ИмяТекущейКолонки];
	
	ПараметрыВызова = УстановкаЦенКлиент.ПараметрыИзмененияВЭлементеДереваЦен("ИзменитьДанныеВСтрокеДереваЦен");
	ПараметрыВызова.ИмяКолонкиУпаковка 								= ИмяКолонкиУпаковка;
	ПараметрыВызова.ИмяКолонкиЗапретаРедактирования 				= ИмяКолонкиЗапретаРедактирования;
	ПараметрыВызова.СоответствиеКоэффициентовУпаковокНоменклатуры	= СоответствиеКоэффициентовУпаковокНоменклатуры;
	ПараметрыВызова.ТекущееЗначениеУпаковки							= ТекущееЗначениеУпаковки;
	ПараметрыВызова.ТекущееЗначение 								= ТекущееЗначение;
	ПараметрыВызова.КоэффициентУпаковкиЦеныИсточника				= КоэффициентУпаковкиЦеныИсточника;
	ПараметрыВызова.ИмяТекущейКолонки								= ИмяТекущейКолонки;
	ПараметрыВызова.НоваяФормула									= НоваяФормула;
	ПараметрыВызова.ПроцентИзменения								= ПроцентИзменения;
	ПараметрыВызова.СуммаИзменения									= СуммаИзменения;
	ПараметрыВызова.ИзмененПроцент									= ИзмененПроцент;
	ПараметрыВызова.ИзмененаСумма									= ИзмененаСумма;
	ПараметрыВызова.ИзмененаФормула									= Ложь;
	ПараметрыВызова.Номенклатура									= ТекущиеДанные.Номенклатура;
	ПараметрыВызова.ИспользоватьУпаковкиНоменклатуры				= ИспользоватьУпаковкиНоменклатуры;
	
	УстановкаЦенКлиент.ПрименитьИзмененияВДеревеЦен(ТекущаяСтрока, ПараметрыВызова);

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

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

&НаСервереБезКонтекста
Функция КоэффициентыУпаковокНоменклатуры(МассивСтруктурУпаковокНоменклатуры)
	
	Возврат УстановкаЦенСервер.СоответствиеКоэффициентовКоллекцииУпаковокНоменклатуры(МассивСтруктурУпаковокНоменклатуры);
		
КонецФункции

&НаСервере
Процедура ИзменитьЦеныНаПроцентНаСервере(ПараметрыРасчета)
	УстановкаЦенСервер.ИзменитьЦеныНаПроцент(ЭтотОбъект, ПараметрыРасчета);
КонецПроцедуры

&НаСервере
Процедура ДобавитьТоварыПоОтборуНаСервере(АдресВоВременномХранилище)
	
	УстановкаЦенСервер.ДобавитьТоварыПоОтбору(ЭтотОбъект, АдресВоВременномХранилище); 
	
КонецПроцедуры

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

&НаСервере
Процедура РассчитатьЦеныПоИдентификаторуСтрокиНаСервере(ИдентификаторСтроки, ИзмененноеПоле)
	Если ИспользуетсяЦенообразование25 Тогда
		УстановкаЦенСервер.РассчитатьЦеныПоИдентификаторуСтроки2_5(ЭтотОбъект, ИдентификаторСтроки,,ИзмененноеПоле);
	Иначе	
		УстановкаЦенСервер.РассчитатьЦеныПоИдентификаторуСтроки(ЭтотОбъект, ИдентификаторСтроки,,ИзмененноеПоле);
	КонецЕсли;	
КонецПроцедуры

&НаСервере
Функция ЗагрузитьИзExcelНаСервере(Параметр)
	
	Возврат УстановкаЦенСервер.ЗагрузитьИзExcel(ЭтотОбъект, Параметр.ВидыЦен, Параметр.Товары);
	
КонецФункции

&НаСервере
Процедура ИзменитьЦеныНаСервере(ПараметрыРасчета)
	УстановкаЦенСервер.ИзменитьЦены(ЭтотОбъект, ПараметрыРасчета);
КонецПроцедуры

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

			ПозицияПодстроки = СтрНайти(ТекЭлемент.Имя, "ВидЦены");
			ИмяКолонки = Прав(ТекЭлемент.Имя, СтрДлина(ТекЭлемент.Имя)
				- ПозицияПодстроки + 1);

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

			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	Элементы.ДеревоЦенХарактеристика.Видимость 	= Не ИспользуетсяЦенообразование25;

	Элементы.ДеревоЦенХарактеристикаЦО.Видимость 	= ИспользуетсяЦенообразование25;
	Элементы.ДеревоЦенСерияЦО.Видимость 			= ИспользуетсяЦенообразование25;
	Элементы.ДеревоЦенУпаковкаЦО.Видимость 		= ИспользуетсяЦенообразование25;
	
КонецПроцедуры

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

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

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

// СтандартныеПодсистемы.Свойства 
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

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

&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

&НаСервере
Процедура НастроитьКолонкиКлючаЦен()

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

&НаСервереБезКонтекста
Процедура ПроверитьВерсиюЦенообразования(Ссылка, КоличествоТовары, КоличествоТовары25)

	Если Не ЗначениеЗаполнено(Ссылка) Тогда
		Возврат;
	КонецЕсли;

	ИспользуетсяЦенообразование25Документ = Неопределено;
	Если КоличествоТовары = 0 И КоличествоТовары25 <> 0 Тогда
		ИспользуетсяЦенообразование25Документ = Истина;
	ИначеЕсли КоличествоТовары <> 0 И КоличествоТовары25 = 0 Тогда 
		ИспользуетсяЦенообразование25Документ = Ложь;
	КонецЕсли;
	Если ИспользуетсяЦенообразование25Документ <> Неопределено Тогда
		ИспользуетсяЦенообразование25ИБ = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25(ТекущаяДатаСеанса());
		Если ИспользуетсяЦенообразование25ИБ <> ИспользуетсяЦенообразование25Документ Тогда
			ТекстСообщения = НСтр("ru = 'Версия ценообразования документа отличается от версии ценообразования, используемой в информационной базе.
			|Не рекомендуется изменять этот документ, выполнять копирование/вставку строк и иные виды взаимодействия с другими документами.'");
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Ссылка);
		КонецЕсли;
	КонецЕсли;

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

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

&НаСервере
Функция ПоместитьВлияющиеВидыЦенВХранилище(ВлияющиеЦены)
//	 внимание выгружать только выбранные а не все цены
	Дерево = РаботаСФормулами.ПолучитьПустоеДеревоОперандов();

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

&НаКлиенте
Функция ПолучитьФормулуВидаЦен(ИмяЭлемента, ВидЦены = Неопределено)

	ФормулаВидаЦен = "";	
	ТекущиеДанные = Элементы.ДеревоЦен.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат "";
	КонецЕсли;

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

			ИначеЕсли ВидЦены.СпособЗаданияЦены = ПредопределенноеЗначение("Перечисление.СпособыЗаданияЦен.НаценкаНаЦенуПоступления")
			 	Или ВидЦены.СпособЗаданияЦены = ПредопределенноеЗначение("Перечисление.СпособыЗаданияЦен.НаценкаНаЦенуВводаОстатков") 
			 	Или ВидЦены.СпособЗаданияЦены = ПредопределенноеЗначение("Перечисление.СпособыЗаданияЦен.ЗаполнятьПоДаннымИБПоКонкурентам") 
			 	Или ВидЦены.СпособЗаданияЦены = ПредопределенноеЗначение("Перечисление.СпособыЗаданияЦен.ЗаполнятьПоДаннымИБПоПоставщикам") 
			 	Или ВидЦены.СпособЗаданияЦены = ПредопределенноеЗначение("Перечисление.СпособыЗаданияЦен.ЗаполнятьПоДаннымИБПоСебестоимости") Тогда
				
				ФормулаВидаЦен = "[" + ВидЦены.Ссылка + "]*" + Формат(((ВидЦены.Наценка/100)+1),"ЧРД=.; ЧГ=0");
				ЦеновыеГруппыАлгоритмов = ВидЦены.ЦеновыеГруппы.НайтиСтроки(СтруктураЦеноваяГруппа);
								
				Если ЦеновыеГруппыАлгоритмов.Количество() > 0 Тогда
					
					ФормулаВидаЦен = "[" + ВидЦены.Ссылка + "]*" + Формат(((ЦеновыеГруппыАлгоритмов[0].Наценка/100)+1),"ЧРД=.; ЧГ=0");
					
				КонецЕсли;		

			КонецЕсли;
		КонецЕсли;
		
	КонецЕсли;	
	
	Возврат ФормулаВидаЦен;
КонецФункции

&НаКлиенте
Функция ПолучитьВидЦеныПоИмениКолонки(ИмяЭлемента)

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

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

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

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

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

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

&НаКлиенте
Процедура ИзменитьЦеныНовыйВариантНаКлиентеЗавершение(Результат, ДополнительныеПараметры = Неопределено) Экспорт
	
	Если Результат <> Неопределено Тогда
	
		Если Результат.ВариантИзмененияЦены = 1 Тогда
			ИзменитьЦеныНаПроцентНаКлиентеЗавершение(Результат, ДополнительныеПараметры);
		ИначеЕсли Результат.ВариантИзмененияЦены = 2 ИЛИ Результат.ВариантИзмененияЦены = 3 Тогда
			ИзменитьЦеныНаКлиентеЗавершение(Результат, ДополнительныеПараметры) ;
		ИначеЕсли Результат.ВариантИзмененияЦены = 4 Тогда
			ОкруглитьРучныеЦеныЗавершение(Результат, ДополнительныеПараметры);
		ИначеЕсли Результат.ВариантИзмененияЦены = 5 Тогда
			РассчитатьЦеныНаКлиентеЗавершение(Результат, ДополнительныеПараметры);
		КонецЕсли;
 	
 	КонецЕсли;
 	
КонецПроцедуры

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

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

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

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

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

	Возврат ТаблицаВалютПоВидамЦен; 
	
КонецФункции

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

СтрокаДобавлена = Ложь;

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