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

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

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


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

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

#КонецЕсли

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

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

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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

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

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

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

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

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

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

Функция ТекущаяВерсияШаблоновСКД() Экспорт 

	Возврат 2;

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

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

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

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

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

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

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

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

// В процедуре вызываются обработчики результат полученного из компоновки
Процедура ПослеВыборкиДанных(ТаблицаРезультата, ПараметрыИсточникаДанных, ПользовательскиеНастройки, ДополнительныеПараметры, КомпоновщикНастроекКомпоновкиДанных)
	
	Обработки.ИсточникиДанныхПланирования.ПослеВыборкиДанных(ТаблицаРезультата, ПараметрыИсточникаДанных, ПользовательскиеНастройки, ДополнительныеПараметры, КомпоновщикНастроекКомпоновкиДанных);
	
КонецПроцедуры

#Область ОбновлениеИнформационнойБазы

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


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

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

#КонецЕсли

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