Имя: Пароль:
1C
1С v8
Вывод результат запроса как дерево значений на обычную форму
,
0 Wefast
 
14.10.15
11:37
Создал на форме деревозначений.

Процедура КнопкаВыполнитьНажатие(Кнопка)


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

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

ОбойтиСтроки(Дерево.Строки);
    //Дерево.Строки.Удалить(0);
    Дерево.Колонки.Удалить(0);
    Дерево.Колонки.Удалить(0);
    ТабличноеПоле1 = Дерево;
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

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

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

Вот что получается:
http://i.imgur.com/nE7fXer.png

Последний уровень раскрывает сам себя. Мне этого не нужно.
Если играться с Итогами в запросе, выставляя либо одну из группировок как Только Иерархия то меняется компоновка, но обязательно задваивается либо последняя группировка, либо конечный элемент.

Первая строка кстати тоже не понятно откуда берется, там полный перечень группировок справочников из которых состоят данные. Но она вроде нормально удаляется Дерево.Строки.Удалить(0);

В общем как мне получить правильно дерево значений?
1 vicof
 
14.10.15
11:39
Отладчиком по дереву пройтись не предлагать?
2 Wefast
 
14.10.15
12:41
(1) Ну и что мне с этим делать. В процедуре рекурсивной идет обход всех строк. Вроде как я могу выловить строку которая последняя:
СтрокаДерева.Строки.Количество() = 0
Значит эта последний уровень.
Я решил сделать так

Если СтрокаДерева.Строки.Количество() = 0 Тогда
                СтрокаДерева.Родитель.Строки.Удалить(0);
            КонецЕсли;

Т.е. обратиться на уровень выше и удалить строку, тем самым сделав предыдущий уровень последним.
Но он выдает ошибку так как я видимо нарушил цикл и он пытается обойти дальше то чего уже нет. Или я даже не знаю.
3 vicof
 
14.10.15
12:49
ТаблицаФормы.Свернуть (FormTable.Collapse)
ТаблицаФормы (FormTable)
Свернуть (Collapse)
Синтаксис:

Свернуть(<Строка>)
Параметры:

<Строка> (обязательный)

Тип: Произвольный.
Идентификатор строки таблицы.
Описание:

Сворачивает узел в указанной строке дерева.

Доступность:

Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).
4 Wefast
 
14.10.15
13:00
(3) не для КоллекцияСтрокДереваЗначений и не для СтрокаДереваЗначений нет такого метода
5 vicof
 
14.10.15
13:08
(4) И чо?
6 Wefast
 
14.10.15
14:02
(5) что значит и что? У меня дерево значений. А метод свернуть для таблицы значений
7 Wefast
 
14.10.15
14:20
В общем нашел решение.

Сделал так:

            Если СтрокаДерева.Строки.Количество() = 0 Тогда
                СтрокаДерева.Родитель.Строки.Очистить();
                Возврат;
            КонецЕсли
8 Wefast
 
14.10.15
14:21
Но теперь мне нужно данные разбить по месецам.
Как в отчете когда делаешь таблицу и выводишь данные разбивая на месяцы. Не представляю как это сделать.
9 Михаил Козлов
 
14.10.15
14:30
(8) Месяцы в колонках или в строках?
Если в строках, то делайте итоги по месяцам. Если в колонках, то это более трудоемко.
10 Eugene_life
 
14.10.15
14:31
(8) Либо в дереве делаешь группировку по периодам, либо в таблицу добавляешь колонку с периодом и группируешь ее, либо любимый запрос в цикле - по месяцам.
11 Wefast
 
14.10.15
14:35
(9) (10) колонки нужно. Запрос в цикле это вроде вообще не круто
12 Wefast
 
14.10.15
14:37
я добавил в запросе
|    МЕСЯЦ(КА_ОборотыБюджетовФОТ.Период) КАК Поле1

Сгруппировал по нему
В итоге они у меня строками стали и добавилась колонца с номером месяца.
Мне бы нормальные колонки на случай если будет период выбрать в несколько лет , ну что бы колнка была Январь, 2015
13 Eugene_life
 
14.10.15
14:41
(11) Тебе шашечки или ехать? Если у тебя цикл по месяцам (т.е. максимальное количество запросов = 12), то я бы не парился, и сделал запрос в цикле, и закончил задачу. Вот когда речь идет о цикле с количеством шагов > 100 или вообще неопределенным, тогда есть смысл все пихать в запрос.
14 Wefast
 
14.10.15
14:49
(13) ладно. Способ мне особо приятен. Но все же.
У меня на форму будет указан период. Я вычисляю все "маленькие" периоды, т.е. месяцы.
И делаю столько итераций сколько этих месяцев наберется.

На выходе запроса у меня какое то не обработанное дерево есть. Как мне потом собрать данные с каждой итерации в одну таблицу?

Если бы у меня были данные по каждой позиции дерева на каждый месяц я бы просто копировал бы колонки с каждой итерации и прицеплял бы их к итоговому дереву.

Но если в первом месяце дерево будет из пары строк, во втором - из 20 то как мне их присоединить?
15 Eugene_life
 
14.10.15
15:09
(14) Тебе придется создать новое дерево (итоговое) и в него собирать свои отдельные деревья. Другого способа я не вижу.
Или иди другим путем: сначала строй не деревья, а таблицу, а потом по таблице постой дерево так, как тебе нужно.
16 Wefast
 
15.10.15
10:50
В общем сделал так.
Определил сколько у меня будет колонок, путем подсчета кол-ва месяцев.
Сформировал уникальные строки для добавления в запрос
    Кол = 1;
    Текст = "    ВЫРАЗИТЬ(0 КАК Число(10,0)) КАК Кол"+Месяц(Дата1)+"_"+СтрЗаменить(Год(Дата1),Символы.НПП,"")+",";

    Пока Дата1 < Дата2 Цикл
        Дата1 = ДобавитьМесяц(Дата1,1);
        Кол = Кол+1;
        Текст = Текст +Символы.ПС + "    ВЫРАЗИТЬ(0 КАК Число(10,0)) КАК Кол"+Месяц(Дата1)+"_"+СтрЗаменить(Год(Дата1),Символы.НПП,"")+",";
    КонецЦикла;
    
    Текст = Лев(Текст,СтрДлина(Текст)-1);


С помощью конкатенации в запрос добавил эти строки.

Когда перебираю дерево значений определяю что это последний уровень(период) и соответственно присваиваю значение нужной колонке на уровень выше.
На последней итерации этого уровня удаляю все строки последнего уровня.
        ИначеЕсли ЗначениеЗаполнено(СтрокаДерева.Период) Тогда
            
            СтрокаДерева.ОбщаяКолонка = Строка(СтрокаДерева.Период);
            СтрокаДерева.Родитель["Кол"+Месяц(СтрокаДерева.Период)+"_"+СтрЗаменить(Год(СтрокаДерева.Период),Символы.НПП,"")] = СтрокаДерева.СуммаУпр;
            ОбойтиСтроки(СтрокаДерева.Строки);
            Если Сч = СтрокаДерева.Родитель.Строки.Количество()-1 Тогда
                СтрокаДерева.Родитель.Строки.Очистить();
                Возврат;
            КонецЕсли;
            Сч = Сч +1;
        КонецЕсли;

Потом удаляю лишние колонки и вот оно мое дерево.
17 Wefast
 
15.10.15
10:51
Остается вопрос как мне теперь просуммировать числовые значения до верхнего уровня. Есть какой то легкий способ