[code] ТекстЗапроса = " |SELECT |спрНомен.ParentID AS ВКодРод, |Выборка.Номен AS [Номенклатура $Справочник.Номенклатура], |Выборка.КоличествоКонОст as КоличествоКонОст, |$ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) as Цена |FROM |(SELECT | Рег.Номенклатура as Номен, | Рег.КоличествоОстаток as КоличествоКонОст |FROM | $РегистрОстатки.ОстаткиТМЦ(:ВыбДата~, | , | , | (Склад,Номенклатура) , (Количество)) as Рег |";
//Обработка условий запроса перв=1; ТаблицаМФ.ВыбратьСтроки(); Пока ТаблицаМФ.ПолучитьСтроку()=1 Цикл Если (ТаблицаМФ.СписокЭлементов.РазмерСписка()>0) и //(ТаблицаМФ.ИмяПеременной=ИмяПеремЗапроса) и (ТаблицаМФ.ФлВкл=2) Тогда Если перв=1 Тогда ТекстЗапроса = ТекстЗапроса+" |WHERE ("; перв=0; Иначе ТекстЗапроса = ТекстЗапроса+" |AND ("; КонецЕсли; СписокСвойств = СоздатьОбъект("СписокЗначений"); ТаблицаМФ.СписокЭлементов.Выгрузить(СписокСвойств); RS.УложитьСписокОбъектов(СписокСвойств, "#Группа"+СоКРЛП(ТаблицаМФ.Вид), СоКРЛП(ТаблицаМФ.Вид)); ТекстЗапроса = ТекстЗапроса+ ТаблицаМФ.ИмяПеременной+" in (SELECT Val FROM #Группа"+СоКРЛП(ТаблицаМФ.Вид)+"))"; КонецЕсли; КонецЦикла; ТекстЗапроса = ТекстЗапроса+ " |)as Выборка |LEFT JOIN | $Справочник.Цены as СпрЦ ON (СпрЦ.ParentExt=Номен) AND | ($СпрЦ.ТипЦен = :ТипЦен) and (СпрЦ.IsMark=0) | |LEFT JOIN | $Справочник.Номенклатура as спрНомен ON (спрНомен.ID=Номен) |"; //(конец)Обработка условий запроса [/code]
вот текст запроса по регистру остатков - ещё раз повторю, что всё работает, но думается, что можно сделать ПРАВИЛЬНЕЕ и ОПТИМАЛЬНЕЕ, единственная здесь проблема, только в том, что по хорошему надо бы чтобы джойн делался только по первому эменту из справочника цен для каждой номенклатуры(т.е. сейчас в случае ниличия двух элементов с одним и тем же типом цен в справочнике цен в запросе получим две строки).
Далее делается второй запрос по справочнику номенклатуры для того, чтобы впоследствии можно было собрать итоги по группам: [code]ТекстЗапроса = " |SELECT | Спр.ID as Вкод, | Спр.ParentID as ВкодРод, | Спр.ID as [Номенклатура $Справочник.Номенклатура] |FROM | $Справочник.Номенклатура as Спр |WHERE | Спр.IsFolder = 1 |"; [/code] Ну и далее получаю суммы по группам: [code] тзГРупп = RS.ВыполнитьИнструкцию(ТекстЗапроса); тзГРуппИнд = СоздатьОбъект("ИндексированнаяТаблица"); тзГРуппИнд.Загрузить(тзГРупп); тзГРуппИнд.ДобавитьИндекс("ВКодИнд","ВКод"); //тзГРуппИнд.ДобавитьИндекс("ВКодИндРод","ВКодРод"); //тзГРуппИнд.ВыбРатьСтроку(); тзГрупп=СоздатьОбъект("ИндексированнаяТаблица"); тзГрупп.НоваяКолонка("Номенклатура"); тзГрупп.НоваяКолонка("КоличествоКонОст"); тзГрупп.НоваяКолонка("ПолноеНаименование"); тзГрупп.НоваяКолонка("ПолныйКод"); //тзГрупп.НоваяКолонка("Цена"); тзГрупп.НоваяКолонка("Сумма"); тзЗапроса.НоваяКолонка("ПолноеНаименование"); тзЗапроса.НоваяКолонка("ПолныйКод"); тзЗапроса.НоваяКолонка("Сумма"); Сообщить("Количество строк - "+тзЗапроса.КоличествоСтрок()); СуммаВсего=0; КоличествоВсего=0; тзЗапроса.ВыбратьСтроки(); Пока тзЗапроса.ПОлучитьСтроку()=1 Цикл Состояние(""+тзЗапроса.НомерСтроки); Если тзЗапроса.КоличествоКонОст<0.001 Тогда Продолжить; КонеЦЕсли; тзЗапроса.ПолноеНаименование=тзЗапроса.Номенклатура.ПОлноеНаименование(); тзЗапроса.ПолныйКод=тзЗапроса.Номенклатура.ПолныйКод(); тзЗапроса.Сумма=тзЗапроса.КоличествоКонОст*тзЗапроса.Цена; КоличествоВсего=КоличествоВсего+тзЗапроса.КоличествоКонОст; СуммаВсего=СуммаВсего+тзЗапроса.Сумма; Если СОКРЛП(тзЗапроса.ВКодРод)<>"0" Тогда тзГРуппИнд.Найтистроку("ВКодИнд",тзЗапроса.ВКодРод,,1); тзГрупп.НоваяСтрока(); тзГрупп.Номенклатура=тзГРуппИнд.Номенклатура; тзГрупп.КоличествоКонОст=тзЗапроса.КоличествоКонОст; тзГрупп.ПолноеНаименование=тзГРуппИнд.Номенклатура.ПолноеНаименование(); тзГрупп.ПолныйКод=тзГРуппИнд.Номенклатура.ПолныйКод(); тзГрупп.Сумма=тзЗапроса.Сумма; Пока СОКРЛП(тзГРуппИнд.ВКодРод)<>"0" Цикл тзГРуппИнд.Найтистроку("ВКодИнд",тзГРуппИнд.ВКодРод,,1); тзГрупп.НоваяСтрока(); тзГрупп.Номенклатура=тзГРуппИнд.Номенклатура; тзГрупп.КоличествоКонОст=тзЗапроса.КоличествоКонОст; тзГрупп.ПолноеНаименование=тзГРуппИнд.Номенклатура.ПолноеНаименование(); тзГрупп.ПолныйКод=тзГРуппИнд.Номенклатура.ПолныйКод(); тзГрупп.Сумма=тзЗапроса.Сумма; КонецЦикла; КонецЕсли; Конеццикла; //тзГрупп.ВыбратьСтроку(); умма");[/code] Может есть более красивый/оптимальный способ?
|