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

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

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

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

&НаКлиенте
Перем ОтображаетсяВопрос;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ДеревоЦенПриАктивизацииЯчейки(Элемент)

	ОбновитьИнформационнуюСтроку();
	
КонецПроцедуры

&НаКлиенте
Процедура ДеревоЦенПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	ОбновитьИнформационнуюСтроку();
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервереБезКонтекста	
Функция ПолучитьИнформационнуюСтрокуИстории(Параметры)
	
	СтрокаЦенаНаДату = НСтр("ru = 'Цена на %1'") + " ";
	СтрокаЦенаНаДату = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаЦенаНаДату, Формат(Параметры.Период,"ДЛФ=D;"));
	СтрокаЗначениеЦены =  СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = ' %2 %3'"),,Формат(Параметры.Цена,"ЧДЦ=2"), Параметры.Валюта); 
	ФорматированнаяСтрокаПиктограммаТренда = Новый ФорматированнаяСтрока(" ");
	ФорматированнаяСтрокаОтступ = Новый ФорматированнаяСтрока(" ");
	Если Параметры.ЦенаИзменена Тогда
		Если Параметры.ЭтоВебКлиент Тогда
			ФорматированнаяСтрокаНачалоСтроки = Новый ФорматированнаяСтрока(Новый ФорматированнаяСтрока("", " V ",""),Новый Шрифт(,,Истина),,);
		Иначе	
			ФорматированнаяСтрокаНачалоСтроки = Новый ФорматированнаяСтрока("",БиблиотекаКартинок.Изменить, "");
		КонецЕсли;
	ИначеЕсли Параметры.Период > ТекущаяДата() Тогда
		Если Параметры.ЭтоВебКлиент Тогда
			ФорматированнаяСтрокаНачалоСтроки = Новый ФорматированнаяСтрока(Новый ФорматированнаяСтрока("", " ! ",""),,WebЦвета.Красный);
		Иначе	
			ФорматированнаяСтрокаНачалоСтроки = Новый ФорматированнаяСтрока("", БиблиотекаКартинок.Внимание16, "");
		КонецЕсли;
	Иначе
		ФорматированнаяСтрокаНачалоСтроки = Новый ФорматированнаяСтрока("    ");
	КонецЕсли;
	
	СтрокаЗначениеЦены = Новый ФорматированнаяСтрока(СтрокаЗначениеЦены,Новый Шрифт(,,Истина));
	
	ФорматированнаяСтрокаЦенаНаДату = Новый ФорматированнаяСтрока(СтрокаЦенаНаДату,ФорматированнаяСтрокаОтступ,СтрокаЗначениеЦены); 
	
	Если Параметры.Свойство("ПредыдущаяЦена") 
		И Параметры.ПредыдущаяЦена <> 0  
		И Параметры.ПредыдущаяЦена <> Параметры.Цена Тогда
			ИзменениеЦены = Параметры.Цена - Параметры.ПредыдущаяЦена;
			ПроцентИзменения = Параметры.Цена/(Параметры.ПредыдущаяЦена/100)-100; 
			СтрокаИзменениеЦены = Новый ФорматированнаяСтрока("",Формат(ИзменениеЦены,"ЧДЦ=2"));
			ПредыдущаяВалюта = Параметры.ПредыдущаяВалюта;//СправочникСсылка.Валюты
			СтрокаВалютыИзмененияЦены = Новый ФорматированнаяСтрока(" ", ПредыдущаяВалюта["Наименование"], " ");
			СтрокаИзмененияПроцента = Новый ФорматированнаяСтрока(" (",Формат(ПроцентИзменения,"ЧДЦ=2"),"%) ");	
		Если ИзменениеЦены > 0 Тогда
			#Если НЕ ВебКлиент Тогда
				ФорматированнаяСтрокаПиктограммаТренда = Новый ФорматированнаяСтрока("", БиблиотекаКартинок.ПиктограммаТрендаРостВДиапазоне,"");
			#КонецЕсли				
		ИначеЕсли  ИзменениеЦены < 0 Тогда 
			#Если НЕ ВебКлиент Тогда
				ФорматированнаяСтрокаПиктограммаТренда = Новый ФорматированнаяСтрока("", БиблиотекаКартинок.ПиктограммаТрендаПадениеУлучшается,"");
			#КонецЕсли	
		Иначе
			 ФорматированнаяСтрокаПиктограммаТренда = Новый ФорматированнаяСтрока("");
		КонецЕсли;
		
		ФорматированнаяСтрокаИзменение = Новый ФорматированнаяСтрока(СтрокаИзменениеЦены,СтрокаВалютыИзмененияЦены, СтрокаИзмененияПроцента);
	Иначе 
		ФорматированнаяСтрокаИзменение = Новый ФорматированнаяСтрока("  ");
	КонецЕсли;		
	
	Если Параметры.Свойство("МаркетинговоеМероприятие") И ЗначениеЗаполнено(Параметры.МаркетинговоеМероприятие) Тогда
		ФорматированнаяСтрокаМаркетинговоеМероприятие = Новый ФорматированнаяСтрока("по акции",Новый Шрифт(,,Истина),WebЦвета.Коралловый,,ПолучитьНавигационнуюСсылку(Параметры.МаркетинговоеМероприятие));
	Иначе
		ФорматированнаяСтрокаМаркетинговоеМероприятие = " ";
	КонецЕсли;		
	
	ФорматированнаяСтрокаИстории = Новый ФорматированнаяСтрока(
						ФорматированнаяСтрокаОтступ,
						ФорматированнаяСтрокаЦенаНаДату);
						
	ФорматированнаяСтрокаДинамики = Новый ФорматированнаяСтрока(
						ФорматированнаяСтрокаИзменение);
												
	ФорматированнаяСтрокаДинамики = Новый ФорматированнаяСтрока(ФорматированнаяСтрокаДинамики,Новый Шрифт(,,Истина),,);
	ФорматированнаяСтрокаИстории = Новый ФорматированнаяСтрока(ФорматированнаяСтрокаИстории,Новый Шрифт(,,Истина),,);

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

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

&НаКлиенте
Функция ПолучитьИнформационнуюСтрокуДляВидаЦен(Элементы, ВидЦены, МассивВалют, ИмяТекущейКолонки) Экспорт
		
	ФорматированнаяСтрокаВидЦен = "";
	ФорматированнаяСтрокаПредупреждениеНесколькоВалют = "";
	ТекущиеДанные = Элементы.ДеревоЦен.ТекущиеДанные;
	ГруппаЦен = Элементы.Найти("ДеревоЦен" + "ГруппаЦены" + ИмяТекущейКолонки);
	
	Если ГруппаЦен <> Неопределено Тогда
		Если ТекущиеДанные.свойство("Валюта" + ИмяТекущейКолонки) Тогда
			НаименованиеВалюты = Новый ФорматированнаяСтрока( " " + Строка(ТекущиеДанные["Валюта" + ИмяТекущейКолонки]),Новый Шрифт(,,Истина));
		Иначе	
			НаименованиеВалюты = Новый ФорматированнаяСтрока(Прав(ГруппаЦен.Заголовок, 4),Новый Шрифт(,,Истина));
		КонецЕсли;
		НаименованиеВидаЦен = Лев(ГруппаЦен.Заголовок, СтрДлина(ГруппаЦен.Заголовок) - 5);
	КонецЕсли;
	
	ФорматированнаяСтрокаВидЦен = Новый ФорматированнаяСтрока(НаименованиеВидаЦен, Новый Шрифт(,,Истина),,,ПолучитьНавигационнуюСсылку(ВидЦены));
	
	#Если ВебКлиент Тогда
		ФорматированнаяСтрокаВидЦен = Новый ФорматированнаяСтрока("  ", ФорматированнаяСтрокаВидЦен);
	#Иначе
		ФорматированнаяСтрокаВидЦен = Новый ФорматированнаяСтрока("  ", ГруппаЦен.КартинкаШапки, " ", ФорматированнаяСтрокаВидЦен);
	#КонецЕсли
	
	Если МассивВалют.Количество()>1 Тогда
		
		СтрокаВалют = СформироватьСтрокуВалютИзМассива(МассивВалют);
		ФорматированнаяСтрокаВалют = Новый ФорматированнаяСтрока(СтрокаВалют, Новый Шрифт(,,Истина),WebЦвета.Красный,,"СсылкаРазныеВалюты");
		
		#Если ВебКлиент Тогда
			ФорматированнаяСтрокаПредупреждениеНесколькоВалют = Новый ФорматированнаяСтрока("   ", СтрокаВалют);
		#Иначе
			ФорматированнаяСтрокаПредупреждениеНесколькоВалют = Новый ФорматированнаяСтрока("   ",БиблиотекаКартинок.Внимание16, " ", ФорматированнаяСтрокаВалют);
		#КонецЕсли	
		
	КонецЕсли;
	
	ФорматированнаяИнформационнаяСтрокаПоВидуЦен = Новый ФорматированнаяСтрока(ФорматированнаяСтрокаВидЦен, ФорматированнаяСтрокаПредупреждениеНесколькоВалют);
	
	Возврат ФорматированнаяИнформационнаяСтрокаПоВидуЦен;
	
КонецФункции

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

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

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

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

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

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

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

&НаСервере
Функция ПолучитьМассивИспользуемыхВалют(ИмяКолонкиВалюты, ТолькоВыделенныеСтроки = Ложь)

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

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

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

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

// Дерево цен валюта при изменении клиент.
// 
// Параметры:
//  Элемент - ЭлементыФормы
&НаКлиенте
Процедура ДеревоЦенВалютаПриИзмененииКлиент(Элемент)

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

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

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

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

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

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

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

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

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

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

	Если Не ИспользоватьРежимРедактирования Тогда
		УстановитьВидимостьКолонокРедактирования(ЭтотОбъект, Истина);
	КонецЕсли;
	
КонецПроцедуры


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

&НаКлиенте
Функция ЗапуститьАсинхронно(Знач ПараметрыРасчета)
	
	Возврат НЕ (ПараметрыРасчета.ТолькоВыделенныеСтроки ИЛИ (ДеревоЦен.ПолучитьЭлементы().Количество() < 30));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		#Если ВебКлиент Тогда

			УстановкаЦенКлиент.ЗагрузитьИзExcelБезСсылкиВЕБ(ЭтотОбъект);
			
		#Иначе	

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

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

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

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

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

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

&НаКлиенте
Процедура ОтменитьИзменениеЦен(Команда)
	
	ПозицияПодстроки = СтрНайти(Элементы.ДеревоЦен.ТекущийЭлемент.Имя, "ВидЦены");	
	Если ПозицияПодстроки <> 0 Тогда
		ИмяТекущейКолонки = Прав(Элементы.ДеревоЦен.ТекущийЭлемент.Имя, СтрДлина(Элементы.ДеревоЦен.ТекущийЭлемент.Имя) - ПозицияПодстроки + 1);			
	КонецЕсли;
	
	ОтменитьИзменениеЦенНаСервере();
	ОткрытьОкноОжиданияПрименитьНастройкиВФоне();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	//

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

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

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

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

	//

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

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

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

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

	//

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура СохранитьНастройкиФормыНаСервере()
	
	СтруктураДанных = УстановкаЦенКлиентСервер.НоваяСтруктураНастроекФормы();

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

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

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

&НаКлиенте
Процедура Применить(Команда)

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

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

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

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

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

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

		ВыбранныеЦены.Сортировать("РеквизитДопУпорядочивания");

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьКолонокРедактирования(Форма, ИспользоватьРежимРедактирования)

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

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

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

			КонецЦикла;
		КонецЕсли;
	КонецЦикла;

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

	Если ИспользоватьРежимРедактирования Тогда
		Форма.Элементы.СтраницыКоманднойПанели.ТекущаяСтраница = Форма.Элементы.СтраницыКоманднойПанели.ПодчиненныеЭлементы.СтраницаРедактирование;
		Форма.Элементы.ЗакончитьИзменениеЦен.КнопкаПоУмолчанию = Истина;
	Иначе
		Форма.Элементы.СтраницыКоманднойПанели.ТекущаяСтраница = Форма.Элементы.СтраницыКоманднойПанели.ПодчиненныеЭлементы.СтраницаПросмотр;
		Форма.Элементы.Сформировать.КнопкаПоУмолчанию = Истина;
		Форма.Модифицированность = Ложь;
	КонецЕсли;

	Форма.ИспользоватьРежимРедактирования = ИспользоватьРежимРедактирования;

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

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

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

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

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

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

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

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

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

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

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

	СтруктураРезультат = Новый Структура;
	СтруктураРезультат.Вставить("Товары", ТаблицаТовары);
	СтруктураРезультат.Вставить("СтруктураДействий", СтруктураДействий);
	
	Возврат ПоместитьВоВременноеХранилище(СтруктураРезультат);
	
КонецФункции

&НаСервере
Функция ДанныеДляПечатиЭтикеток()

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

	СтруктураРезультат = Новый Структура;
	СтруктураРезультат.Вставить("Товары", ТаблицаТовары);
	СтруктураРезультат.Вставить("СтруктураДействий", СтруктураДействий);
	
	Возврат ПоместитьВоВременноеХранилище(СтруктураРезультат);
	
КонецФункции

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

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

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

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

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

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

	ОчиститьИнформациюИстории();

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

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

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

			ФорматированнаяСтрокаИстории = СтрокиИстории.ФорматированнаяСтрокаИстории;
			ФорматированнаяСтрокаДинамики = СтрокиИстории.ФорматированнаяСтрокаДинамики;
			ФорматированнаяСтрокаПиктограммаТренда = СтрокиИстории.ФорматированнаяСтрокаПиктограммаТренда;
			ФорматированнаяСтрокаНачалоСтроки = СтрокиИстории.ФорматированнаяСтрокаНачалоСтроки;
			ФорматированнаяСтрокаПоАкции = СтрокиИстории.ФорматированнаяСтрокаПоАкции;
			
			Если Инд<>ИсторияЦены.Количество()-1 Тогда
				ФорматированнаяСтрокаИстории = Новый ФорматированнаяСтрока(ФорматированнаяСтрокаИстории,Новый ФорматированнаяСтрока("
				|
				|"));
				ФорматированнаяСтрокаДинамики = Новый ФорматированнаяСтрока(ФорматированнаяСтрокаДинамики,Новый ФорматированнаяСтрока("
				|
				|"));
				ФорматированнаяСтрокаПиктограммаТренда = Новый ФорматированнаяСтрока(ФорматированнаяСтрокаПиктограммаТренда,Новый ФорматированнаяСтрока("
				|
				|"));
				ФорматированнаяСтрокаНачалоСтроки = Новый ФорматированнаяСтрока(ФорматированнаяСтрокаНачалоСтроки,Новый ФорматированнаяСтрока("
				|
				|"));
				ФорматированнаяСтрокаПоАкции = Новый ФорматированнаяСтрока(ФорматированнаяСтрокаПоАкции,Новый ФорматированнаяСтрока("
				|
				|"));
				
			КонецЕсли;
			
			МассивФорматированныхСтрок.Добавить(ФорматированнаяСтрокаИстории);
			МассивФорматированныхСтрокДинамики.Добавить(ФорматированнаяСтрокаДинамики);
			МассивФорматированныхСтрокПиктограммТренда.Добавить(ФорматированнаяСтрокаПиктограммаТренда);
			МассивФорматированныхСтрокНачалаСтроки.Добавить(ФорматированнаяСтрокаНачалоСтроки);
			МассивФорматированныхСтрокПоАкции.Добавить(ФорматированнаяСтрокаПоАкции);
		КонецЕсли;
	КонецЦикла;
	
	СтруктураМассивовСтрок = Новый Структура();
	СтруктураМассивовСтрок.Вставить("МассивФорматированныхСтрок", МассивФорматированныхСтрок);
	СтруктураМассивовСтрок.Вставить("МассивФорматированныхСтрокДинамики", МассивФорматированныхСтрокДинамики);
	СтруктураМассивовСтрок.Вставить("МассивФорматированныхСтрокПиктограммТренда", МассивФорматированныхСтрокПиктограммТренда);
	СтруктураМассивовСтрок.Вставить("МассивФорматированныхСтрокНачалаСтроки", МассивФорматированныхСтрокНачалаСтроки);
	СтруктураМассивовСтрок.Вставить("МассивФорматированныхСтрокПоАкции", МассивФорматированныхСтрокПоАкции); 
	СтруктураМассивовСтрок.Вставить("ПустаяИстория", ПустаяИстория);
	
	Возврат СтруктураМассивовСтрок;
	
КонецФункции

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

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

КонецПроцедуры // ОбработатьШтрихкоды()
// Конец МеханизмВнешнегоОборудования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция ПолучитьМассивУстановленныхРанееВидовЦенПоНоменклатуре(ПараметрыВидовЦен)
	
	Возврат УстановкаЦенСервер.ПолучитьМассивУстановленныхРанееВидовЦенПоНоменклатуре(ПараметрыВидовЦен);
		
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ТекстЗаголовка(Форма)

	Если Форма.УстанавливатьВременныеЦены Тогда
		ТекстЗаголовка = НСтр("ru='Прайс-лист с %1 по %2'");
	Иначе
		ТекстЗаголовка = НСтр("ru='Прайс-лист на %1'");
	КонецЕсли;
	ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		ТекстЗаголовка,Формат(Форма.Дата,"ДЛФ=DD"),Формат(Форма.ДатаЗавершенияПериодаДействияЦен, "ДЛФ=DD"));
	
	Возврат ТекстЗаголовка;

КонецФункции // ТекстЗаголовка()


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

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

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

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

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

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

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

&НаКлиенте
Процедура ИзменитьЦеныНаКлиентеЗавершениеФрагментОбщая()
	
	ОбновитьИнформационнуюСтроку();

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстанавливатьВременныеЦеныПриИзмененииНаСервере(Форма)
	
	Форма.Элементы.ГруппаВыборПериодаДействияЦен1.Видимость 	= НЕ Форма.УстанавливатьВременныеЦены;
	Форма.Элементы.ГруппаВыборПериодаДействияЦен2.Видимость 	= Форма.УстанавливатьВременныеЦены;
	Форма.Элементы.МаркетинговоеМероприятие.Видимость 			= Форма.УстанавливатьВременныеЦены;
		
	Если Форма.УстанавливатьВременныеЦены Тогда
		ТекстЗаголовка = НСтр("ru='Прайс-лист с %1 по %2'");
	Иначе
		ТекстЗаголовка = НСтр("ru='Прайс-лист на %1'");
	КонецЕсли;

	ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		ТекстЗаголовка,Формат(Форма.Дата,"ДЛФ=DD"),Формат(Форма.ДатаЗавершенияПериодаДействияЦен, "ДЛФ=DD"));
	Форма.Заголовок = ТекстЗаголовка(Форма);			
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОтменитьТекущиеИзменения(Команда)
	
	ОтменитьИзменениеЦенНаСервере();
	ОткрытьОкноОжиданияПрименитьНастройкиВФоне();
	
КонецПроцедуры

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

		ОтключитьОбработчикОжидания("УстановитьДоступностьГруппы");
	КонецЕсли;
	
КонецПроцедуры

//++ Локализация

&НаСервере
Функция ИмяРегламентногоЗадания() 
	
	Возврат ИнтеграцияСМаркетплейсамиСерверЛокализация.ИмяРегламентногоЗадания(); 
	
КонецФункции  

&НаСервере
Функция ИмяФормыВыбора() 
	
	Возврат ИнтеграцияСМаркетплейсамиСерверЛокализация.ИмяФормыВыбора();
	
КонецФункции

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

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

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

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

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

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

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

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

	ПараметрыЗагрузки = Результат;
	Если ПараметрыЗагрузки <> Неопределено Тогда

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

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

		Если ПараметрыЗагрузки.ТолькоВыделенныеСтроки Тогда
			ВыделенныеСтроки = Элементы.ДеревоЦен.ВыделенныеСтроки;
		Иначе
			ВыделенныеСтроки = Новый Массив;
		КонецЕсли;

		ДлительнаяОперация = ЗагрузитьЦеныНаСервере(ВыделенныеСтроки, ПараметрыЗагрузки.ВидыЦен);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Неопределено, ПараметрыОжидания);

		Состояние(НСтр("ru = 'Загрузка остатков'"),, НСтр("ru = 'Запущена фоновая загрузка цен товаров с маркетплейса.'"));

	КонецЕсли;

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

&НаСервереБезКонтекста
Функция ЗагрузитьЦеныНаСервере(ЗНАЧ ВыделенныеСтроки, ВидыЦен)

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

	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры();
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Ozon. Загрузить цены товаров.'");
	ПараметрыВыполнения.ОжидатьЗавершение = 0;
	ПараметрыВыполнения.ЗапуститьВФоне = Истина;

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

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

//-- Локализация

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

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

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

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