Имя: Пароль:
1C
1С v8
Вывод дерева значений в макет.
0 Lansi
 
19.03.13
15:54
Собственно проблема с выводом дерева значений в макет.
Вот код

   Запрос.Текст = ТекстЗапроса;
   
   Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   //РезультатЗапроса = Запрос.Выполнить();    
   //ТЗОстатки = РезультатЗапроса.Выгрузить();
   ВывестиДерево(мТабДок,Дерево.Строки);


КонецПроцедуры // ОбновитьОтчет()

Процедура ВывестиДерево(мТабДок,ВыводимаяСтрока, Уровень=0)
   //Обходим строки текущего уровня дерева
   Макет = ЭтотОбъект.ПолучитьМакет("Макет");
   Для Каждого СтрДерева Из ВыводимаяСтрока Цикл
           ОбластьСтрока  = Макет.ПолучитьОбласть("Строка");
           ОбластьСтрока.Параметры.Номенклатура = СокрЛП(СтрДерева.Номенклатура.НаименованиеПолное);                        
           мТабДок.Вывести(ОбластьСтрока);

       ВывестиДеревоД(мТабДок,ВыводимаяСтрока);
   КонецЦикла;
КонецПроцедуры

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

   //    ВывестиДеревоД(СтрДерева, Уровень = 1);
   КонецЦикла;
КонецПроцедуры


Проблема в том что первый уровень дерева значений (там где номенклтура) выводится в макет, а вот второй уровень долго думает и в итоге выдает кучу пустых строк. Подскажите пожалуйста что я не так сделал?
1 ДенисЧ
 
19.03.13
15:57
Процедура ВывестиДерево(мТабДок,ВыводимаяСтрока, Уровень=0)
   //Обходим строки текущего уровня дерева

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

       ВывестиДеревоД(мТабДок,СтрДерева ); /////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
   КонецЦикла;
КонецПроцедуры
2 Reset
 
19.03.13
15:59
+ получение макета и областей из него вынести из цикла
+ избавится от запроса в цикле .Номенклатура.НаименованиеПолное
3 Lansi
 
19.03.13
16:02
Проблема в том что когда я пишу вот так
ВывестиДеревоД(мТабДок,СтрДерева ); /////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11

У меня перестает находить поля. (Поле объекта не обнаружено (Контрагент)
           ОбластьСтрокаДоп.Параметры.Контрагент = СтрДерева.Контрагент;)

Вот сам запрос

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


В нем точно есть подчиненные строки потому как когда конструктором выводил там группировки работали.
4 Lansi
 
19.03.13
16:02
Запрос рабочий 100%
5 kiruha
 
19.03.13
17:28
(0)
ВывестиДеревоД(мТабДок,ВыводимаяСтрока);

на

ВывестиДеревоД(мТабДок,СтрДерева.Строки);
6 kiruha
 
19.03.13
17:34
И перестаньте давать несуразные названия и не будет ошибок

ВыводимаяСтрока - СтрокиНоменклатуры
во второй - СтрокиДетальныеЗаписи
..
Для Каждого СтрокаНоменклатуры ИЗ СтрокиНоменклатуры
..
Для Каждого СтрокаДетальнойЗаписи ИЗ СтрокиДетальныеЗаписи
7 Lansi
 
20.03.13
06:25
(6) Спасибо большое, вот так действительно заработало. Жаль тут плюс в репутацию нельзя поставить :)
8 Lansi
 
20.03.13
07:46
Товарищи возник еще один вопрос нужно вывести дополнительные итоги в запросе дописываю

|ИТОГИ
|    СРЕДНЕЕ(КоличествоНачальныйОстаток)
|    СРЕДНЕЕ(КоличествоКонечныйОстаток),
|    СРЕДНЕЕ(Цена)
|ПО
|    Номенклатура";

И вот не могу понять как их вывести в верхний уровень группировки.

ОбластьСтрока.Параметры.СредКолНачОст = СтрНоменклатуры.Среднее(КоличествоНачальныйОстаток);

Если делаю так то ругается на среднее, если в запросе пытаюсь написать
|    СРЕДНЕЕ(КоличествоНачальныйОстаток)как СредКолНачОст

то тоже при запросе ругается.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший