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