Виды планов / Модуль объекта

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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	Если Не ЭтоГруппа Тогда
		//++ Локализация
		ИдентификаторМоделиПрогнозирования = -1;
		//-- Локализация
	КонецЕсли;
	
КонецПроцедуры


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

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

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

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

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

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

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

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

#КонецЕсли

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