Имя: Пароль:
1C
1С v8
Запрос для работы с иерархическим справочником
0 tg30000
 
14.10.11
09:46
Сделал запрос к иерархическому справочнику , например "Склады"
Запрос работает, но получается что в справочнике есть и группы  и элементы...
Так вот : Группа=>Элемент все вроде нормально выводит ,но в последней группе например 3 элемента всего ,он их выводит, а элементы без груп помещает ниже и получается вузуально в последней группе не 3 и 3+количество элементов не входящих ни в одну группу..
подскажите как можно это оформить удобнее?
Текст запроса ниже...

&НаСервереБезКонтекста
Процедура  ПолучитьДанныеСправочника(ТабДок);
   
   ТабДок.Очистить();
   
   Запрос =Новый Запрос;
   ТекстЗапроса =    
   "ВЫБРАТЬ
   |    Склады.Код,
   |    Склады.Наименование,
   |    Склады.ЭтоГруппа
   |ИЗ
   |    Справочник.Склады КАК Склады
   |
   |УПОРЯДОЧИТЬ ПО
   |Склады.ЭтоГруппа ИЕРАРХИЯ,
   |Наименование";
   
       

   Запрос.Текст = ТекстЗапроса;
   Выборка = Запрос.Выполнить().Выбрать();
   
   Макет = Отчеты.ПолучениеДанныхСправочников.ПолучитьМакет("Макет");
   ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
   ОбластьГруппа = Макет.ПолучитьОбласть("Группа");
   ОбластьЭлемент = Макет.ПолучитьОбласть("Элемент");
   
   ТабДок.Вывести(ОбластьШапка);
   
       
   Пока Выборка.Следующий() Цикл
       Если Выборка.ЭтоГруппа Тогда
           Обл= ОбластьГруппа;
       Иначе
           Обл= ОбластьЭлемент;
       КонецЕсли;
       
       Обл.Параметры.Заполнить(Выборка);
       ТабДок.Вывести(Обл);

   КонецЦикла;
   
КонецПроцедуры
1 mikecool
 
14.10.11
09:52
нафига было группы создавать? имхо - правильнее подчинение элементам
2 tg30000
 
14.10.11
09:54
(1) в смысле зачем пользователи создавали группы? Если об этом, то так было сделано давно, а сейчас нужно сделать отчет, вот и встал вопрос.
Или я что неправильно в коде написал?
3 catena
 
14.10.11
10:00
(0)"как можно это оформить удобнее"
Выводить с уровнями?
4 tg30000
 
14.10.11
10:02
(3) Ну как сделать что бы отдельно вывести те элементы справочника ,которые не входят ни в одну группу , а просто в корневом каталоге находятся. А то сейчас она выводятся прямо тиже элементов последней группы, и кажется что в этой последней группе много элементов, хотя по факту их там к примеру 3. Я об этом.
5 tg30000
 
14.10.11
10:05
Ну сейчас так:

Группа№1
1
2
3
Группа№2
1
2
3
стол
стул


Где "стол,стул" элементы не входящие в группы, как их отделить ? например так:

Группа№1
1
2
3
Группа№2
1
2
3


стол
стул
6 tg30000
 
14.10.11
10:06
ну что бы пользователь визуально видел что они не относятся к группе №2 ?
7 tg30000
 
14.10.11
10:08
В скд можно сделать, но хочется понять, как без СКД сделать..
8 Cube
 
14.10.11
10:10
(7) Тебя научить отступ делать в макете что-ли?
9 tg30000
 
14.10.11
10:15
(8) чем отступ поможет, если выводятся элементы? Может я что не так понимаю конечно, но все же..
10 tg30000
 
14.10.11
10:18
(8)

Шапка    =>
Группа   => код //наименование
Элемент  => код //наименование

Гда там отступишь?
11 Cube
 
14.10.11
10:21
12 tg30000
 
14.10.11
10:23
(11)Нет так не получится, смысл то в том что отступятся и элементы в самой последней группе и опять будут сливаться....
13 tg30000
 
14.10.11
10:26
получается сейчас у меня так...
Группа№1
 1
 2
 3
...............
ПоследняяГруппа
 1
 2
 3
 Стол
 Стул

Где "стол,стул" элементы не входящие в группы..!
14 catena
 
14.10.11
10:28
ТабДок.Вывести(Обл, Выборка.Уровень());
+ автогруппировка строк в 8.2 не работают?
15 tg30000
 
14.10.11
10:29
(14) Попробую,спасибо!
16 tg30000
 
14.10.11
10:37
(14)
Что-то без зменений...
ТабДок.Вывести(Обл, Выборка.Уровень());
17 catena
 
14.10.11
10:39
(16)    ТабДок.НачатьАвтогруппировкуСтрок();
   ТабДок.ЗакончитьАвтогруппировкуСтрок();
не забыл?
18 catena
 
14.10.11
10:40
первое совсем перед выводом, второе совсем после вывода всего табдока.
19 tg30000
 
14.10.11
10:40
(17) Попробую)
20 Cube
 
14.10.11
10:43
(16) Что, совсем не жуётся? Ну давай я пожую:

Из синтаксис-помощника:


ТабличныйДокумент (SpreadsheetDocument)
Вывести (Put)
Синтаксис:

Вывести(<Таблица>, <Уровень>, <ИмяГруппы>, <Открыта>)
Параметры:

<Таблица> (обязательный)

Тип: ТабличныйДокумент; ПолеТабличногоДокумента. Выводимая таблица.
<Уровень> (необязательный)

Тип: Число. Уровень используется для автоматической группировки строк табличного документа. Соседние строки с одинаковым уровнем будут отнесены к одной группе. Строки с минимальным уровнем в группу не объединяются.
<ИмяГруппы> (необязательный)

Тип: Строка. Название группы, к которой относятся выводимые строки.
Значение по умолчанию: Пустая строка
<Открыта> (необязательный)

Тип: Булево. Истина - выведенная группа будет открыта, Ложь - группа будет выведена в свернутом виде.
Значение по умолчанию: Истина
Возвращаемое значение:

Тип: ОбластьЯчеекТабличногоДокумента. Область, в которую был осуществлен вывод.
Описание:

Выводит табличный документ в результирующий табличный документ, добавляя его со следующей строки вслед за самой нижней выведенной строкой, начиная с первой колонки.

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

Сервер, толстый клиент, внешнее соединение.
Пример:

ТабДок = Новый ТабличныйДокумент;
Секция = ТабДок.ПолучитьОбласть("R1");
Секция.Область("R1C1").Текст = "Численность сотрудников";
ТабДок.НачатьАвтогруппировкуСтрок();
ТабДок.Вывести(Секция,1,"Группа",Истина);
Итого = 0;
Для Н=1 По 3 Цикл  
   Значение = Н; Итог = 0;  
   Секция.Область("R1C1").Текст = "Отдел "+Н;
   Секция.Область("R1C2").Текст = "";
   ТабДок.Вывести(Секция,2,"Группа 1",Истина);
   Секция.Область("R1C1").Текст = "Группа";
   Секция.Область("R1C2").Текст = "Численность";
   ТабДок.Вывести(Секция,2,"Группа 1",Истина);
   Для К=1 По 10 Цикл
       Секция.Область("R1C1").Текст = "А"+Н+К;
       Секция.Область("R1C2").Текст = Значение;
       ТабДок.Вывести(Секция,3,"Группа 2",Истина);
       Итог = Итог + Значение;
       Значение = Значение + 10;
   КонецЦикла;
   Секция.Область("R1C1").Текст = "Итого"+Н;
   Секция.Область("R1C2").Текст = Итог;
   ТабДок.Вывести(Секция,2,"Группа 1",Истина);
   Секция.Область("R1C1:R1C2").Текст = "";
   ТабДок.Вывести(Секция);
   Итого = Итого + Итог;
КонецЦикла;
Секция.Область("R1C1").Текст = "Всего:";
Секция.Область("R1C2").Текст = Итого;
ТабДок.Вывести(Секция,1,"Группа",Истина);
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.ИтогиСнизу = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Истина;
ТабДок.Показать("Пример использования верт. автогруппировки");
21 tg30000
 
14.10.11
10:46
(18)
(20)
Все сделал.Большое спасибо всем!)
Всем хорошего дня!
22 tg30000
 
14.10.11
13:21
В общем если кому нужно то получилось так...




&НаКлиенте
Процедура Сформировать(Команда)
   ПолучитьДанныеСправочника(ТабДок);
КонецПроцедуры


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