Оценка рентабельности продаж / Модуль объекта

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

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

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

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

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

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

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

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

Процедура ПриЗагрузкеВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД) Экспорт
	
	ПередЗагрузкойВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД);
	
КонецПроцедуры

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

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

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ПользовательскиеНастройкиМодифицированы = Ложь;
	
	УстановитьОбязательныеНастройки(ПользовательскиеНастройкиМодифицированы);

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

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

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

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

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

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

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

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

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

Процедура НастроитьПараметрыОтборыПоКонтекстуВызова(ЭтаФорма,КомпоновщикНастроекФормы)
	
	Продажи.ПриНастройкеПараметровОтбораПоКонтекстуВызова(ЭтаФорма, КомпоновщикНастроекФормы);
	
КонецПроцедуры

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

#КонецЕсли

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