Имя: Пароль:
1C
1C 7.7
v7: Присоединить секцию
0 Zheleznogorsk
 
25.07.12
06:47
Давно не делал подобных отчетов, забыл!
Процедура Сформировать()
   Перем Запрос, ТекстЗапроса, Таб;
   СпДоговор = СоздатьОбъект("СписокЗначений");
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с ВыбНачПериода по ВыбКонПериода;
   |Договор1 = Документ.Поставка.Договор;
   |ТипЭРИ = Документ.Поставка.Группа;
   |ДатаИзготовления = Документ.Поставка.Группа.ДатаИзготовления;
   |КоличествоПН = Документ.Поставка.КоличествоНорма;
   |Контрагент = Документ.Поставка.Договор.Контрагент;
   |Функция КоличествоПНСумма = Сумма(КоличествоПН);
   |Группировка ТипЭРИ;
   |Группировка Договор1;
   |Условие(Контрагент=Контр);
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   // Подготовка к заполнению выходных форм данными запроса
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   // Заполнение полей "Заголовок"
   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
   Пока Запрос.Группировка(1) = 1 Цикл  
       Таб.ВывестиСекцию("Строка|ТипЭРИ");    
       Для А=1 По СпДоговор.РазмерСписка() Цикл
           дог=Запрос.ПолучитьАтрибут("Договор1"+А);
           Таб.ПрисоединитьСекцию("Строка|Договор");
           а=а+1;
       КонецЦикла;
       Таб.ПрисоединитьСекцию("Строка|Договор");
   КонецЦикла;
   // Заполнение полей "Итого"
   //Таб.ВывестиСекцию("Итого");
   // Вывод заполненной формы
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Сформировать", "");
   КонецПроцедуры
Выводит только один договор, не перебирает договоры!
Всем спасибо!
1 Мимохожий Однако
 
25.07.12
06:49
Группировка(2) где?
2 Rie
 
25.07.12
06:50
(0) А по второй группировке - Пушкин цикл крутить будет?
3 Zheleznogorsk
 
25.07.12
06:50
А забыл ее из запроса убрать!
4 Rie
 
25.07.12
06:52
(3) Так а если в запросе не будет группировки по договорам - то о каком переборе оных идёт речь?
5 VladZ
 
25.07.12
06:52
А где?
Пока Запрос.Группировка(2) = 1 Цикл
6 Zheleznogorsk
 
25.07.12
06:53
То есть нужна все таки группировка по договорам!!!
7 Мимохожий Однако
 
25.07.12
06:53
Список значений СпДоговор где заполнялся?
.
выгрузи запрос в ТЗ и посмотри. Может быть, ищешь то, чего нет в результате.
8 VladZ
 
25.07.12
06:57
(6) А ты как сам думаешщь? Выборка сама волшебным образом выберется и тебе покажется?
9 Zheleznogorsk
 
25.07.12
06:57
Если делаю группировку по договорам, то не выводит наименование договора
10 Мимохожий Однако
 
25.07.12
06:59
А еще отладчик есть...
11 Fenikus
 
25.07.12
07:00
дог=Запрос.ПолучитьАтрибут("Договор1"+А);

не логично выглядит, после сложения получится "Договор11"
12 VladZ
 
25.07.12
07:00
(9) Злые силы...
13 Zheleznogorsk
 
25.07.12
07:02
Злые,злые...
14 Zheleznogorsk
 
25.07.12
07:05
"дог=Запрос.ПолучитьАтрибут("Договор1"+А);

не логично выглядит, после сложения получится "Договор11"
Хм...а как логично будет!?
15 Fenikus
 
25.07.12
07:07
(14) Видимо дог=Запрос.ПолучитьАтрибут("Договор"+А);
16 Rie
 
25.07.12
07:07
(14) А что ты хочешь получить в переменной дог?
17 Fenikus
 
25.07.12
07:07
И то, только для первой итерации, а потом опять хрень получится :)
18 Zheleznogorsk
 
25.07.12
07:09
Хрень и получилась! :)
19 Fenikus
 
25.07.12
07:12
(18)Так попробуй
   Пока Запрос.Группировка(1) = 1 Цикл  
       Таб.ВывестиСекцию("Строка|ТипЭРИ");    
       Пока Запрос.Группировка(2) = 1 Цикл
           дог=Запрос.Договор1;
           Таб.ПрисоединитьСекцию("Строка|Договор");
       КонецЦикла;
   КонецЦикла;
20 VladZ
 
25.07.12
07:14
Итак... Начнем с самого начала...
Исходим из предположения, что твой мега отчет будет жить и развиваться. Так что, пытаемся его изначально сделать "красиво".

Пункт нумер раз: не стоит в одну процедуру лепить все действия. Для того, чтобы было все просто и понятно, лучше разделить по функционалу.
В твоем отчете есть:
1. получение данные.
2. вывод полученных данных в нужном виде.

Вот из этого и исходим. Прикинем структуру кода.

Функция ПолучитьДанные()
КонецФункции

Процедура ВывестиОтчет(аТЗ)
КонецПроцедуры

Процедура Сформировать()
// тут обычно всякие проверки на правильность ввода инфы
 ТЗДанных = ПолучитьДанные()
 ВывестиДанные(ТЗДанных);

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

В таком виде все становится проще и понятнее. И если возникнет необходимость доработать какую-то часть (например, переписать получение данных на примые запросы) - достаточно изменить одну функцию.
21 Мимохожий Однако
 
25.07.12
07:14
Повторюсь..
выгрузи запрос в ТЗ и посмотри.
включи отладчик и посмотри.
22 Fenikus
 
25.07.12
07:15
(18)Можно еще так:

   Пока Запрос.Группировка(1) = 1 Цикл  
       Таб.ВывестиСекцию("Строка|ТипЭРИ");    
       Для А=1 По СпДоговор.РазмерСписка() Цикл
           дог=спДоговор.ПолучитьЗначение(А);
           Таб.ПрисоединитьСекцию("Строка|Договор");
       КонецЦикла;
   КонецЦикла;

Кстати, в цикле Для А=1 По... увеличение переменной на единицу происходит автоматом, вручную не стоит этого делать, а то перескакивать будешь через один элемент.
23 VladZ
 
25.07.12
07:16
Теперь рассмотрим по функциям...

Функция ПолучитьДанные()

// получаем запросом

// выгружаем в ТЗ

// возвращаем ТЗ.

КонецФункции
24 VladZ
 
25.07.12
07:21
+23 Расписывать не буду, тут все легко.
Самое интересное в процедуре вывода..

Процедура ВывестиОтчет(Знач аТЗ)
// выгружаем договора в отдельную ТЗ

// выгружаем ТипЭРИ в отдельную ТЗ.

// обязательное условие: таблицы должны быть отсортированы
// сортируем аТЗ по "ТипЭРИ, Договор"
// сортируем ТЗДоговоров по "Договор".
// сортируем ТЗТипов по "ТипЭРИ".

// выводим в таблицу, используя для строк выборку из ТЗТипов, для колонок из ТЗДоговоров

КонецПроцедуры
25 Fenikus
 
25.07.12
07:25
(24) А зачем две ТЗ? Можно и с одной все сделать чудненько
26 Zheleznogorsk
 
25.07.12
07:25
Если не трудно можете расписать!?
27 Fenikus
 
25.07.12
07:26
(26)по-моему и так все подробно расписано :)
28 Zheleznogorsk
 
25.07.12
07:27
Давно 7-ку не поднимал,а теперь необходимо!
29 Мимохожий Однако
 
25.07.12
07:27
(24)ОФФ: Ты попал )))
30 VladZ
 
25.07.12
07:27
Да, вот это можно не делать
// выгружаем ТипЭРИ в отдельную ТЗ.
31 VladZ
 
25.07.12
07:28
(29) Посмотрим. :)
32 VladZ
 
25.07.12
07:28
(26) Не... Дальше - сам ковыряй... Я тебе и так все по полочкам разложил.
33 VladZ
 
25.07.12
07:30
(28) А чем вообще занимаешься? Восьмеркой?
34 Zheleznogorsk
 
25.07.12
07:31
давным давно занимался 7-кой, сейчас на джанго работаю!
35 Zheleznogorsk
 
25.07.12
07:32
поэтому и попросил расписать!
36 VladZ
 
25.07.12
07:34
(34) Ясно. Либо вспоминай, либо ищи спеца. :)
37 Zheleznogorsk
 
25.07.12
07:35
блин и спеца нет,а отчет как всегда вчера нужен был! :)
38 Мимохожий Однако
 
25.07.12
07:40
Вытри слёзы и начни отчет заново согласно рекомендациям.
39 Zheleznogorsk
 
25.07.12
07:46
в Функции ПолучитьДанные() что должно быть!?
40 Fenikus
 
25.07.12
07:49
(39)получение данных, я так понимаю :)
41 Zheleznogorsk
 
25.07.12
07:57
1С - дрянь редкостная!!!
42 Fenikus
 
25.07.12
07:58
(41) Когда чем-то не умеешь пользоваться, всегда так говоришь?
43 Zheleznogorsk
 
25.07.12
07:59
Благодаря VladZ и его подсказкам, делаю!!!
44 Мимохожий Однако
 
25.07.12
07:59
Добавь голосовалку. 1С - дрянь, джанго- форева )))
45 Zheleznogorsk
 
25.07.12
08:01
Можно и так!
46 Zheleznogorsk
 
25.07.12
08:03
Ладно, тему можно закрыть!