Скидки (наценки) / Модуль объекта

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

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

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

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

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

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

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

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

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

Процедура ОчиститьНеиспользуемыеРеквизиты()

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

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

	КонецЕсли;
	
КонецПроцедуры

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

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

#КонецЕсли

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