Способы обеспечения потребностей / Форма элемента / Модуль формы

файл

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;

	ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);

	Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
		ПриЧтенииСозданииНаСервере();
	КонецЕсли;

	СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

	ПриЧтенииСозданииНаСервере();

	МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ТекущийОбъект, ПараметрыЗаписи);

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

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	
	ПараметрыЗаписи.Вставить("ТипОбеспечения", Объект.ТипОбеспечения);
	Оповестить("Запись_СпособОбеспеченияПотребностей", ПараметрыЗаписи, Объект.Ссылка);

	МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтотОбъект, ПараметрыЗаписи);

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

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

	МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

&НаКлиенте
Процедура СрокПокупкиПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("СрокИсполненияЗаказа");
	
КонецПроцедуры

&НаКлиенте
Процедура СрокПеремещенияПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("СрокИсполненияЗаказа");
	
КонецПроцедуры

&НаКлиенте
Процедура СрокСборкиПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("СрокИсполненияЗаказа");
	
КонецПроцедуры

&НаКлиенте
Процедура СрокПроизводстваПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("СрокИсполненияЗаказа");
	
КонецПроцедуры

&НаКлиенте
Процедура СрокПереработкиПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("СрокИсполненияЗаказа");
	
КонецПроцедуры

&НаКлиенте
Процедура ГарантированныйСрокОбеспеченияПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ГарантированныйСрокОбеспечения");
	
КонецПроцедуры

&НаКлиенте
Процедура ФормироватьЗаказыПоТочкеЗаказаПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ФормироватьЗаказыПоТочкеЗаказа");
	
КонецПроцедуры

&НаКлиенте
Процедура ВариантОбеспечиваемогоПериодаПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ВариантОбеспечиваемогоПериода");
	
КонецПроцедуры

&НаКлиенте
Процедура ОпределенноеКоличествоДнейПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ОбеспечиваемыйПериод");
	
КонецПроцедуры

&НаКлиенте
Процедура ФормироватьЗаказыПоРасписаниюПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ФормироватьЗаказыПоРасписанию");
	
КонецПроцедуры

&НаКлиенте
Процедура КоличествоПериодовВИнтервалеМеждуПоставкамиПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("КоличествоПериодовВИнтервалеМеждуПоставками");
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодичностьГрафикаПоставокПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ПериодичностьГрафикаПоставок");
	
КонецПроцедуры

&НаКлиенте
Процедура ПерваяДатаВГрафикеПоставокПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ПерваяДатаВГрафикеПоставок");
	
КонецПроцедуры

&НаКлиенте
Процедура ГрафикПоставокПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ГрафикПоставок");
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключательСпособЗаданияРасписанияПоставокИнтервалПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ПереключательСпособЗаданияРасписанияПоставок");
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключательСпособЗаданияРасписанияПоставокГрафикПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ПереключательСпособЗаданияРасписанияПоставок");
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключательПолуфабрикатыПланироватьАвтоматическиПриИзменении(Элемент)
	
	
	Возврат;
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключательПолуфабрикатыПланироватьВручнуюПриИзменении(Элемент)
	
	
	Возврат;
	
КонецПроцедуры

&НаКлиенте
Процедура РежимИспользованияНесколькоИсточниковПриИзменении(Элемент)
	
	Объект.ИсточникОбеспеченияПотребностей = Неопределено;
	Объект.Соглашение = Неопределено;
	СоглашениеПриИзмененииСервер(Истина);
	
	АктивизироватьСтраницыРежимИспользования(Элементы, Ложь);
	
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоставщикПриИзменении(Элемент)
	
	СоглашениеПриИзмененииСервер(Истина);
	
КонецПроцедуры


&НаКлиенте
Процедура РежимИспользованияОдинИсточникПриИзменении(Элемент)
	
	АктивизироватьСтраницыРежимИспользования(Элементы, Истина);
	
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура СборкаДлительностьВДняхПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ДлительностьВДнях");
	
КонецПроцедуры

&НаКлиенте
Процедура ПеремещениеДлительностьВДняхПриИзменении(Элемент)
	
	ПриИзмененииРеквизитаПланированияНаКлиенте("ДлительностьВДнях");
	
КонецПроцедуры

&НаКлиенте
Процедура СоглашениеПриИзменении(Элемент)
	
	СоглашениеПриИзмененииСервер(Истина);
	
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтотОбъект, Команда);
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
	
	ОдинИсточник = ЗначениеЗаполнено(Объект.ИсточникОбеспеченияПотребностей);
	СписокВыбора = ЗаполнитьСписокВыбораТипаОбеспечения();
	
	// Приведение значения типа обеспечения к допустимому.
	Если СписокВыбора.НайтиПоЗначению(Объект.ТипОбеспечения) = Неопределено Тогда
		Если СписокВыбора.НайтиПоЗначению(Перечисления.ТипыОбеспечения.Покупка) <> Неопределено Тогда
			Объект.ТипОбеспечения = Перечисления.ТипыОбеспечения.Покупка;
		ИначеЕсли СписокВыбора.Количество() > 0 Тогда
			Объект.ТипОбеспечения = СписокВыбора[0].Значение;
		КонецЕсли;
	КонецЕсли;

	Если СписокВыбора.Количество() = 1 Тогда
		Элементы.ТипОбеспечения1.Видимость = Ложь;
		Элементы.ТипОбеспечения2.Видимость = Ложь;
		Элементы.ТипОбеспечения3.Видимость = Ложь;
		Элементы.ТипОбеспечения4.Видимость = Ложь;
		Элементы.ТипОбеспечения5.Видимость = Ложь;
	КонецЕсли;

	НастроитьФормуПоТипуОбеспечения();
	СоглашениеПриИзмененииСервер(Ложь);
	АктивизироватьСтраницыРежимИспользования(Элементы, ОдинИсточник);
	ПриИзмененииРеквизитаПланирования(ЭтотОбъект, Неопределено);
	СформироватьЗаголовкиПоясняющихНадписей();

	Элементы.Поставщик.ОграничениеТипа              = Новый ОписаниеТипов("СправочникСсылка.Партнеры");
	Элементы.Склад.ОграничениеТипа                  = Новый ОписаниеТипов("СправочникСсылка.Склады");
	Элементы.Переработчик.ОграничениеТипа           = Новый ОписаниеТипов("СправочникСсылка.Партнеры");
	Элементы.ПодразделениеДиспетчер.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.СтруктураПредприятия");
	

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура АктивизироватьСтраницыРежимИспользования(Элементы, ОдинИсточник)
	
	Элементы.СтраницыРежимИспользованияПокупкаПояснение.ТекущаяСтраница = ?(ОдинИсточник,
		Элементы.РежимИспользованияОдинПоставщикПояснение, Элементы.РежимИспользованияНесколькоПоставщиковПояснение);
		
	Элементы.СтраницыРежимИспользованияПеремещениеПояснение.ТекущаяСтраница = ?(ОдинИсточник,
		Элементы.РежимИспользованияОдинСкладПояснение, Элементы.РежимИспользованияНесколькоСкладовПояснение);
	
	Элементы.Поставщик.Доступность = ОдинИсточник;
	Элементы.Склад.Доступность     = ОдинИсточник;
	
	Элементы.ВидЦеныПоставщика.Доступность = ОдинИсточник;
	Элементы.Соглашение.Доступность        = ОдинИсточник;
	
	
КонецПроцедуры

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

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

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

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

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

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