План продаж по номенклатуре / Форма документа самообслуживание / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ
&НаКлиенте
Перем ПередЗаписьюПовторныйВызов; // Используется для не модальных вопросов перед записью

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СоглашениеПриИзменении(Элемент)
	
	ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура СкладОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Возврат;
	
КонецПроцедуры

&НаКлиенте
Процедура СоглашениеОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Возврат;
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыТоварыПоПериодам

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

&НаКлиенте
Процедура ТоварыПоПериодамПриАктивизацииЯчейки(Элемент)
	
	СамообслуживаниеКлиент.ПланПродажТоварыПоПериодамПриАктивизацииЯчейки(Элемент, ЭтаФорма);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПриИзмененииКоличества(Элемент)
	
	СтрокаТоваров = Элементы.ТоварыПоПериодам.ТекущиеДанные;
	
	ПриИзмененииКоличестваСуммыСтроки(Объект, СтрокаТоваров, КэшированныеЗначения);
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПоПериодамЦенаПриИзменении(Элемент)
	
	СтрокаТоваров = Элементы.ТоварыПоПериодам.ТекущиеДанные;
	Для каждого СтрокаПериода Из ЭтаФорма.Периоды Цикл
		Если НЕ СтрокаПериода.Активная Тогда
			Продолжить;
		КонецЕсли;
		СтрокаТоваров["Цена_" + СтрокаПериода.ИмяКолонки] = СтрокаТоваров["Цена"];
	КонецЦикла;
	
	ПриИзмененииКоличестваСуммыСтроки(Объект, СтрокаТоваров, КэшированныеЗначения)
	
КонецПроцедуры

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

&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если Поле.Имя = "ТоварыПоПериодамНоменклатура" 
		ИЛИ Поле.Имя = "ТоварыПоПериодамХарактеристика" Тогда
		
		ОткрытьКарточкуНоменклатуры();
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ПланОплатыСуммаПлатежаПриИзменении(Элемент)
	
	ЭтапОплаты = Элементы.ПланОплаты.ТекущиеДанные;
	
	ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - ЭтапОплаты.СуммаПлатежа - ЭтапОплаты.СуммаПлатежей;
	ЭтапОплаты.ПроцентПлатежа = ?(ЭтапОплаты.СуммаОтгрузок > 0, 100 * ЭтапОплаты.СуммаПлатежа / ЭтапОплаты.СуммаОтгрузок, 0);
	
	ПересчитатьСуммыПланаОплатПоСтроке(ЭтапОплаты);
	
КонецПроцедуры

&НаКлиенте
Процедура ПланОплатыПроцентПлатежаПриИзменении(Элемент)
	
	ЭтапОплаты = Элементы.ПланОплаты.ТекущиеДанные;
	
	ЭтапОплаты.СуммаПлатежа = ЭтапОплаты.СуммаОтгрузок * ЭтапОплаты.ПроцентПлатежа / 100;
	ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - ЭтапОплаты.СуммаПлатежа - ЭтапОплаты.СуммаПлатежей;
	
	ПересчитатьСуммыПланаОплатПоСтроке(ЭтапОплаты);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ПодобратьТовары(Команда)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Документ.ПланПродаж.ФормаДокументаСамообслуживание.Команда.ПодобратьТовары");
	
	ОткрытьФормуПодбораТоваров();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОткрытьКарточкуТовара(Команда)
	
	ОткрытьКарточкуНоменклатуры();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма, 
																			 "ТоварыПоПериодамХарактеристика",
																		     "ТоварыПоПериодам.ХарактеристикиИспользуются");
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПланОплатыСуммаПлатежа.Имя);

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

	Элемент = УсловноеОформление.Элементы.Добавить();

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

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПланОплатыСуммаЗадолженности.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПланОплаты.СуммаЗадолженности");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ДопустимаяСуммаЗадолженности");

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

#Область ПриИзмененииРеквизитовНаСервере

&НаСервере
Процедура СоглашениеПриИзмененииСервер(РезультатВыбора)

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

&НаСервере
Процедура ВидПланаПриИзмененииСервер(ОбновлятьПравило = Ложь)

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

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

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

#Область УправлениеДоступностьюРеквизитовФормы

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

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

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

#Область ФормированиеИВыводИнформацииНаФорму

&НаКлиенте
Процедура УстановитьИнтервалЗавершение(Период, ДополнительныеПараметры) Экспорт 
	
	ОбработатьИзменениеПериодаВШапке();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьЗаголовок()
	
	Заголовок = ТекстЗаголовка(Объект.Номер, Объект.Дата); 
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ТекстЗаголовка(Номер, Дата)
	
	 Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'План закупок %1 от %2'"), Номер, Дата);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоговыеПоказатели(Форма,РассчитыватьСтроки = Истина)

	Объект = Форма.Объект;
	Товары = Форма.ТоварыПоПериодам;
	
	Если РассчитыватьСтроки Тогда
		НомерСтроки = 0;
		Для каждого СтрокаТЧ Из Товары Цикл
			НомерСтроки = НомерСтроки + 1;
			СтрокаТЧ.НомерСтроки = НомерСтроки;
			СтрокаТЧ.КоличествоУпаковок = 0;
			СтрокаТЧ.Сумма = 0;
			Для каждого СтрокаПериода Из Форма.Периоды Цикл
				СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки] = СтрокаТЧ.Цена;
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	
	Форма["КоличествоУпаковок"] = 0;
	Объект.СуммаДокумента = 0;
	
	Количество = 0;
	Сумма = 0;
	Для каждого СтрокаПериода Из Форма.Периоды Цикл
		Если НЕ СтрокаПериода.Активная Тогда
			Продолжить;
		КонецЕсли;
		
		Форма["ТоварыПоПериодамКоличество_" + СтрокаПериода.ИмяКолонки] = 0;
		Форма["ТоварыПоПериодамСумма_" + СтрокаПериода.ИмяКолонки] = 0;
		Для каждого СтрокаТЧ Из Товары Цикл
			
			Если РассчитыватьСтроки Тогда
				СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
				СтрокаТЧ["Сумма_" + СтрокаПериода.ИмяКолонки] = СтрокаТЧ["Количество_" 
				                                    + СтрокаПериода.ИмяКолонки] * СтрокаТЧ["Цена_" + СтрокаПериода.ИмяКолонки];
				СтрокаТЧ.Сумма = СтрокаТЧ.Сумма + СтрокаТЧ["Сумма_" + СтрокаПериода.ИмяКолонки];
			КонецЕсли;
			Форма["ТоварыПоПериодамКоличество_" + СтрокаПериода.ИмяКолонки] = Форма["ТоварыПоПериодамКоличество_" 
			                                + СтрокаПериода.ИмяКолонки] + СтрокаТЧ["Количество_" + СтрокаПериода.ИмяКолонки];
			Форма["ТоварыПоПериодамСумма_" + СтрокаПериода.ИмяКолонки] = Форма["ТоварыПоПериодамСумма_" 
			                                + СтрокаПериода.ИмяКолонки] + СтрокаТЧ["Сумма_" + СтрокаПериода.ИмяКолонки];
		КонецЦикла;
		
	КонецЦикла;
	
	Для каждого СтрокаТЧ Из Товары Цикл
		Форма["КоличествоУпаковок"] = Форма["КоличествоУпаковок"] + СтрокаТЧ["КоличествоУпаковок"];
		Объект.СуммаДокумента = Объект.СуммаДокумента + СтрокаТЧ["Сумма"];
	КонецЦикла;
	
	Форма.КоличествоТоваров = Форма.ТоварыПоПериодам.Количество();
	
КонецПроцедуры

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

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

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

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

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

// Функция проверяет необходимость обновления интерфейса при изменении параметров
//
&НаКлиенте
Функция НеобходимоОбновитьИнтерфейс()
	
	Если НачалоПериодаДоИзменения <> Объект.НачалоПериода Тогда
		Возврат Истина;
	КонецЕсли; 
	
	Если ОкончаниеПериодаДоИзменения <> Объект.ОкончаниеПериода Тогда
		Возврат Истина;
	КонецЕсли; 
	
	Возврат Ложь;
	
КонецФункции

&НаКлиенте
Процедура ПериодИзмененКорректно()

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

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

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

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

&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции()
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются",
				Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
	СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул",
				Новый Структура("Номенклатура", "Артикул"));
				
	НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(
		ТоварыПоПериодам,
		СтруктураДействий);

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьСвязанныеРеквизитыОбъекта(Объект, Форма)
	
	Если НЕ Форма.ЗаполнятьСклад Тогда
		Объект.Склад = Неопределено;
	КонецЕсли;

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий)
	
	СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьКарточкуНоменклатуры()

	ТекущиеДанные = Элементы.ТоварыПоПериодам.ТекущиеДанные;
	
	Если ТекущиеДанные <> Неопределено Тогда
		ПараметрыФормы = Новый Структура("Ключ", ТекущиеДанные.Номенклатура);
		ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);
	КонецЕсли;

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

&НаКлиенте
Процедура ПриИзмененииКоличестваСуммыСтроки(Объект, СтрокаТоваров, КэшированныеЗначения)

	Количество = 0;
	Сумма = 0;
	Для каждого СтрокаПериода Из ЭтаФорма.Периоды Цикл
		Если НЕ СтрокаПериода.Активная Тогда
			Продолжить;
		КонецЕсли;
		
		Количество = Количество + СтрокаТоваров["Количество_" + СтрокаПериода.ИмяКолонки];
		Если Объект.ПланироватьПоСумме Тогда
			СтрокаТоваров["Сумма_" + СтрокаПериода.ИмяКолонки] = СтрокаТоваров["Количество_" + СтрокаПериода.ИмяКолонки] * СтрокаТоваров["Цена"];
		Иначе
			СтрокаТоваров["Сумма_" + СтрокаПериода.ИмяКолонки] = 0;
		КонецЕсли; 
		
		Сумма = Сумма + СтрокаТоваров["Сумма_" + СтрокаПериода.ИмяКолонки];
		
	КонецЦикла;
	
	СтрокаТоваров.КоличествоУпаковок = Количество;
	СтрокаТоваров.Сумма              = Количество * СтрокаТоваров.Цена;
	
	СтруктураДействий = Новый Структура;
	ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий);
	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокаТоваров, СтруктураДействий, КэшированныеЗначения);

	РассчитатьИтоговыеПоказатели(ЭтаФорма, Ложь);

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

&НаКлиенте
Процедура ОткрытьФормуПодбораТоваров()

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

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

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

#Область ПланОплат

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция НадписьДопустимаяСуммаЗадолженности(СуммаЗадолженности, Валюта)

	НадписьДопустимаяСуммаЗадолженности = НСтр("ru='Допустимая сумма задолженности не более: %СуммаЗадолженности% %Валюта%.'");
	НадписьДопустимаяСуммаЗадолженности = СтрЗаменить(НадписьДопустимаяСуммаЗадолженности, "%СуммаЗадолженности%", Строка(СуммаЗадолженности));
	НадписьДопустимаяСуммаЗадолженности = СтрЗаменить(НадписьДопустимаяСуммаЗадолженности, "%Валюта%", Валюта);
	
	Возврат НадписьДопустимаяСуммаЗадолженности;

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

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

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

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

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

	Иначе
		Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	СоглашенияСКлиентамиЭтапыГрафикаОплаты.НомерСтроки КАК НомерСтроки,
		|	СоглашенияСКлиентамиЭтапыГрафикаОплаты.ВариантОплаты КАК ВариантОплаты,
		|	СоглашенияСКлиентамиЭтапыГрафикаОплаты.Сдвиг КАК Сдвиг,
		|	СоглашенияСКлиентамиЭтапыГрафикаОплаты.ПроцентПлатежа КАК ПроцентПлатежа,
		|	СоглашенияСКлиентамиЭтапыГрафикаОплаты.ПроцентЗалогаЗаТару КАК ПроцентЗалогаЗаТару,
		|	СоглашенияСКлиентамиЭтапыГрафикаОплаты.Ссылка.ФормаОплаты КАК ФормаОплаты,
		|	СоглашенияСКлиентамиЭтапыГрафикаОплаты.Ссылка.Календарь КАК Календарь
		|ИЗ
		|	Справочник.СоглашенияСКлиентами.ЭтапыГрафикаОплаты КАК СоглашенияСКлиентамиЭтапыГрафикаОплаты
		|ГДЕ
		|	СоглашенияСКлиентамиЭтапыГрафикаОплаты.Ссылка = &Соглашение
		|
		|УПОРЯДОЧИТЬ ПО
		|	НомерСтроки");
		
		Запрос.УстановитьПараметр("Соглашение", Объект.Соглашение);
		
		РезультатЗапроса = Запрос.Выполнить();
		ШаблонГрафика    = РезультатЗапроса.Выгрузить();
		Календарь        = ШаблонГрафика[0].Календарь;
		
	КонецЕсли; 
	
	Если Объект.КроссТаблица Тогда
		ТаблицаПериоды = ЭтаФорма.Периоды; // см. Планирование.ТаблицаПериоды
			
		Для каждого Период Из ТаблицаПериоды Цикл
			Если НЕ Период.Активная ИЛИ Период.НомерКолонки = 0 Тогда
				Продолжить;
			КонецЕсли;
			
			СуммаОплатыКраспределению = ЭтаФорма["ТоварыПоПериодамСумма_"+Период.ИмяКолонки];
			
			ПараметрыЗаполнения = ЭтапыОплатыСервер.ПараметрыЗаполненияЭтаповОплаты();
			ПараметрыЗаполнения.ЭтоРасчетыСКлиентами = Истина;
			ПараметрыЗаполнения.НакладнаяПоЗаказам = Ложь;
			ПараметрыЗаполнения.ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоЗаказам;
			ПараметрыЗаполнения.ЭтоЗаказ = Ложь;
			
			ПараметрыЗаполнения.Вставить("ДатаОтгрузки", Период.ДатаНачала);
			ПараметрыЗаполнения.Вставить("ДатаЗаказа", Период.ДатаНачала);
			ПараметрыЗаполнения.Вставить("ШаблонГрафика", ШаблонГрафика);
			ПараметрыЗаполнения.Вставить("Календарь", Календарь);
			ПараметрыЗаполнения.Вставить("СуммаОплаты", СуммаОплатыКраспределению);
			
			ЭтапыОплатыСервер.ЗаполнитьЭтапыОплатыДокументаПоШаблону(ПланОплатыКопия, ПараметрыЗаполнения);
			
			Для каждого ЭтапОплаты Из ПланОплатыКопия Цикл
				
				НоваяСтрока = ПланОплаты.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭтапОплаты);
				
			КонецЦикла; 
			
		КонецЦикла; 
		
		ПланОплаты.Свернуть("ВариантОплаты, ДатаПлатежа","СуммаПлатежа, СуммаЗадолженности, СуммаОтгрузок");
		ПланОплаты.Колонки.Добавить("ПроцентПлатежа");
		ПланОплаты.Колонки.Добавить("СуммаПлатежей");
		ПланОплаты.Сортировать("ДатаПлатежа");
		
		СуммаПлатежей = 0;
		Для каждого ЭтапОплаты Из ПланОплаты Цикл
			ТаблицаПериоды = ЭтаФорма.Периоды; // см. Планирование.ТаблицаПериоды
			
			Для каждого Период Из ТаблицаПериоды Цикл
				Если НЕ Период.Активная ИЛИ Период.НомерКолонки = 0 ИЛИ ЭтапОплаты.ДатаПлатежа < Период.ДатаНачала Тогда
					Продолжить;
				КонецЕсли;
				
				ЭтапОплаты.СуммаОтгрузок = ЭтапОплаты.СуммаОтгрузок + ЭтаФорма["ТоварыПоПериодамСумма_"+Период.ИмяКолонки];
			КонецЦикла;
			
			ЭтапОплаты.СуммаПлатежей = СуммаПлатежей;
			СуммаПлатежей = СуммаПлатежей + ЭтапОплаты.СуммаПлатежа;
			ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - СуммаПлатежей;
			ЭтапОплаты.ПроцентПлатежа = ?(ЭтапОплаты.СуммаОтгрузок > 0, 100 * ЭтапОплаты.СуммаПлатежа / ЭтапОплаты.СуммаОтгрузок, 0);
			
		КонецЦикла; 
		
	Иначе
	
		СуммыПоДатам = Объект.Товары.Выгрузить(,"ДатаОтгрузки, Сумма");
		СуммыПоДатам.Свернуть("ДатаОтгрузки", "Сумма");
		СуммыПоДатам.Сортировать("ДатаОтгрузки");
		
		Для каждого СуммаНаДату Из СуммыПоДатам Цикл
			
			СуммаОплатыКраспределению = СуммаНаДату.Сумма;
			
			ПараметрыЗаполнения = ЭтапыОплатыСервер.ПараметрыЗаполненияЭтаповОплаты();
			ПараметрыЗаполнения.ЭтоРасчетыСКлиентами = Истина;
			ПараметрыЗаполнения.НакладнаяПоЗаказам = Ложь;
			ПараметрыЗаполнения.ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоЗаказам;
			ПараметрыЗаполнения.ЭтоЗаказ = Ложь;
			
			ПараметрыЗаполнения.Вставить("ДатаОтгрузки", Период.ДатаНачала);
			ПараметрыЗаполнения.Вставить("ДатаЗаказа", Период.ДатаНачала);
			ПараметрыЗаполнения.Вставить("ШаблонГрафика", ШаблонГрафика);
			ПараметрыЗаполнения.Вставить("Календарь", Календарь);
			ПараметрыЗаполнения.Вставить("СуммаОплаты", СуммаОплатыКраспределению);
			
			ЭтапыОплатыСервер.ЗаполнитьЭтапыОплатыДокументаПоШаблону(ПланОплаты, ПараметрыЗаполнения);
			 
		КонецЦикла;
		
		ПланОплаты.Свернуть("ВариантОплаты, ДатаПлатежа","СуммаПлатежа, СуммаЗадолженности, СуммаОтгрузок");
		ПланОплаты.Колонки.Добавить("ПроцентПлатежа");
		ПланОплаты.Колонки.Добавить("СуммаПлатежей");
		ПланОплаты.Сортировать("ДатаПлатежа");
		
		СуммаПлатежей = 0;
		Для каждого ЭтапОплаты Из ПланОплаты Цикл
			
			Для каждого СуммаНаДату Из СуммыПоДатам Цикл
				
				Если ЭтапОплаты.ДатаПлатежа < СуммаНаДату.ДатаОтгрузки Тогда
					Продолжить;
				КонецЕсли;
				ЭтапОплаты.СуммаОтгрузок = ЭтапОплаты.СуммаОтгрузок + СуммаНаДату.Сумма;
			КонецЦикла; 
			
			ЭтапОплаты.СуммаПлатежей = СуммаПлатежей;
			СуммаПлатежей = СуммаПлатежей + ЭтапОплаты.СуммаПлатежа;
			
			ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - СуммаПлатежей;
			ЭтапОплаты.ПроцентПлатежа = ?(ЭтапОплаты.СуммаОтгрузок > 0, 100 * ЭтапОплаты.СуммаПлатежа / ЭтапОплаты.СуммаОтгрузок, 0);
		КонецЦикла;
	КонецЕсли; 
	
	Объект.ПланОплаты.Загрузить(ПланОплаты);
	
	РассчитатьИтоговыеПоказателиПланаОплат(ЭтаФорма);
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьЭтапОплатыПоУмолчаниюСервер()

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

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

&НаКлиенте
Процедура ПересчитатьСуммыПланаОплатПоСтроке(СтрокаПланаОплаты)

	СуммаПлатежей = 0;
	Для каждого ЭтапОплаты Из Объект.ПланОплаты Цикл
	
		Если ЭтапОплаты.ДатаПлатежа <= СтрокаПланаОплаты.ДатаПлатежа Тогда
			СуммаПлатежей = СуммаПлатежей + ЭтапОплаты.СуммаПлатежа;
			Продолжить;
		КонецЕсли; 
		
		ЭтапОплаты.СуммаПлатежей = СуммаПлатежей;
		СуммаПлатежей = СуммаПлатежей + ЭтапОплаты.СуммаПлатежа;
		ЭтапОплаты.СуммаЗадолженности = ЭтапОплаты.СуммаОтгрузок - СуммаПлатежей;
		
	КонецЦикла; 

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

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

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

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