График исполнения договора / Форма документа / Модуль формы

файл

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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ДлительностьДоставкиПриИзменении(Элемент)
	
	Для Каждого СтрокаИсполнения Из Объект.ЭтапыГрафикаИсполненияДоговора Цикл
		СтрокаИсполнения.ДатаПоГрафику = СтрокаИсполнения.ДатаОтгрузки + 86400 * Объект.ДлительностьДоставки;
	КонецЦикла;
	
	УстановитьВидимостьЭлементов();
	
КонецПроцедуры

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

&НаКлиенте
Процедура КалендарьПриИзменении(Элемент)
	
	Для Каждого СтрокаГрафика Из Объект.ЭтапыГрафикаОплаты Цикл
		ЭтапыОплатыКлиент.ЭтапыГрафикаОплатыСдвигВариантОтсчетаПриИзменении(СтрокаГрафика,
			ДатаДоговора,
			ДатаДоговора,
			СтрокаГрафика.ДатаОтгрузки,
			Объект.ДлительностьДоставки,
			Дата(1,1,1),
			Объект.Календарь);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ГрафикЧастичноИсполненПриИзменении(Элемент)
	УстановитьВидимостьЭлементов();
	Если Не Объект.ГрафикЧастичноИсполнен Тогда
		Для Каждого СтрокаЭтапа Из Объект.ЭтапыГрафикаИсполненияДоговора Цикл
			СтрокаЭтапа.УжеОтгружено = Ложь;
		КонецЦикла;
		Для Каждого СтрокаЭтапа Из Объект.ЭтапыГрафикаОплаты Цикл
			СтрокаЭтапа.УжеОплачено = Ложь;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура ЭтапыГрафикаИсполненияДоговораПриОкончанииРедактированияЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Ответ = РезультатВопроса;
	Если Ответ = КодВозвратаДиалога.Нет Тогда
		СтрокаЭтапа = Объект.ЭтапыГрафикаИсполненияДоговора.НайтиПоИдентификатору(ДополнительныеПараметры.СтрокаЭтапа);
		Если РедактируемаяСтрока = Неопределено Тогда
			Объект.ЭтапыГрафикаИсполненияДоговора.Удалить(СтрокаЭтапа);
		Иначе
			СтрокаЭтапа.ПроцентИсполнения = РедактируемаяСтрока.ПроцентИсполнения;
			СтрокаЭтапа.СуммаИсполнения = РедактируемаяСтрока.СуммаИсполнения;
			СтрокаЭтапа.ДатаПоГрафику = РедактируемаяСтрока.ДатаПоГрафику;
			СтрокаЭтапа.ДатаОтгрузки = СтрокаЭтапа.ДатаПоГрафику - 86400 * Объект.ДлительностьДоставки;
		КонецЕсли;
		
		СвернутьЭтапыИсполнения();
		СортироватьЭтапыИсполнения();
		РассчитатьИтоговыеПоказатели(ЭтаФорма);
		
	Иначе
		Объект.ЭтапыГрафикаОплаты.Очистить();
		РассчитатьИтоговыеПоказатели(ЭтаФорма);
		УстановитьВидимостьЭлементов();
		УстановитьЗаголовкиГрафикЧастичноИсполнен();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапыГрафикаИсполненияДоговораПроцентИсполненияПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ЭтапыГрафикаИсполненияДоговора.ТекущиеДанные;
	
	Если ТекущиеДанные.ПроцентИсполнения > 0 И Объект.ЭтапыГрафикаИсполненияДоговора.Итог("ПроцентИсполнения") = 100 Тогда
		
		СуммаИсполнения = 0;
		Для Каждого ТекСтрока Из Объект.ЭтапыГрафикаИсполненияДоговора Цикл
			Если ТекСтрока.НомерСтроки <> ТекущиеДанные.НомерСтроки Тогда
				СуммаИсполнения = СуммаИсполнения + ТекСтрока.СуммаИсполнения;
			КонецЕсли;
		КонецЦикла;
		ТекущиеДанные.СуммаИсполнения = СуммаДоговора - СуммаИсполнения;
	Иначе
		
		ТекущиеДанные.СуммаИсполнения = СуммаДоговора * ТекущиеДанные.ПроцентИсполнения / 100;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапыГрафикаИсполненияДоговораСуммаИсполненияПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ЭтапыГрафикаИсполненияДоговора.ТекущиеДанные;
	ПересчитатьПроценты(ЭтаФорма);
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапыГрафикаИсполненияДоговораДатаОтгрузкиПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ЭтапыГрафикаИсполненияДоговора.ТекущиеДанные;
	
	Если ТекущиеДанные <> Неопределено Тогда
		ТекущиеДанные.ДатаПоГрафику = ТекущиеДанные.ДатаОтгрузки + 86400 * Объект.ДлительностьДоставки;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапыГрафикаОплатыСдвигПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ЭтапыГрафикаОплаты.ТекущиеДанные;
	
	ЭтапыОплатыКлиент.ЭтапыГрафикаОплатыСдвигВариантОтсчетаПриИзменении(
		ТекущиеДанные,
		ДатаДоговора,
		ДатаДоговора,
		ТекущиеДанные.ДатаОтгрузки,
		Объект.ДлительностьДоставки,
		Дата(1,1,1),
		Объект.Календарь);
	
	СортироватьЭтапыОплаты();
	
КонецПроцедуры

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

	ЭтапыОплатыКлиент.ЭтапыГрафикаОплатыСдвигВариантОтсчетаПриИзменении(
		ТекущиеДанные,
		ДатаДоговора,
		ДатаДоговора,
		ТекущиеДанные.ДатаОтгрузки,
		Объект.ДлительностьДоставки,
		Дата(1,1,1),
		Объект.Календарь);
	
	СортироватьЭтапыОплаты();
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапыГрафикаОплатыВариантОплатыПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ЭтапыГрафикаОплаты.ТекущиеДанные;
	
	ЭтапыОплатыКлиент.ЭтапыГрафикаОплатыВариантКонтроляПриИзменении(
		ТекущиеДанные,
		ДатаДоговора,
		ДатаДоговора,
		ТекущиеДанные.ДатаОтгрузки,
		Объект.ДлительностьДоставки,
		Дата(1,1,1),
		Объект.Календарь);
	
	СортироватьЭтапыОплаты();
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапыГрафикаОплатыПроцентОплатыПриИзменении(Элемент)
	ЭтапыОплатыКлиент.ЭтапыГрафикаОплатыПроцентПлатежаПриИзменении(
		Элементы.ЭтапыГрафикаОплаты.ТекущиеДанные,
		Объект.ЭтапыГрафикаОплаты,
		СуммаДоговора);
КонецПроцедуры

&НаКлиенте
Процедура ЭтапыГрафикаОплатыСуммаОплатыПриИзменении(Элемент)
	ЭтапыОплатыКлиент.ЭтапыГрафикаОплатыСуммаПлатежаПриИзменении(
		Элементы.ЭтапыГрафикаОплаты.ТекущиеДанные,
		Объект.ЭтапыГрафикаОплаты,
		СуммаДоговора);
	ПересчитатьПроценты(ЭтаФорма);
КонецПроцедуры

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

&НаКлиенте
Процедура ЭтапыГрафикаОплатыДатаПоГрафикуПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ЭтапыГрафикаОплаты.ТекущиеДанные;
	
	ЭтапыОплатыКлиент.ЭтапыГрафикаОплатыДатаПлатежаПриИзменении(
		ТекущиеДанные,
		ДатаДоговора,
		ДатаДоговора,
		ТекущиеДанные.ДатаОтгрузки,
		Объект.ДлительностьДоставки,
		Дата(1,1,1),
		Объект.Календарь);
	
	СортироватьЭтапыОплаты();
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапыГрафикаОплатыУжеОплаченоПриИзменении(Элемент)
	УстановитьЗаголовкиГрафикЧастичноИсполнен();
КонецПроцедуры

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

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

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


&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры


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

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

&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
	
	ОбщегоНазначенияУТКлиент.Записать(ЭтаФорма);
	
КонецПроцедуры

&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
	
	ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ПересчитатьПроценты(Форма)
	
	Если Форма.СуммаДоговора <> 0 Тогда
		
		ПроцентИсполнения = Окр(Форма.Объект.ЭтапыГрафикаИсполненияДоговора.Итог("СуммаИсполнения") * 100 / Форма.СуммаДоговора, 2);
		МассивЭтапов = Новый Массив();
		Для Каждого ЭтапГрафика Из Форма.Объект.ЭтапыГрафикаИсполненияДоговора Цикл 
			МассивЭтапов.Добавить(ЭтапГрафика.СуммаИсполнения);
		КонецЦикла; 
		Если МассивЭтапов.Количество() > 0 Тогда
			МассивПроцентов = ОбщегоНазначенияУТКлиентСервер.РаспределитьПропорционально(ПроцентИсполнения, МассивЭтапов);
			Для Счетчик = 0 По МассивЭтапов.Количество() - 1 Цикл 
				Если МассивПроцентов <> Неопределено Тогда
					Форма.Объект.ЭтапыГрафикаИсполненияДоговора[Счетчик].ПроцентИсполнения = МассивПроцентов[Счетчик];
				Иначе
					Форма.Объект.ЭтапыГрафикаИсполненияДоговора[Счетчик].ПроцентИсполнения = 0;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
		ПроцентОплаты = Окр(Форма.Объект.ЭтапыГрафикаОплаты.Итог("СуммаПлатежа") * 100 / Форма.СуммаДоговора, 2);
		МассивЭтапов.Очистить();
		Для Каждого ЭтапГрафика Из Форма.Объект.ЭтапыГрафикаОплаты Цикл 
			МассивЭтапов.Добавить(ЭтапГрафика.СуммаПлатежа);
		КонецЦикла; 
		Если МассивЭтапов.Количество() > 0 Тогда
			МассивПроцентов = ОбщегоНазначенияУТКлиентСервер.РаспределитьПропорционально(ПроцентОплаты, МассивЭтапов);
			Для Счетчик = 0 По МассивЭтапов.Количество() - 1 Цикл
				Если МассивПроцентов <> Неопределено Тогда
					Форма.Объект.ЭтапыГрафикаОплаты[Счетчик].ПроцентПлатежа = МассивПроцентов[Счетчик];
				Иначе
					Форма.Объект.ЭтапыГрафикаОплаты[Счетчик].ПроцентПлатежа = 0;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЗаполнитьГрафикОплатыПоСоглашениюЗавершение(Результат, Параметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		ЗаполнитьГрафикОплатыПоСоглашениюНаСервере(Результат);
		Модифицированность = Истина;
	КонецЕсли;
	
	СортироватьЭтапыОплаты();
	
КонецПроцедуры

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

&НаКлиенте
Процедура СортироватьЭтапыОплаты()
	
	Для Каждого Стр Из Объект.ЭтапыГрафикаОплаты Цикл
		Стр.НомерВариантаОплаты = ?(Стр.ВариантОплаты = ПредопределенноеЗначение("Перечисление.ВариантыКонтроляОплатыКлиентом.ПредоплатаДоОтгрузки")
									ИЛИ Стр.ВариантОплаты = ПредопределенноеЗначение("Перечисление.ВариантыКонтроляОплатыПоставщику.ПредоплатаДоПоступления"),
									1,
									?(Стр.ВариантОплаты = ПредопределенноеЗначение("Перечисление.ВариантыКонтроляОплатыКлиентом.АвансДоОбеспечения")
										ИЛИ Стр.ВариантОплаты = ПредопределенноеЗначение("Перечисление.ВариантыКонтроляОплатыПоставщику.АвансДоПодтверждения"),
										0,
										2));
	КонецЦикла;
	
	Объект.ЭтапыГрафикаОплаты.Сортировать("НомерВариантаОплаты, ДатаПлатежа");
	
КонецПроцедуры

&НаСервере
Процедура СвернутьЭтапыОплаты()
	ТЗ = Объект.ЭтапыГрафикаОплаты.Выгрузить();
	ТЗ.Свернуть("ВариантОплаты, ДатаПлатежа, ВариантОтсчета, Сдвиг","СуммаПлатежа,ПроцентПлатежа");
	Объект.ЭтапыГрафикаОплаты.Загрузить(ТЗ);
	ЗаполнитьДатыОтгрузки();
КонецПроцедуры

&НаКлиенте
Процедура СортироватьЭтапыИсполнения()
	
	Объект.ЭтапыГрафикаИсполненияДоговора.Сортировать("ДатаПоГрафику");
	
КонецПроцедуры

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

&НаСервере
Процедура ЗаполнитьПроизводственныйКалендарьНаСервере()
	
	КалендарныеГрафики.ЗаполнитьПроизводственныйКалендарьВФорме(ЭтаФорма, "Объект.Календарь");
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ЭтапыГрафикаОплатыПередНачаломДобавленияЗавершение(Результат, Параметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		
		ЗаполнитьЭтапыОплатыПослеРедактированияВФормеЭтапОплаты(Результат);
		
		УстановитьВидимостьЭлементов();
		УстановитьЗаголовкиГрафикЧастичноИсполнен();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ЭтапыГрафикаОплатыПередУдалением(Элемент, Отказ)
	
	ТекущиеДанные = Элементы.ЭтапыГрафикаОплаты.ТекущиеДанные;
	Если НесколькоДатОтгрузки 
		И (ТекущиеДанные.ВариантОтсчета = ПредопределенноеЗначение("Перечисление.ВариантыОтсчетаДатыПлатежа.ДоДатыОтгрузки")
			ИЛИ ТекущиеДанные.ВариантОтсчета = ПредопределенноеЗначение("Перечисление.ВариантыОтсчетаДатыПлатежа.ОтДатыОтгрузки")
			ИЛИ ТекущиеДанные.ВариантОтсчета = ПредопределенноеЗначение("Перечисление.ВариантыОтсчетаДатыПлатежа.ОтДатыПереходаПраваСобственности")) Тогда
		
		Отказ = Истина;
		Сдвиг = ТекущиеДанные.Сдвиг;
		ВариантОплаты = ТекущиеДанные.ВариантОплаты;
		ВариантОтсчета = ТекущиеДанные.ВариантОтсчета;
		сч = 0;
		Пока сч < Объект.ЭтапыГрафикаОплаты.Количество() Цикл
			Строка = Объект.ЭтапыГрафикаОплаты[сч];
			Если Строка.Сдвиг = Сдвиг
				И Строка.ВариантОплаты = ВариантОплаты
				И Строка.ВариантОтсчета = ВариантОтсчета Тогда
				Объект.ЭтапыГрафикаОплаты.Удалить(сч);
			Иначе
				сч = сч + 1;
			КонецЕсли;
			
		КонецЦикла;
		УстановитьВидимостьЭлементов();
		УстановитьЗаголовкиГрафикЧастичноИсполнен();
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЭтапыГрафикаОплатыПередНачаломИзмененияЗавершение(Результат, Параметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		
		сч = 0;
		Пока сч < Объект.ЭтапыГрафикаОплаты.Количество() Цикл
			Строка = Объект.ЭтапыГрафикаОплаты[сч];
			Если Строка.Сдвиг = Результат.СдвигПередИзменением
				И Строка.ВариантОплаты = Результат.ВариантОплатыПередИзменением
				И Строка.ВариантОтсчета = Результат.ВариантОтсчетаПередИзменением Тогда
				Объект.ЭтапыГрафикаОплаты.Удалить(сч);
			Иначе
				сч = сч + 1;
			КонецЕсли;
			
		КонецЦикла;
		
		ЗаполнитьЭтапыОплатыПослеРедактированияВФормеЭтапОплаты(Результат);
		
		ПересчитатьПроценты(ЭтаФорма);
		
		УстановитьЗаголовкиГрафикЧастичноИсполнен();
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЭтапыГрафикаОплатыПослеУдаления(Элемент)
	УстановитьВидимостьЭлементов();
	УстановитьЗаголовкиГрафикЧастичноИсполнен();
КонецПроцедуры

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

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

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

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

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

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

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

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