Виды цен (Колонки прайс-листа) / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов


// Получает реквизиты объекта, которые необходимо блокировать от изменения
//
// Возвращаемое значение:
//	Массив - блокируемые реквизиты объекта.
//
Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт

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

	Результат.Добавить("ПараметрыСпособаЗаданияЦены; ПараметрыСпособаЗаданияЦеныПроизвольныйТип");

	Возврат Результат;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

// Возвращает созданный вид цен
// 
// Параметры:
// 	ПараметрыСоздания - см. ИнициализироватьПараметрыДляСозданияВидаЦен
// Возвращаемое значение:
// 	Структура - см. УстановкаЦенСервер.ИнициализироватьСтруктуруРезультата
Функция СоздатьНовыйВидЦен(ПараметрыСоздания) Экспорт

	Отказ = Ложь;
	
	РезультатСоздания = УстановкаЦенСервер.ИнициализироватьСтруктуруРезультата();

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

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

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

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

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

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

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

// Выполняет инициализацию структуры параметров для создания нового вида цен
//
// Возвращаемое значение:
//  Структура - структура со свойствами:
//  * Наименование - Строка - наименование вида цен
//  * СпособЗаданияЦены - ПеречислениеСсылка.СпособыЗаданияЦен - Способ задания цены
//  * Статус - ПеречислениеСсылка.СтатусыДействияВидовЦен - Статус вида цен
//  * ВалютаЦены - СправочникСсылка.Валюты - Валюта вида цен
//  * СхемаКомпоновкиДанных - Строка - Наименование схемы компоновки данных
//  * Назначение - ПеречислениеСсылка.НазначенияВидовЦен - Назначение видов цен
//  * ИспользоватьПриРозничнойПродаже - Булево - Признак использования при розничной продаж
//  * ИспользоватьПриОптовойПродаже - Булево - Признак использования при оптовой продаже
//  * ИспользоватьПриВыпускеПродукции - Булево - Признак использования при выпуске продукции
//  * ИспользоватьПриПередачеМеждуОрганизациями - Булево - Признак использования при передаче между организациями
//  * ИспользоватьПриПередачеПродукцииДавальцу - Булево - Признак использования при передаче давальцу
//  * Наценка - Число - Сумма наценки
//  * Формула - Строка - Формула вида цен
//  * ЦеновыеГруппы - ТаблицаЗначений - Таблица по ценовым группам с колонками:
//    ** ЦеноваяГруппа - СправочникСсылка.ЦеновыеГруппы - Ценовая группа
//    ** Формула - Строка - Формула вида цен
//    ** БазовыйВидЦены - СправочникСсылка.ВидыЦен - Базовый вид цен
//    ** Наценка - Число - Сумма наценки
//
Функция ИнициализироватьПараметрыДляСозданияВидаЦен() Экспорт

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

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

// Найти индивидуальный вид цен сервер.
// 
// Параметры:
//  ВладелецИПЛ Владелец ИПЛ
// 
// Возвращаемое значение:
//  см. УстановкаЦенСервер.ИнициализироватьСтруктуруРезультата
Функция НайтиИндивидуальныйВидЦенСервер(ВладелецИПЛ) Экспорт
	
	РезультатПоиска = УстановкаЦенСервер.ИнициализироватьСтруктуруРезультата();

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

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

#Область Команды

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

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЭтоГруппа ИЛИ
	|	ЗначениеРазрешено(Ссылка)";
	
	Ограничение.ТекстДляВнешнихПользователей =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Ссылка)
	|	И ИспользоватьПриПродаже";

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

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

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

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

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

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

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

#КонецЕсли

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