Имя: Пароль:
1C
1C 7.7
v7: неправильный вывод иерархии элементов (ВыполнитьЗапрос())
0 furia
 
20.02.14
15:52
Привет. почему один элемент справочника выходит не в той группе. т.е. есть группа, ее уровень 3, в ней есть элементы, так же в этой группе есть еще одна группа, которая содержит тоже элементы (т.е. в ней уже элементы уровнем 4). так вот один из элементов у которого уровень 3, выходит после группы с элементами у которых уровень 4...
ставлю к наименованию, Ит.Субконтов(2).Родитель+ " "+Ит.Субконто(2).Уровень(). показывает все правильно т.е. "Родитель" группа правильная, и уровень 3, но порядок не тот...

-Группа1
   -Эл1
   -Эл2
   -Эл3
   -Группа2
     -Эл1
     -Эл2
   -Эл4

вот такая примерно схема.

в запросе все нормально. не пойму в чем проблема...
[spoiler]
    Если Склад.Выбран()=1 Тогда      
        Ит.ИспользоватьСубконто(ВидыСубконто.Склады,Склад,2,1);
    Иначе
        Ит.ИспользоватьСубконто(ВидыСубконто.Склады,,1);
    КонецЕсли;  
    
    Если Товар.Выбран()=1 Тогда      
        Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,Товар,1,1);
    Иначе
        Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,,1,1);
    КонецЕсли;
    Если Склад.Парт = Перечисление.ДаНет.Да Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.Партии,,1);
    КонецЕсли;
    Если Заб = 1 Тогда  
        Если Вид = 1 Тогда
            Ит.ВыполнитьЗапрос(Дата1,Дата2,СчетПоКоду("Скл"));  
        Иначе
            Ит.ВыполнитьЗапрос(,Дата2,СчетПоКоду("Скл"));  
        КонецЕсли;
    ИначеЕсли Склад.Магазин = 1 Тогда
        Если Вид = 1 Тогда
            Ит.ВыполнитьЗапрос(Дата1,Дата2,Склад.Счет);  
        Иначе
            Ит.ВыполнитьЗапрос(,Дата2,Склад.Счет);  
        КонецЕсли;
    Иначе    
        Если Вид = 1 Тогда
            Ит.ВыполнитьЗапрос(Дата1,Дата2);  
        Иначе
            Ит.ВыполнитьЗапрос(,Дата2);  
        КонецЕсли;
    КонецЕсли;
    // перебираем субконто  
    Ит.ВыбратьСубконто(1);
    Пока Ит.ПолучитьСубконто(1)=1 Цикл
        Расшифровка.Установить("Субконто",Ит.Субконто(1));
        Т.ВывестиСекцию("Секция_9");
        // считаем итоги
        СНД = СНД + Ит.СНД()-Ит.СНК();
        СКД = СКД + Ит.СКД()-Ит.СКК();
        ДО = ДО + Ит.ДО();
        КО = КО + Ит.КО();
        Ит.ВыбратьСубконто(2);
        Пока Ит.ПолучитьСубконто(2)=1 Цикл
            Если Ит.Субконто(2).ЭтоГруппа()=0 Тогда
                СНДКол = СНДКол + Ит.СНД(3)-Ит.СНК(3);
                СКДКол = СКДКол + Ит.СКД(3)-Ит.СКК(3);
                ДОКол = ДОКол + Ит.ДО(3);
                КОКол = КОКол + Ит.КО(3);
            КонецЕсли;
            Субконто=Строка(Ит.Субконто(2));
            Расшифровка.Установить("Субконто1",Ит.Субконто(2));
            // выводим в случае если есть нач. остаток или был приход или расход
            Если ((Ит.СНД(3)-Ит.СНК(3))<>0) или (Ит.ДО(3)+Ит.КО(3)<>0)
            или ((Ит.СНД()-Ит.СНК())<>0) или (Ит.ДО()+Ит.КО()<>0) Тогда
                Если Ит.Субконто(2).ЭтоГруппа()=1 Тогда  
                    Отступ = Ит.Субконто(2).Уровень();
                    Текст = "";
                    Для i=1 По Отступ Цикл
                        Текст = Текст + "  ";
                    КонецЦикла;
                    Текст = Текст + СокрЛП(Ит.ПредставлениеСубконто(2));
                    Т.ВывестиСекцию("Группа");
                    Продолжить;
                КонецЕсли;
            КонецЕсли;
            Ном = Ном +1;
            Состояние("Обработано "+Ном + " записей справочника Номенклатура");  
            // непартийный учет
            Если Ит.Субконто(1).Парт = Перечисление.ДаНет.Нет Тогда
                Если ((Ит.СНД(3)-Ит.СНК(3))<>0) или (Ит.ДО(3)<>0) или (Ит.КО(3)<>0)
                или ((Ит.СКД()-Ит.СКК())<>0) или (Ит.ДО()<>0) или (Ит.КО()<>0) Тогда  
                    // все что было и приходило в итоге ушло
                    Если (Ит.СКД(3)-Ит.СКК(3)) = 0 Тогда
                        Если (Ит.СНД(3)-Ит.СКК(3)<>0) Или (Ит.ДО(3)<>0) Тогда
                            Если (Ит.СНД(3)-Ит.СКК(3)<>0) и (Ит.ДО(3) = 0) Тогда
                                Цена = (Ит.СНД()-Ит.СНК())/(Ит.СНД(3)-Ит.СНК(3));
                            ИначеЕсли  (Ит.СНД(3)-Ит.СКК(3) = 0) и (Ит.ДО(3) <> 0) Тогда
                                Цена = Ит.ДО()/Ит.ДО(3);
                            КонецЕсли;
                        КонецЕсли;
                        // что-то осталось    
                    ИначеЕсли (Ит.СКД(3)-Ит.СКК(3))<>0 Тогда
                        Цена = (Ит.СКД()-Ит.СКК())/(Ит.СКД(3)-Ит.СКК(3));
                    КонецЕсли;  
                    ЕдИзм = Ит.Субконто(2).ЕдИзм;
                    Отступ = Ит.Субконто(2).Уровень();
                    Текст = "";
                    Для i=1 По Отступ Цикл
                        Текст = Текст + "  ";
                    КонецЦикла;
                    Текст = Текст + СокрЛП(Ит.ПредставлениеСубконто(2)); // + " "+Ит.Субконто(2).Родитель+" "+Ит.Субконто(2).Уровень()
                    Т.ВывестиСекцию("Секция_8");
                    Если Режим = "Подробно" Тогда
                        Подробно(Ит.Субконто(2),"");
                    КонецЕсли;  
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
[/spoiler]
1 KishMish
 
20.02.14
16:07
Потому-что, вывод так и работает
Уровень 3, вывод группы и все что в нее входит,
и потом продолжается вывод элементов 3 уровня

а ты как предлагаешь сделать?
2 furia
 
20.02.14
16:11
обычно выводятся все элементы, после уже группы. или нет ?
3 KishMish
 
20.02.14
16:22
ну да,
в таком порядке

группа уровень 3
Элементы из группы 3 (уровень 4)
Элементы уровня 3(продолжение)