Норматив распределения планов продаж по категориям / Модуль менеджера

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

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

#Область Проведение

// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
//              регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("ПланированиеЗапасов");
	
КонецПроцедуры

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

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

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

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.КомандыСозданияНаОсновании
//  Параметры - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.Параметры
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	БизнесПроцессы.Задание.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
	
КонецПроцедуры

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

		Возврат КомандаСоздатьНаОсновании;
	КонецЕсли;

	Возврат Неопределено;
КонецФункции

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
	
	
КонецПроцедуры

// Возвращает структуру реквизитов по которым можно вводить нормативы распределения,
// учитывает значения функциональных опций.
//
// Параметры:
//  УчитыватьФункциональныеОпции  - Булево - Если Истина, вернет список с учетом ФО
//                 Если Ложь, вернет полный список реквизитов.
//
// Возвращаемое значение:
//   Структура   - Структура реквизитов по которым можно вводить нормативы.
//
Функция ПолучитьРеквизитыДляНормативов(УчитыватьФункциональныеОпции = Истина) Экспорт

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

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

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

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

	РезультатЗапроса = Запрос.Выполнить();

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

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

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

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

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

	ТаблицаЗначений = РезультатЗапроса.Выгрузить();
	
	Нормативы.Загрузить(ТаблицаЗначений);

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

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

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

	ТаблицаЗначений = РезультатЗапроса.Выгрузить();
	
	Нормативы.Загрузить(ТаблицаЗначений);

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

// Возвращает вариант заполнения значений норматива для реквизита
//
// Параметры:
//  ТоварнаяКатегория  - СправочникСсылка.ТоварныеКатегории - Товарная категория в разрезе которой получаем свойства
//  Реквизит  - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения, Строка - Реквизит, для которого
//                                                                                      определяется вариант.
//
// Возвращаемое значение:
//  Число - Значение "0" для реквизита номенклатуры, "1" для доп.реквизита номенклатуры, "2" для
//          доп.реквизита характеристики.
//
Функция ВариантЗаполнения(ТоварнаяКатегория, Реквизит) Экспорт

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

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

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

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

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

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

	РезультатЗапроса = Запрос.Выполнить();
	
	ТаблицаНормативов = РезультатЗапроса.Выгрузить();
	
	МенеджерВременныхТаблиц.Закрыть();
	
	Возврат ТаблицаНормативов;

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

////////////////////////////////////////////////////////////////////////////////
// Интерфейс для работы с подсистемой Загрузка из файла.

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

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

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

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

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

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

#Область Проведение

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

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

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

// Заполняет список команд печати.
//
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	Возврат; // Заглушка
	
КонецПроцедуры

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

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

#КонецЕсли

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