План закупок / Форма документа / Модуль формы

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

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

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

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

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

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

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

	// СтандартныеПодсистемы.РаботаСФайлами
	ПараметрыГиперссылки = РаботаСФайлами.ГиперссылкаФайлов();
	ПараметрыГиперссылки.Размещение = "КоманднаяПанель";
	РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыГиперссылки);
	// Конец СтандартныеПодсистемы.РаботаСФайлами

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

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

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

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

	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	СкопироватьИзКроссТаблицы(ПараметрыЗаписи["КэшированныеЗначения"], ТекущийОбъект);
	
	Запрос = Новый Запрос;
	Запрос.Текст =  
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	Товары.ДатаПоступления КАК Период,
		|	Товары.ДатаЗаказа      КАК ДатаЗаказа,
		|	&Подразделение         КАК Подразделение,
		|	&Сценарий              КАК Сценарий,
		|	Товары.Номенклатура    КАК Номенклатура,
		|	Товары.Характеристика  КАК Характеристика,
		|	Товары.Партнер         КАК Партнер,
		|	Товары.Соглашение      КАК Соглашение,
		|	Товары.Склад           КАК Склад
		|ПОМЕСТИТЬ Товары
		|ИЗ
		|	&Товары КАК Товары
		|ГДЕ
		|	Товары.КоличествоУпаковок <> 0
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ДвиженияДокумента.Период         КАК Период, 
		|	ДвиженияДокумента.ДатаЗаказа     КАК ДатаЗаказа,
		|	ДвиженияДокумента.Подразделение  КАК Подразделение,
		|	ДвиженияДокумента.Сценарий       КАК Сценарий,
		|	ДвиженияДокумента.Номенклатура   КАК Номенклатура,
		|	ДвиженияДокумента.Характеристика КАК Характеристика,
		|	ВЫБОР
		|		КОГДА ДвиженияДокумента.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ                            КАК УказаниеПартнера,
		|	ВЫБОР
		|		КОГДА ДвиженияДокумента.Соглашение = ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ                            КАК УказаниеСоглашения,
		|	ВЫБОР
		|		КОГДА ДвиженияДокумента.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
		|			ИЛИ СпрНоменклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
		|				ИЛИ СпрНоменклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ                            КАК УказаниеСклада
		|ПОМЕСТИТЬ ДвиженияДокумента
		|ИЗ
		|	Товары КАК ДвиженияДокумента
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
		|		ПО ДвиженияДокумента.Номенклатура = СпрНоменклатура.Ссылка
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ДвиженияДокумента.Период,
		|	ДвиженияДокумента.ДатаЗаказа,
		|	ДвиженияДокумента.Подразделение,
		|	ДвиженияДокумента.Сценарий,
		|	ДвиженияДокумента.Номенклатура,
		|	ДвиженияДокумента.Характеристика,
		|	ВЫБОР
		|		КОГДА ПланыЗакупок.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ,
		|	ВЫБОР
		|		КОГДА ПланыЗакупок.Соглашение = ЗНАЧЕНИЕ(Справочник.СоглашенияСПоставщиками.ПустаяСсылка)
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ,
		|	ВЫБОР
		|		КОГДА ПланыЗакупок.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ
		|ИЗ
		|	Товары КАК ДвиженияДокумента
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПланыЗакупок КАК ПланыЗакупок
		|		ПО ДвиженияДокумента.Период = ПланыЗакупок.Период
		|			И ДвиженияДокумента.ДатаЗаказа = ПланыЗакупок.ДатаЗаказа
		|			И ДвиженияДокумента.Номенклатура = ПланыЗакупок.Номенклатура
		|			И ДвиженияДокумента.Характеристика = ПланыЗакупок.Характеристика
		|			И ДвиженияДокумента.Подразделение = ПланыЗакупок.Подразделение
		|			И ДвиженияДокумента.Сценарий = ПланыЗакупок.Сценарий
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗамещениеПланов КАК ЗамещениеПланов
		|			ПО ПланыЗакупок.ПланЗакупок = ЗамещениеПланов.ЗамещающийПлан
		|ГДЕ
		|	ВЫБОР
		|			КОГДА ЗамещениеПланов.ЗамещающийПлан ЕСТЬ NULL
		|				ТОГДА ПланыЗакупок.Регистратор <> &Ссылка
		|			ИНАЧЕ ИСТИНА
		|		КОНЕЦ
		|	И ПланыЗакупок.Количество <> 0
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ДвиженияДокумента.Период                                   КАК Период,
		|	ДвиженияДокумента.ДатаЗаказа                               КАК ДатаЗаказа,
		|	ДвиженияДокумента.Подразделение                            КАК Подразделение,
		|	ДвиженияДокумента.Сценарий                                 КАК Сценарий,
		|	ДвиженияДокумента.Номенклатура                             КАК Номенклатура,
		|	ДвиженияДокумента.Характеристика                           КАК Характеристика,
		|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДвиженияДокумента.УказаниеПартнера)   КАК УказаниеПартнера,
		|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДвиженияДокумента.УказаниеСоглашения) КАК УказаниеСоглашения,
		|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДвиженияДокумента.УказаниеСклада)     КАК УказаниеСклада
		|ИЗ
		|	ДвиженияДокумента КАК ДвиженияДокумента
		|
		|СГРУППИРОВАТЬ ПО
		|	ДвиженияДокумента.Период,
		|	ДвиженияДокумента.ДатаЗаказа,
		|	ДвиженияДокумента.Подразделение,
		|	ДвиженияДокумента.Сценарий,
		|	ДвиженияДокумента.Номенклатура,
		|	ДвиженияДокумента.Характеристика
		|
		|ИМЕЮЩИЕ
		|	(КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДвиженияДокумента.УказаниеПартнера) > 1
		|		ИЛИ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДвиженияДокумента.УказаниеСоглашения) > 1
		|		ИЛИ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДвиженияДокумента.УказаниеСклада) > 1)";

	Запрос.УстановитьПараметр("Подразделение", ТекущийОбъект.Подразделение);
	Запрос.УстановитьПараметр("Сценарий", ТекущийОбъект.Сценарий);
	Запрос.УстановитьПараметр("Товары", ТекущийОбъект.Товары.Выгрузить(, "ДатаПоступления, ДатаЗаказа, Номенклатура, Характеристика, Партнер, 
		|Соглашение, Склад, КоличествоУпаковок"));
	Запрос.УстановитьПараметр("Ссылка", ТекущийОбъект.Ссылка);
	РезультатЗапроса = Запрос.Выполнить();
	
	ШаблонСообщения1 = НСтр("ru = 'Для номенклатуры %НоменклатураХарактеристика% 
		|нельзя одновременно использовать в одном периоде и подразделении планы с пустым и планы с заполненным значением поля:'") + " ";
	ШаблонСообщения2 = НСтр("ru = '%Поле%'");
	
	Выборка = РезультатЗапроса.Выбрать();
	Пока Выборка.Следующий() Цикл

		ТекстСообщения = СтрЗаменить(ШаблонСообщения1, "%НоменклатураХарактеристика%",
						НоменклатураКлиентСервер.ПредставлениеНоменклатуры(Выборка.Номенклатура, Выборка.Характеристика));
		Если Выборка.УказаниеПартнера > 1 Тогда
			ТекстСообщения = ТекстСообщения + СтрЗаменить(ШаблонСообщения2, "%Поле%",  "Поставщик");
		КонецЕсли; 
		Если Выборка.УказаниеСоглашения > 1 Тогда
			ТекстСообщения = ТекстСообщения + СтрЗаменить(ШаблонСообщения2, "%Поле%", ?(Выборка.УказаниеПартнера>1,", ","")+"Соглашение");
		КонецЕсли; 
		Если Выборка.УказаниеСклада > 1 Тогда
			ТекстСообщения = ТекстСообщения + СтрЗаменить(ШаблонСообщения2, "%Поле%",  ?(Выборка.УказаниеПартнера>1 ИЛИ Выборка.УказаниеСоглашения>1,", ","")+"Склад");
		КонецЕсли; 
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ТекущийОбъект, ,, Отказ);

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

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

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

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

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

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

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

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

	// СтандартныеПодсистемы.РаботаСФайлами
	РаботаСФайламиКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия);
	// Конец СтандартныеПодсистемы.РаботаСФайлами

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
		ЭтаФорма.ИмяФормы, "Товары"));

	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
	
	ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект, ТекущаяСтрока);
	
КонецПроцедуры

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

	СтруктураДействий = Новый Структура;

	СтруктураДействий.Вставить("ХарактеристикаПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
		ЭтаФорма.ИмяФормы, "Товары"));

	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ТоварыПоПериодамПриАктивизацииЯчейки(Элемент)
	
	ПодключитьОбработчикОжидания("ТоварыПоПериодамПриАктивизацииЯчейкиНаКлиенте", 0.5, Истина);
	
КонецПроцедуры

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

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

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

	СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
		ЭтаФорма.ИмяФормы, "ТоварыПоПериодам"));

	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
	
	ПланированиеКлиентСервер.УстановитьПредставлениеФормулы(ЭтотОбъект, ТекущаяСтрока);
	
КонецПроцедуры

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

	ОткрытьФорму("Обработка.ПодборТоваровВДокументЗакупки.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЗаполнитьДаннымиДляЗамещения()
	
	Если НЕ ПроверитьЗаполнениеШапки() Тогда
		Возврат;
	КонецЕсли;
	
	Настройки = Новый Структура;
	Настройки.Вставить("ЗаполнитьДляЗамещения");
	
	ЗаполнитьДокумент(Настройки);
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
	
	Если НЕ ПроверитьЗаполнениеШапки() Тогда
		Возврат;
	КонецЕсли;
	
	РаботаСExcelКлиент.ВыгрузитьВExcel(ЭтаФорма);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
	
	Если НЕ ПроверитьЗаполнениеШапки() Тогда
		Возврат;
	КонецЕсли;
	
	РаботаСExcelКлиент.ВыбратьПрисоединенныйФайлExcel(ЭтаФорма, ?(Объект.КроссТаблица, "ТоварыПоПериодам", "Товары"));
	
КонецПроцедуры

#Область ЗагрузкаДанныхИзФайла

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

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

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

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

&НаКлиенте
Процедура ПереключитьПериодыВСтроки(Команда)
	
	ПереключитьПериодыВСтрокиНаСервере(КэшированныеЗначения);
	
КонецПроцедуры

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


&НаКлиенте
Процедура УдалитьПустыеСтроки(Команда)
	
	УдалитьПустыеСтрокиНаСервере();
	
КонецПроцедуры

#Область Аналоги

&НаКлиенте
Процедура ПодобратьАналоги(Команда)
	
	Если НЕ ПроверитьЗаполнениеШапки() Тогда
		Возврат;
	КонецЕсли;
	
	
	Возврат;
	
КонецПроцедуры

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

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

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

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

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

	//

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

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма);

	//

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

	//
	
	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма);

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
	
	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыПоПериодамЦена.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
	Элемент.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Лево);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<периодическая>'"));

	//

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

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

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

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

	//

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

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

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

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

	//

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

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

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

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

	//

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

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

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

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

	//

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

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

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

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

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

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

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

// СтандартныеПодсистемы.Свойства

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

&НаСервере
Процедура СценарийПриИзмененииСервер()

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

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

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

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

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

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

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

	Возврат ПараметрыВидаПлана;

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

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

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

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

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

&НаКлиенте
Процедура ОповеститьПользователяОЗаполненииДанных()

	ПоказатьОповещениеПользователя(
		НСтр("ru = 'Заполнение данных в документ завершено'"),
		,
		,
		БиблиотекаКартинок.Информация32);

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

&НаСервере
Функция ПолучитьАдресТаблицыПериодов()

	Возврат ПоместитьВоВременноеХранилище(ЭтаФорма.Периоды.Выгрузить(), УникальныйИдентификатор);

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

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

&НаСервере
Процедура ПолучитьЗагруженныеТоварыИзХранилища(АдресТоваровВХранилище, КэшированныеЗначения = Неопределено)
	
	ТоварыИзХранилища = ПолучитьИзВременногоХранилища(АдресТоваровВХранилище);
	ДобавитьТовары(ТоварыИзХранилища, КэшированныеЗначения);
	
КонецПроцедуры

#Область ПроцедурыДинамическогоФормированияСтруктурыФормы

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

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

#Область ПроцедурыОбменаДаннымиМеждуТабличнойЧастьюИТаблицейФормы

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

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

&НаСервере
Функция ПараметрыПреобразованияКроссТаблицы()

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

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

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

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

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

#Область ПодборыИОбработкаПроверкиКоличества

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция НадписьОплата(Календарь, КоличествоЭтаповОплаты)
	
	НадписьОплата = НСтр("ru='Этапов оплаты: %КоличествоЭтаповОплаты%, %Календарь%'");
	НадписьОплата = СтрЗаменить(НадписьОплата, "%Календарь%", ?(ЗначениеЗаполнено(Календарь), НСтр("ru='по рабочим дням'"),НСтр("ru='по календарным дням'")));
	НадписьОплата = СтрЗаменить(НадписьОплата, "%КоличествоЭтаповОплаты%", КоличествоЭтаповОплаты);
	
	Возврат НадписьОплата;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область РаботаСExcel

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

&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиенте(ПрисоединенныйФайл)
	
	СтруктураДействийExcel = СтруктураДействийПриЗагрузкеИзExcel();
	
	РаботаСExcelКлиент.ЗагрузитьИзExcel(ЭтаФорма, ПрисоединенныйФайл, СтруктураДействийExcel);
	
КонецФункции

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

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

&НаКлиенте
Функция СтруктураДействийПриЗагрузкеИзExcel()

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

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

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

#Область РаботаСБуферомОбмена

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

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

&НаСервере
Процедура УстановитьДоступностьКомандБуфераОбмена()
	
	МассивЭлементов = Новый Массив();
	МассивЭлементов.Добавить("ТоварыВставитьСтроки");
	МассивЭлементов.Добавить("ТоварыКонтекстноеМенюВставитьСтроки");
	МассивЭлементов.Добавить("ТоварыПоПериодамВставитьСтроки");
	МассивЭлементов.Добавить("ТоварыПоПериодамКонтекстноеМенюВставитьСтроки");

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

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

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

#Область ПростоеЗаполнение

&НаСервере
Процедура ИнициализироватьНастроекПриЧтенииНаСервере(ДокументОбъект)

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

	ПараметрыИнициализации = Новый Структура();
	ПараметрыИнициализации.Вставить("Форма", ЭтотОбъект);
	ПараметрыИнициализации.Вставить("ПутьКРеквизиту", "Объект.Товары");
	ПараметрыИнициализации.Вставить("ЭлементФормыТаблицы", "Товары");
	ПараметрыИнициализации.Вставить("ЭлементФормыТаблицыПоПериодам", "ТоварыПоПериодам");

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

&НаСервере
Процедура ИнициализироватьСтруктуруНастроек(ДокументОбъект)

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

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

&НаСервере
Процедура ИнициализироватьОперандыФормулы()
	
	МассивОперандов = ПолучитьОперанды(ЭтотОбъект);

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

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

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

&НаКлиенте
Процедура ЗаполнитьПоДефицитам(Команда)
	
	Если НЕ ПроверитьЗаполнениеШапки() Тогда
		Возврат;
	КонецЕсли;
	
	ЗаполнитьПланыПоДефицитуНаСервере(КэшированныеЗначения);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ЗаполнитьДатыЗаказа(Команда)
	ЗаполнитьДатыЗаказаНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьЦены(Команда)
	
	Если НЕ ПроверитьЗаполнениеШапки() Тогда
		Возврат;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

// Параметры:
// 	Форма - ФормаКлиентскогоПриложения - Описание
// Возвращаемое значение:
// 	Массив из см. Планирование.СтруктураПоля - 
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьДопРеквизиты(Форма)

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

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


// Параметры:
// 	Форма - ФормаКлиентскогоПриложения - Описание
// Возвращаемое значение:
// 	Массив из см. Планирование.СтруктураПоля - 
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьОперанды(Форма)

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

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

&НаСервере
Функция ПоместитьДополнительныеПоляВХранилище()
	
	Возврат Планирование.ПоместитьДополнительныеПоляВХранилище(ЭтаФорма, СтруктураНастроек.СмещениеПериода);
	
КонецФункции

&НаСервере
Процедура ДобавитьШаблоныФормулРасчетаПлановогоКоличества(Дерево, ГруппаОператоров)
	
	Сценарий = Планирование.ПараметрыСценария(Объект.Сценарий);
	
	ИспользоватьПланыПродаж 				= ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеПродаж")
		И Сценарий.ИспользоватьВПланированииПродаж;
	ИспользоватьПланыЗакупок 				= ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеЗакупок")
		И Сценарий.ИспользоватьВПланированииЗакупок;
	ИспользоватьСборкиРазрборки 			= ПолучитьФункциональнуюОпцию("ИспользоватьСборкуРазборку");
	ИспользоватьПланыСборки					= ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеСборкиРазборки")
		И Сценарий.ИспользоватьВПланированииСборкиРазборки;
	ИспользоватьПланыОстатков 				= ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеОстатков")
		И Сценарий.ИспользоватьВПланированииОстатков;
	ИспользоватьПланыВнутреннихПотреблений	= ПолучитьФункциональнуюОпцию("ИспользоватьПланированиеВнутреннихПотреблений")
		И Сценарий.ИспользоватьВПланированииВнутреннихПотреблений;
	
	КонструкцияДляВставки = "[ПланыЗакупок] * 1.15";
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'План закупок +15%'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]")
		+ ?(ИспользоватьСборкиРазрборки,
			" + " + ?(ИспользоватьПланыСборки, "[ПланыСборкиКомплектующие]", "[ФактыРазборкиКомплектующие]"), "")
		+ ?(ИспользоватьСборкиРазрборки,
			" + " + ?(ИспользоватьПланыСборки, "[ПланыРазборкиКомплекты]", "[ФактыСборкиКомплекты]"), "")
		+ ?(ИспользоватьПланыОстатков, " - [ПланОстатков]",
			?(ПланированиеПоНазначениям, " - [ФактическиеНачальныеОстатки]", " - [СвободныеОстатки]"));
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Минимальное обеспечение планов'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = "Макс([ФактыЗакупок], [ПланыЗакупок])"
		+ ?(ИспользоватьПланыОстатков, " - [ПланОстатков]",
			?(ПланированиеПоНазначениям, " - [ФактическиеНачальныеОстатки]", " - [СвободныеОстатки]"));
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Закупки прошедшего периода с учетом остатка'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = ?(ИспользоватьПланыОстатков, "?([ПланОстатков] = 0 И ",
		?(ПланированиеПоНазначениям,"?([ФактическиеНачальныеОстатки] = 0 И ","?([СвободныеОстатки] = 0 И "))
		+ ?(ИспользоватьПланыПродаж,"[ПланыПродаж]","[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]") + "> 0, "
		+ ?(ИспользоватьПланыПродаж,"[ПланыПродаж]","[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]") + ", 0)";
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Пополнение остатка'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = "(" + ?(ИспользоватьПланыПродаж, "[ПланыПродаж]","[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]")
		+ ?(ИспользоватьПланыОстатков, " - [ПланОстатков]) * 1.15",
			?(ПланированиеПоНазначениям, " - [ФактическиеНачальныеОстатки]) * 1.15", " - [СвободныеОстатки]) * 1.15"));
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Продажи за вычетом остатка +15%'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "[ФактыПродаж] / [ДоляДнейНаличияТовараНаОстатках]") + " * 1.15";
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Увеличение продаж прошлых периодов на 15%'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = ?(ИспользоватьПланыПродаж, "[ПланыПродаж]", "0")
		+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплектующие]", "")
		+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплекты]", "")
		+ ?(ИспользоватьПланыВнутреннихПотреблений," + [ПланыВнутреннихПотреблений]","");
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Планы потребностей'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
		+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
		+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "");
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Планы обеспечения'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = ?(ИспользоватьПланыЗакупок, "[ПланыЗакупок]", "0")
		+ ?(ИспользоватьПланыСборки, " + [ПланыСборкиКомплекты]", "")
		+ ?(ИспользоватьПланыСборки, " + [ПланыРазборкиКомплектующие]", "")
		+ ?(ИспользоватьПланыПродаж, " - [ПланыПродаж]", "")
		+ ?(ИспользоватьПланыСборки, " - [ПланыСборкиКомплектующие]", "")
		+ ?(ИспользоватьПланыСборки, " - [ПланыРазборкиКомплекты]", "")
		+ ?(ИспользоватьПланыВнутреннихПотреблений," - [ПланыВнутреннихПотреблений]","");
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Отклонение планов'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
	КонструкцияДляВставки = "ЗначениеКолонки(НомерТекущейКолонки() - 1)";
	Идентификатор = КонструкцияДляВставки;
	Представление = НСтр("ru = 'Значение предыдущей колонки'");
	РаботаСФормулами.ДобавитьОператор(ГруппаОператоров, Идентификатор, КонструкцияДляВставки, Представление);
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьФормулуИЗаполнить(Настройки, ДополнительныеПараметры) Экспорт

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьПериодЗапроса(ПараметрыЗапроса)

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ДополнительныеНастройки(СтруктураНастроек, ДополнительныеПоля = Неопределено)
	
	Если НЕ ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
		
		СтруктураНастроек = Новый Структура();
		СтруктураНастроек.Вставить("ВариантЗаполненияСостава", "Отбор");
		
		СтруктураНастроек.Вставить("ВариантСмещения", "ПредыдущийПериод");
		СтруктураНастроек.Вставить("СмещениеПериода", -1);
		
		СтруктураНастроек.Вставить("ВариантЗаполненияЦен", "ЦеныНоменклатуры");
		СтруктураНастроек.Вставить("ВидЦены",);
		СтруктураНастроек.Вставить("ИспользоватьВидЦены", Ложь);
		
		СтруктураНастроек.Вставить("Формула","[ПланыЗакупок] * (1.5)");
		СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru = 'Увеличение планов закупок прошлых периодов на 15%'"));
		
		СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
		
	Иначе
		Если СтруктураНастроек.Свойство("Смещение") Тогда
			СтруктураНастроек.Вставить("СмещениеПериода", -1 * СтруктураНастроек.Смещение);
			СтруктураНастроек.Удалить("Смещение");
		КонецЕсли; 
		
		Если СтруктураНастроек.Свойство("ВариантЗаполненияЦен") И СтруктураНастроек.ВариантЗаполненияЦен = "ВидЦены" Тогда
			СтруктураНастроек.Вставить("ВариантЗаполненияЦен", "ЦеныНоменклатуры");
		КонецЕсли;
		Если СтруктураНастроек.Свойство("ВариантЗаполненияЦен") И СтруктураНастроек.ВариантЗаполненияЦен = "Соглашение" Тогда
			СтруктураНастроек.Вставить("ВариантЗаполненияЦен", "ЦеныНоменклатурыПоставщиков");
		КонецЕсли;
		
		ДополнительныеПараметры = Новый Структура("НеВыводитьСообщения", Истина);
		
		Если ДополнительныеПоля <>  Неопределено Тогда
			МассивОперандов = Новый Массив;
			Для Каждого ТекСтрока Из ДополнительныеПоля Цикл
				
				МассивОперандов.Добавить(ТекСтрока.Идентификатор);
				
			КонецЦикла;
			
			ТипРезультата = Новый ОписаниеТипов("Число");
			#Если Клиент Тогда
				ПараметрыПроверки = РаботаСФормуламиКлиент.ПараметрыПроверкиФормулы();
				ПараметрыПроверки.НеВыводитьСообщения = Истина;
				РаботаСФормуламиПроверитьФормулу = РаботаСФормуламиКлиент.ПроверитьФормулу(СтруктураНастроек.Формула,
					МассивОперандов, ТипРезультата, ПараметрыПроверки);
			#Иначе
				ПараметрыПроверки = РаботаСФормулами.ПараметрыПроверкиФормулы();
				ПараметрыПроверки.НеВыводитьСообщения = Истина;
				РаботаСФормуламиПроверитьФормулу = РаботаСФормулами.ПроверитьФормулу(СтруктураНастроек.Формула,
					МассивОперандов, ТипРезультата, ПараметрыПроверки);
			#КонецЕсли
			
			Если Не РаботаСФормуламиПроверитьФормулу Тогда
			
				СтруктураНастроек.Вставить("Формула","[ПланыЗакупок] * 1.15");
				СтруктураНастроек.Вставить("ФормулаПредставление",НСтр("ru='Увеличение планов закупок прошлых периодов на 15%'"));
				СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
				
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если Не СтруктураНастроек.Свойство("ФильтроватьНезаполненныеСтроки") Тогда
		СтруктураНастроек.Вставить("ФильтроватьНезаполненныеСтроки", Ложь);
	КонецЕсли;
	
	Возврат СтруктураНастроек;
	
КонецФункции

&НаСервере
Процедура ЗаписатьДополнительныеПараметры(ДокументОбъект)

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ПересчитатьКоличествоУпаковокИСуммуВСтроке(ТекущаяСтрока, КэшированныеЗначения)

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

	#Если Клиент Тогда
		ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
	#Иначе
		ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
	#КонецЕсли
	
КонецПроцедуры

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

&НаСервере
Процедура ОбновитьСтруктуруВыводаДопПараметров()

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

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

&НаСервере
Процедура ДобавитьПоляИзДопПараметров(ПараметрыВывода)

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

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

&НаСервере
Процедура ДобавитьРеквизитыИзДопПараметров(СтруктураРеквизитов)

	ДопРеквизиты = ПолучитьДопРеквизиты(ЭтотОбъект);
	
	Для каждого ДопРеквизит Из ДопРеквизиты Цикл
		СтруктураРеквизитов.Вставить(ДопРеквизит.Имя + "_", ДопРеквизит.Имя);
	КонецЦикла; 

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

&НаКлиенте
Процедура ОповеститьПользователяОНачалеЗаполненииДанных()
	
	Состояние(НСтр("ru = 'Выполняется заполнение данных в документ'"));
	
КонецПроцедуры

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

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

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

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

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

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

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

	Если Форма.Объект.КроссТаблица Тогда
	
		Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Истина;
		Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Ложь;
		
		Форма.Элементы.ГруппаТоварыПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаТоварыКроссТаблица;
	
	Иначе
	
		Форма.Элементы.ФормаПереключитьПериодыВКолонки.Пометка = Ложь;
		Форма.Элементы.ФормаПереключитьПериодыВСтроки.Пометка = Истина;
		
		Форма.Элементы.ГруппаТоварыПредставления.ТекущаяСтраница = Форма.Элементы.ГруппаТоварыТаблица;
		
		Форма.ИтогоПоСтрокеКолонке = "";
		
	КонецЕсли; 

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

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

	Если Форма.Объект.КроссТаблица Тогда
	
		Форма.ТоварыКоличествоСтрок = Форма.ТоварыПоПериодам.Количество();
	
	Иначе
	
		Форма.ТоварыКоличествоСтрок = Форма.Объект.Товары.Количество();
	
	КонецЕсли; 

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

&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыВидаПлана(Форма)

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

&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыОтбора(Форма)

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

#Область ЗаполнениеВФоне

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

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

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

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

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

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

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

&НаСервере
Процедура ПодготовитьПараметрыЗаполненияДокументаПоПравилуЗаполнения(ПараметрыЗадания, КэшированныеЗначения)

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ТоварыКомментарийПриИзменении(Элемент)
	
	Элементы.Товары.ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(Элементы.Товары.ТекущиеДанные.Комментарий);
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПланОплатыКомментарийПриИзменении(Элемент)
	
	Элементы.ПланОплаты.ТекущиеДанные.КартинкаКомментарий = ЗначениеЗаполнено(Элементы.ПланОплаты.ТекущиеДанные.Комментарий);
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПланаОплаты()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ЗамещениеПланов

&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыЗамещения(Знач Объект)

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

&НаСервере
Процедура ОбновитьПризнакЗамещения(ТолькоПланОплат = Ложь)

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

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

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

&НаСервереБезКонтекста
Функция КонтрольЗамещенияПланаНаСервере(Ссылка)
	
	Возврат Планирование.КонтрольЗамещенияПлана(Ссылка);
	
КонецФункции

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

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

#Область КорректировкиПлановыхПотребностей

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

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

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

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

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

#Область КорректировкиОбеспечения

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПоказатьСтрокиКорректировок(Команда)
	
	Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("ЗаданИнтервалПотребности", Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьВсе(Команда)
	
	Элементы.Товары.ОтборСтрок = Неопределено;
	
КонецПроцедуры

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

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


#Область ЗагрузкаДанныхИзФайла

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

&НаКлиенте
Процедура ПоказатьФормуЗагрузкиИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
	
	Если АдресЗагруженныхДанных = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗагрузитьИзФайлаНаСервере(АдресЗагруженныхДанных, ДополнительныеПараметры);
	
КонецПроцедуры

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

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

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

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