Норматив распределения планов продаж по категориям / Модуль объекта

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

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

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

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

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

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

#КонецЕсли

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