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

файл
// @strict-types

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	//

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

	//

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

	//

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

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

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

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

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

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

	//

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

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

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

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

	//

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

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

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

	//

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

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

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

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

	//

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Параметры:
//  Период - СтандартныйПериод
//  ДополнительныеПараметры - Структура
&НаКлиенте
Процедура УстановитьИнтервалЗавершение(Период, ДополнительныеПараметры) Экспорт 
	ПриИзмененииПериодовНаСервере();
КонецПроцедуры

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

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

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

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

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

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

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

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

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