Имя: Пароль:
1C
1С v8
Автогруппировка строк. Работа над ошибками.
0 Nykos
 
01.09.15
20:24
Здравствуйте, не кидайте сильно камнями, помогите исправить ошибки при построении макета с группировками.
1. ИтогПоВид почему-то подбивается в самом конце как общий итог.
2. Над шапкой формируется строка с суммами, происхождение которых мне до сих пор неизвестно...
Чессслово, я просто не понимаю как это работает логически и в какой последовательности нужно группировать. Я готов получить любую оценку моих умственных способностей, но прошу - объясните, научите!! или посоветуете литературу для идиотов)

Код ниже, спасибо заранее....

ТабДок = Новый ТабличныйДокумент;
Макет = Отчеты.ОтчетПоРаботам.ПолучитьМакет("Макет");
ТабДок.НачатьАвтогруппировкуСтрок();
Шапка = Макет.ПолучитьОбласть("Шапка");
Шапка.Параметры.Владелец = Владелец;
Шапка.Параметры.НачДата = Формат(НачПериода,"ДФ=dd.MM.yy");
Шапка.Параметры.КонДата = Формат(КонПериода,"ДФ=dd.MM.yy");
ТабДок.Вывести(Шапка);
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|    СчетаИАктыОстаткиИОбороты.Владелец,
|    СчетаИАктыОстаткиИОбороты.Заказчик,
|    СчетаИАктыОстаткиИОбороты.ВыписанАкт,
|    СчетаИАктыОстаткиИОбороты.ВидУслуги КАК ВидУслуги,
|    СчетаИАктыОстаткиИОбороты.НачДата,
|    СчетаИАктыОстаткиИОбороты.КонДата,
|    СчетаИАктыОстаткиИОбороты.Наименование,
|    СчетаИАктыОстаткиИОбороты.СтоимостьКонечныйОстаток КАК Стоимость,
|    СчетаИАктыОстаткиИОбороты.НалогКонечныйОстаток КАК Налог,
|    СчетаИАктыОстаткиИОбороты.ВыручкаКонечныйОстаток КАК Выручка,
|    СчетаИАктыОстаткиИОбороты.ВыручкаМенеджераКонечныйОстаток КАК ВыручкаМенеджера
|ИЗ
|    РегистрНакопления.СчетаИАкты.ОстаткиИОбороты КАК СчетаИАктыОстаткиИОбороты
|ГДЕ
|    СчетаИАктыОстаткиИОбороты.Дата МЕЖДУ &НачПериода И &КонПериода
//|    И СчетаИАктыОстаткиИОбороты.Владелец = &Владелец
|    И СчетаИАктыОстаткиИОбороты.ВыписанАкт = &флВыписанАкт
|ИТОГИ
|    СУММА(Стоимость),
|    СУММА(Налог),
|    СУММА(Выручка),
|    СУММА(ВыручкаМенеджера)
|ПО
|    ОБЩИЕ,
|    ВидУслуги";
//Запрос.УстановитьПараметр("Владелец",Владелец());    
Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачалоМесяца(НачПериода)));
Запрос.УстановитьПараметр("КонПериода",КонецДня(КонецМесяца(КонПериода)));
Запрос.УстановитьПараметр("флВыписанАкт",Истина);
Выборка = Запрос.Выполнить().Выбрать();    
Строка = Макет.ПолучитьОбласть("Строка");
СтоимостьИтог = 0;
ВыручкаИтог = 0;
ОплатаИтог = 0;
Ном = 0;
ИтогПоВид = "";
Пока Выборка.Следующий() Цикл
Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
Если ИтогПоВид <> "" Тогда
ТабДок.Вывести(ИтогПоВид,1,,Ложь);
КонецЕсли;
Итог = Макет.ПолучитьОбласть("Подвал");
//Итог.Параметры.ИтогоВидУслуги = "ИТОГО ПО " + Выборка.ВидУслуги;
Итог.Параметры.СтоимостьИтог = Выборка.Стоимость;
Итог.Параметры.ВыручкаИтог = Выборка.Выручка;
Итог.Параметры.ОплатаИтог = Выборка.ВыручкаМенеджера;
ОбластьВид = Макет.ПолучитьОбласть("Вид");
ОбластьВид.Параметры.ВидУслуги = Выборка.ВидУслуги;
ТабДок.Вывести(ОбластьВид,1,,Ложь); Ном = 0;
Продолжить;
КонецЕсли;
Строка.Параметры.Заказчик  = Выборка.Заказчик;
Строка.Параметры.Наименование = Выборка.Наименование;
Строка.Параметры.Период = Формат(Выборка.НачДата,"ДФ=dd.MM.yy") + ?(ПустоеЗначение(Выборка.НачДата) ИЛИ ПустоеЗначение(Выборка.КонДата),""," - ") + Формат(Выборка.КонДата,"ДФ=dd.MM.yy");
Строка.Параметры.Стоимость = Выборка.Стоимость;
Строка.Параметры.Выручка = Выборка.Выручка-Выборка.Налог;
Строка.Параметры.Оплата = Выборка.ВыручкаМенеджера;
Ном = Ном+1;
Строка.Параметры.Ном = Ном;
ТабДок.Вывести(Строка,2,,Ложь);
СтоимостьИтог = СтоимостьИтог + Выборка.Стоимость;
ВыручкаИтог = ВыручкаИтог + Выборка.Выручка;
ОплатаИтог = ОплатаИтог + Выборка.ВыручкаМенеджера;
КонецЦикла;
Если ИтогПоВид <> "" Тогда
ТабДок.Вывести(ИтогПоВид);
КонецЕсли;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ОбластьИтог = Макет.ПолучитьОбласть("Подвал");
//ОбластьИтог.Параметры.ИтогоВидУслуги = "ИТОГО";
ОбластьИтог.Параметры.СтоимостьИтог = СтоимостьИтог;
ОбластьИтог.Параметры.ВыручкаИтог = ВыручкаИтог;
ОбластьИтог.Параметры.ОплатаИтог = ОплатаИтог;
ТабДок.Вывести(ОбластьИтог);
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Табдок.ОтображатьЗаголовки = Ложь;
Табдок.ОтображатьСетку = Ложь;
ТабДок.Показать();
1 Tatitutu
 
01.09.15
20:42
Вместо

НачатьАвтогруппировкуСтрок

Пиши
НачатьГруппировкуСтрок()
2 Nykos
 
01.09.15
21:20
(1) у меня в 8.1 есть либо НачатьАвтогруппировкуСтрок() либо НачатьГруппуСтрок(). По крайней мере другого я не нашел.. Если использовать НачатьГруппуСтрок(), то их получается нужно несколько раз проставлять по коду в тех местах где необходима группировка. Эдакий ручной режим. Правильно я понял?
3 Tatitutu
 
01.09.15
21:50
(2) да именно так.это я,напутал с телефона пишу
Там 2 параметра
Имя группировки - не очень обчзательно
Второй - истина или ложь - раскрывать и сворачивать группу.
4 Nykos
 
01.09.15
21:51
(3) спасибо,попробую этот вариант
5 Nykos
 
02.09.15
10:16
(3) Мучал я его, мучал, так ничего и не намучал...
Как сгруппировать по ВидУслуги так и не разобрался..

    ТабДок = Новый ТабличныйДокумент;
    ТабДок.ПолеСправа = 20;
    ТабДок.ПолеСлева = 20;
    ТабДок.ПолеСнизу = 10;
    Табдок.ПолеСверху = 15;
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.ОтображатьГруппировки = Истина;
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    Табдок.ОтображатьЗаголовки = Ложь;
    Табдок.ОтображатьСетку = Ложь;
    
    Макет = Отчеты.ОтчетПоРаботам.ПолучитьМакет("Макет");
    Шапка = Макет.ПолучитьОбласть("Шапка");
    Шапка.Параметры.Владелец = Владелец;
    Шапка.Параметры.НачДата = Формат(НачПериода,"ДФ=dd.MM.yy");
    Шапка.Параметры.КонДата = Формат(КонПериода,"ДФ=dd.MM.yy");
    Итого = Макет.ПолучитьОбласть("Итог");
    Строка = Макет.ПолучитьОбласть("Строка");
    ТабДок.Вывести(Шапка);
    ОблВид = Макет.ПолучитьОбласть("Вид");
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    СчетаИАктыОстаткиИОбороты.Владелец,
    |    СчетаИАктыОстаткиИОбороты.Заказчик,
    |    СчетаИАктыОстаткиИОбороты.ВыписанАкт,
    |    СчетаИАктыОстаткиИОбороты.ВидУслуги КАК ВидУслуги,
    |    СчетаИАктыОстаткиИОбороты.НачДата,
    |    СчетаИАктыОстаткиИОбороты.КонДата,
    |    СчетаИАктыОстаткиИОбороты.Наименование,
    |    СчетаИАктыОстаткиИОбороты.СтоимостьКонечныйОстаток КАК Стоимость,
    |    СчетаИАктыОстаткиИОбороты.НалогКонечныйОстаток КАК Налог,
    |    СчетаИАктыОстаткиИОбороты.ВыручкаКонечныйОстаток КАК Выручка,
    |    СчетаИАктыОстаткиИОбороты.ВыручкаМенеджераКонечныйОстаток КАК ВыручкаМенеджера
    |ИЗ
    |    РегистрНакопления.СчетаИАкты.ОстаткиИОбороты КАК СчетаИАктыОстаткиИОбороты
    |ГДЕ
    |    СчетаИАктыОстаткиИОбороты.Дата МЕЖДУ &НачПериода И &КонПериода
    //|    И СчетаИАктыОстаткиИОбороты.Владелец = &Владелец
    |    И СчетаИАктыОстаткиИОбороты.ВыписанАкт = &флВыписанАкт
    |ИТОГИ
    |    СУММА(Стоимость),
    |    СУММА(Налог),
    |    СУММА(Выручка),
    |    СУММА(ВыручкаМенеджера)
    |ПО
    |    ОБЩИЕ,
    |    ВидУслуги";
    //Запрос.УстановитьПараметр("Владелец",Владелец());    
    Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачалоМесяца(НачПериода)));
    Запрос.УстановитьПараметр("КонПериода",КонецДня(КонецМесяца(КонПериода)));
    Запрос.УстановитьПараметр("флВыписанАкт",Истина);
    Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    СтоимостьИтог = 0;
    Пока Выборка.Следующий() Цикл
        ОблВид.Параметры.ВидУслуги = Выборка.ВидУслуги;
        ТабДок.Вывести(ОблВид);
        ТабДок.НачатьГруппуСтрок(,Истина);
        Ном = 0;
        Строка.Параметры.Заказчик  = Выборка.Заказчик;
        Строка.Параметры.Наименование = Выборка.Наименование;
        Строка.Параметры.Период = Формат(Выборка.НачДата,"ДФ=dd.MM.yy") + ?(ПустоеЗначение(Выборка.НачДата) ИЛИ ПустоеЗначение(Выборка.КонДата),""," - ") + Формат(Выборка.КонДата,"ДФ=dd.MM.yy");
        Строка.Параметры.Стоимость = Выборка.Стоимость;
        Строка.Параметры.Выручка = Выборка.Выручка - Выборка.Налог;
        Строка.Параметры.Оплата = Выборка.ВыручкаМенеджера;
        Ном = Ном + 1;
        Строка.Параметры.Ном = Ном;
        ТабДок.Вывести(Строка);
        ТабДок.ЗакончитьГруппуСтрок();
        //Итого.Параметры.СтоимостьИтог = 555;
            //ТабДок.Вывести(Итого);
            //Итог = Итог + КолИ;
    КонецЦикла;
        //Итого.Параметры.СтоимостьИтог = СтоимостьИтог;
        //ТабДок.Вывести(Итого);
    //ОбластьИтог = Макет.ПолучитьОбласть("Итог");
    //ОбластьИтог.Параметры.ИтогоВидУслуги = "ИТОГО";
    //ОбластьИтог.Параметры.СтоимостьИтог = СтоимостьИтог;
    //ОбластьИтог.Параметры.ВыручкаИтог = ВыручкаИтог;
    //ОбластьИтог.Параметры.ОплатаИтог = ОплатаИтог;
    //ТабДок.Вывести(ОбластьИтог);
    ТабДок.Показать();
6 Nykos
 
02.09.15
14:09
Никто не подскажет где почитать или видеоуроки посмотреть по группировкам?
7 Franchiser
 
гуру
02.09.15
15:02
правой кнопкой конструктор с обработкой результат
8 Franchiser
 
гуру
02.09.15
15:03
ты неправильно делаешь, нужно было с иерархией перебирать (см. как делает конструктор)
Выборка = Запрос.Выполнить().Выбрать(); - удали
вставь
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
9 Franchiser
 
гуру
02.09.15
15:05
ОбщийИтог из запроса удали из Секции Итогов, он тебе не нужен
10 Nykos
 
02.09.15
15:08
(7) не понял...

Вроде как сделал я чтобы группировало как мне надо


Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    СтоимостьИтог = 0;
    Пока Выборка.Следующий() Цикл
        ОблВид.Параметры.ВидУслуги = Выборка.ВидУслуги;
        ТабДок.Вывести(ОблВид);
        ТабДок.НачатьГруппуСтрок();
        Ном = 0;
        Строка.Параметры.Заказчик  = Выборка.Заказчик;
        Строка.Параметры.Наименование = Выборка.Наименование;
        Строка.Параметры.Период = Формат(Выборка.НачДата,"ДФ=dd.MM.yy") + ?(ПустоеЗначение(Выборка.НачДата) ИЛИ ПустоеЗначение(Выборка.КонДата),""," - ") + Формат(Выборка.КонДата,"ДФ=dd.MM.yy");
        Строка.Параметры.Стоимость = Выборка.Стоимость;
        Строка.Параметры.Выручка = Выборка.Выручка - Выборка.Налог;
        Строка.Параметры.Оплата = Выборка.ВыручкаМенеджера;
        Ном = Ном + 1;
        Строка.Параметры.Ном = Ном;
        ТабДок.Вывести(Строка);
        ТабДок.ЗакончитьГруппуСтрок();
    КонецЦикла;


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

или

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

то в отладчике в значении Выборка все численные значения имеют тип Число, а остальные NULL.

А если я просто использую Выполнить().Выбрать(), тогда теряется вся группировка..
(9)вот, я как раз хотел об этом спросить..спасибо что откликнулся
11 Nykos
 
02.09.15
15:10
(9) Общий итог удалил тоже
12 Franchiser
 
гуру
02.09.15
15:11
"то в отладчике в значении Выборка все численные значения имеют тип Число, а остальные NULL."
Потому что нужно использовать агрегатную функцию Максимум для остальных полей
13 Franchiser
 
гуру
02.09.15
15:12
|ИТОГИ
|    СУММА(Стоимость),
|    СУММА(Налог),
|    СУММА(Выручка),
|    СУММА(ВыручкаМенеджера),
|МАКСИМУМ(СчетаИАктыОстаткиИОбороты.Заказчик)
|ПО
|    ОБЩИЕ,
|    ВидУслуги";
14 Franchiser
 
гуру
02.09.15
15:13
зачем тебе ПоГруппировкамСИерархией, это имеет смысл для Иерархических справочников
15 Franchiser
 
гуру
02.09.15
15:15
еще раз скоппируй текст запроса, правой кнопкой щелкни в коде и открой "Конструктой с обработкой результата", тебе все код и макет сгенерируется, потом его подредактируешь
16 Franchiser
 
гуру
02.09.15
15:17
"Строка.Параметры.Заказчик  = Выборка.Заказчик;" - чтобы это все не писать:
Есть функция ЗаполнитьЗначенияСвойств()
17 Franchiser
 
гуру
02.09.15
15:17
ЗаполнитьЗначенияСвойств(Строка,Выборка)
18 Franchiser
 
гуру
02.09.15
15:19
это же элементарные вещи, вроде не новичок
19 Nykos
 
02.09.15
15:27
(14) уяснил
(15) в 8.2 такая штука есть, а в 8.1 кажется нету...
(16) (17) спасибо, буду иметь ввиду
(18) я с группировкой первый раз столкнулся... к тому же я немного тугодум(
20 Franchiser
 
гуру
02.09.15
15:36
(19) в целях изучения такого рода запросов тогда рекомендую поставить 1с 8.2
21 Nykos
 
02.09.15
15:47
(20) в университете факультатив с 8.1 был, я так и продолжаю с ней баловаться...

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


    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    //|    СчетаИАктыОстаткиИОбороты.Владелец,
    |    СчетаИАктыОстаткиИОбороты.Заказчик КАК Заказчик,
    |    СчетаИАктыОстаткиИОбороты.ВыписанАкт,
    |    СчетаИАктыОстаткиИОбороты.ВидУслуги КАК ВидУслуги,
    |    СчетаИАктыОстаткиИОбороты.НачДата КАК НачДата,
    |    СчетаИАктыОстаткиИОбороты.КонДата КАК КонДата,
    |    СчетаИАктыОстаткиИОбороты.Наименование КАК Наименование,
    |    СчетаИАктыОстаткиИОбороты.СтоимостьКонечныйОстаток КАК Стоимость,
    |    СчетаИАктыОстаткиИОбороты.НалогКонечныйОстаток КАК Налог,
    |    СчетаИАктыОстаткиИОбороты.ВыручкаКонечныйОстаток КАК Выручка,
    |    СчетаИАктыОстаткиИОбороты.ВыручкаМенеджераКонечныйОстаток КАК ВыручкаМенеджера
    |ИЗ
    |    РегистрНакопления.СчетаИАкты.ОстаткиИОбороты КАК СчетаИАктыОстаткиИОбороты
    |ГДЕ
    |    СчетаИАктыОстаткиИОбороты.Дата МЕЖДУ &НачПериода И &КонПериода
    //|    И СчетаИАктыОстаткиИОбороты.Владелец = &Владелец
    |    И СчетаИАктыОстаткиИОбороты.ВыписанАкт = &флВыписанАкт
    |ИТОГИ
    |    СУММА(Стоимость),
    |    СУММА(Налог),
    |    СУММА(Выручка),
    |    СУММА(ВыручкаМенеджера),
    |МАКСИМУМ(СчетаИАктыОстаткиИОбороты.Заказчик),
    |МАКСИМУМ(СчетаИАктыОстаткиИОбороты.Наименование),
    |МАКСИМУМ(СчетаИАктыОстаткиИОбороты.НачДата),
    |МАКСИМУМ(СчетаИАктыОстаткиИОбороты.КонДата)
    |ПО
    |    ВидУслуги";
    //Запрос.УстановитьПараметр("Владелец",Владелец());    
    Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачалоМесяца(НачПериода)));
    Запрос.УстановитьПараметр("КонПериода",КонецДня(КонецМесяца(КонПериода)));
    Запрос.УстановитьПараметр("флВыписанАкт",Истина);
    Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    СтоимостьИтог = 0;
    Пока Выборка.Следующий() Цикл
        ОблВид.Параметры.ВидУслуги = Выборка.ВидУслуги;
        ТабДок.Вывести(ОблВид);
        ТабДок.НачатьГруппуСтрок();
        Ном = 0;
        Строка.Параметры.Заказчик  = Выборка.Заказчик;
        Строка.Параметры.Наименование = Выборка.Наименование;
        Строка.Параметры.Период = Формат(Выборка.НачДата,"ДФ=dd.MM.yy") + ?(ПустоеЗначение(Выборка.НачДата) ИЛИ ПустоеЗначение(Выборка.КонДата),""," - ") + Формат(Выборка.КонДата,"ДФ=dd.MM.yy");
        Строка.Параметры.Стоимость = Выборка.Стоимость;
        Строка.Параметры.Выручка = Выборка.Выручка - Выборка.Налог;
        Строка.Параметры.Оплата = Выборка.ВыручкаМенеджера;
        Ном = Ном + 1;
        Строка.Параметры.Ном = Ном;
        ТабДок.Вывести(Строка);
        ТабДок.ЗакончитьГруппуСтрок();
    КонецЦикла;
22 sash-ml
 
02.09.15
16:10
Пока Выборка.Следующий() Цикл
        ОблВид.Параметры.ВидУслуги = Выборка.ВидУслуги;
        ТабДок.Вывести(ОблВид);
        ТабДок.НачатьГруппуСтрок();
        Ном = 0;
        Строка.Параметры.Заказчик  = Выборка.Заказчик;
        Строка.Параметры.Наименование = Выборка.Наименование;
        Строка.Параметры.Период = Формат(Выборка.НачДата,"ДФ=dd.MM.yy") + ?(ПустоеЗначение(Выборка.НачДата) ИЛИ ПустоеЗначение(Выборка.КонДата),""," - ") + Формат(Выборка.КонДата,"ДФ=dd.MM.yy");
        Строка.Параметры.Стоимость = Выборка.Стоимость;
        Строка.Параметры.Выручка = Выборка.Выручка - Выборка.Налог;
        Строка.Параметры.Оплата = Выборка.ВыручкаМенеджера;
        Ном = Ном + 1;
        Строка.Параметры.Ном = Ном;
        ТабДок.Вывести(Строка);
                                    //////////////////Выборка Строк
                                    //////////////////
                                    ВыборкаДеталей = Выборка.Выбрать(); // вот тут обход внутри одной группировки
                                    Пока ВыборкаДеталей.Следующий() Цикл;
                                     ТабДок.НачатьГруппуСтрок();

                                     ТабДок.Вывести(...); // тут детальные записи

                                                                        ТабДок.ЗакончитьГруппуСтрок();
                                    КонецЦикла;

                                    //////////////////
                                    //////////////////
        ТабДок.ЗакончитьГруппуСтрок();
    КонецЦикла;
23 Franchiser
 
гуру
02.09.15
16:12
На этапе перебора сумм:
ВыборкаДеталей = Выборка.Выбрать();
24 sash-ml
 
02.09.15
16:13
+(22) хотя группировка внутри цикла по ходу не нужна
25 Nykos
 
02.09.15
16:17
(23) (24) Спасибо большое вам за помощь, ребята!
26 Nykos
 
02.09.15
16:31
Найдите, пожалуйста ошибку:

Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока Выборка.Следующий() Цикл
        СтоимостьИтог = 0;
        ОблВид.Параметры.ВидУслуги = Выборка.ВидУслуги;
        ТабДок.Вывести(ОблВид);
        ТабДок.НачатьГруппуСтрок();
        Строка.Параметры.Заказчик  = Выборка.Заказчик;
        Строка.Параметры.Наименование = Выборка.Наименование;
        Строка.Параметры.Период = Формат(Выборка.НачДата,"ДФ=dd.MM.yy") + ?(ПустоеЗначение(Выборка.НачДата) ИЛИ ПустоеЗначение(Выборка.КонДата),""," - ") + Формат(Выборка.КонДата,"ДФ=dd.MM.yy");
        Строка.Параметры.Стоимость = Выборка.Стоимость;
        Строка.Параметры.Выручка = Выборка.Выручка - Выборка.Налог;
        Строка.Параметры.Оплата = Выборка.ВыручкаМенеджера;
        Ном = 0;
        Ном = Ном + 1;
        Строка.Параметры.Ном = Ном;
        ТабДок.Вывести(Строка);
        ВыборкаДеталей = Выборка.Выбрать();
        Пока ВыборкаДеталей.Следующий() Цикл;
            ТабДок.Вывести(Строка);
            КонецЦикла;
            ТабДок.ЗакончитьГруппуСтрок();
            СтоимостьИтог = СтоимостьИтог + Выборка.Стоимость;
            Итого.Параметры.СтоимостьИтог = СтоимостьИтог;
        ТабДок.Вывести(Итого);
    КонецЦикла;

Я уверен что она где-то тут
Пока ВыборкаДеталей.Следующий() Цикл;
            ТабДок.Вывести(Строка);
            КонецЦикла;
но я не понимаю что нужно выводить в табдок?
27 Nykos
 
02.09.15
16:32
(26) Потому что выводит по количеству строк все правильно, а по содержанию - они просто много раз дублируются
28 Nykos
 
03.09.15
09:19
http://6.firepic.org/6/images/2015-09/03/x9i1nr5fj204.jpg

Верхняя строчка в каждой группе лишняя.
В последней колонке все строки заполняются суммой из итогов.
Подскажите пожалуйста, как исправить эти ошибки?..
29 Nykos
 
03.09.15
11:10
С первой проблемой разобрался. Дважды выводил область "Строка".
Осталась проблема только в последней колонке - почему-то в каждой строке сумма из итогов...


    ТабДок = Новый ТабличныйДокумент;
    ТабДок.ПолеСправа = 20;
    ТабДок.ПолеСлева = 20;
    ТабДок.ПолеСнизу = 10;
    Табдок.ПолеСверху = 15;
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.ОтображатьГруппировки = Истина;
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    Табдок.ОтображатьЗаголовки = Ложь;
    Табдок.ОтображатьСетку = Ложь;
    Макет = Отчеты.ОтчетПоРаботам.ПолучитьМакет("Макет");
    Шапка = Макет.ПолучитьОбласть("Шапка");
    Шапка.Параметры.Владелец = Владелец;
    Шапка.Параметры.НачДата = Формат(НачПериода,"ДФ=dd.MM.yy");
    Шапка.Параметры.КонДата = Формат(КонПериода,"ДФ=dd.MM.yy");
    ТабДок.Вывести(Шапка);
    Итого = Макет.ПолучитьОбласть("Итог");
    Строка = Макет.ПолучитьОбласть("Строка");
    ОблВид = Макет.ПолучитьОбласть("Вид");
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    //|    СчетаИАктыОстатки.Владелец,
    |    СчетаИАктыОстатки.Заказчик КАК Заказчик,
    |    СчетаИАктыОстатки.ВыписанАкт,
    |    СчетаИАктыОстатки.ВидУслуги КАК ВидУслуги,
    |    СчетаИАктыОстатки.НачДата КАК НачДата,
    |    СчетаИАктыОстатки.КонДата КАК КонДата,
    |    СчетаИАктыОстатки.Наименование КАК Наименование,
    |    СчетаИАктыОстатки.СтоимостьОстаток КАК Стоимость,
    |    СчетаИАктыОстатки.НалогОстаток КАК Налог,
    |    СчетаИАктыОстатки.ВыручкаОстаток КАК Выручка,
    |    СчетаИАктыОстатки.ВыручкаМенеджераОстаток КАК ВыручкаМенеджера
    |ИЗ
    |    РегистрНакопления.СчетаИАкты.Остатки КАК СчетаИАктыОстатки
    |ГДЕ
    |    СчетаИАктыОстатки.Дата МЕЖДУ &НачПериода И &КонПериода
    //|    И СчетаИАктыОстатки.Владелец = &Владелец
    |    И СчетаИАктыОстатки.ВыписанАкт = &флВыписанАкт
    |ИТОГИ
    |    СУММА(Стоимость),
    |    СУММА(Налог),
    |    СУММА(Выручка),
    |    СУММА(ВыручкаМенеджера),
    |МАКСИМУМ(СчетаИАктыОстатки.Заказчик),
    |МАКСИМУМ(СчетаИАктыОстатки.Наименование),
    |МАКСИМУМ(СчетаИАктыОстатки.НачДата),
    |МАКСИМУМ(СчетаИАктыОстатки.КонДата)
    |ПО
    |    ВидУслуги";
    //Запрос.УстановитьПараметр("Владелец",Владелец());    
    Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачалоМесяца(НачПериода)));
    Запрос.УстановитьПараметр("КонПериода",КонецДня(КонецМесяца(КонПериода)));
    Запрос.УстановитьПараметр("флВыписанАкт",Истина);
    Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока Выборка.Следующий() Цикл
        ОблВид.Параметры.ВидУслуги = Выборка.ВидУслуги;
        ТабДок.Вывести(ОблВид);
        ТабДок.НачатьГруппуСтрок();
        Строка.Параметры.Заказчик  = Выборка.Заказчик;
        Строка.Параметры.Наименование = Выборка.Наименование;
        Строка.Параметры.Период = Формат(Выборка.НачДата,"ДФ=dd.MM.yy") + ?(ПустоеЗначение(Выборка.НачДата) ИЛИ ПустоеЗначение(Выборка.КонДата),""," - ") + Формат(Выборка.КонДата,"ДФ=dd.MM.yy");
        Строка.Параметры.Стоимость = Выборка.Стоимость;
        Строка.Параметры.Выручка = Выборка.Выручка - Выборка.Налог;
        Строка.Параметры.Оплата = Выборка.ВыручкаМенеджера;
        Ном = 0;
        СтоимостьИтог = 0;
        ВыручкаИтог = 0;
        ОплатаИтог = 0;
        Строка.Параметры.Ном = Ном;
        ВыборкаДеталей = Выборка.Выбрать();
        Пока ВыборкаДеталей.Следующий() Цикл
            Ном = Ном + 1;
            Строка.Параметры.Ном = Ном;
            Строка.Параметры.Заполнить(ВыборкаДеталей);
            ТабДок.Вывести(Строка);
        КонецЦикла;
        ТабДок.ЗакончитьГруппуСтрок();
        СтоимостьИтог = СтоимостьИтог + Выборка.Стоимость;
        ВыручкаИтог = ВыручкаИтог + Выборка.Выручка;
        ОплатаИтог = ОплатаИтог + Выборка.ВыручкаМенеджера;
        Итого.Параметры.СтоимостьИтог = СтоимостьИтог;
        Итого.Параметры.ВыручкаИтог = ВыручкаИтог;
        Итого.Параметры.ОплатаИтог = ОплатаИтог;
        ТабДок.Вывести(Итого);
    КонецЦикла;
    ТабДок.Показать();
КонецПроцедуры;
30 Franchiser
 
гуру
03.09.15
12:39
Добавь в цикле по деталям строку:
Строка.Параметры.Оплата = ВыборкаДеталей.ВыручкаМенеджера;
31 Nykos
 
03.09.15
13:21
(30) Спасибо. Получается в первом цикле вообще не имеет смысла объявлять параметры? Все лежит в Заполнить(ВыборкаДеталей)?
32 Nykos
 
04.09.15
09:02
Посоветуйте пожалуйста, как сделать группировку по владельцу с тем условием, что группироваться по владельцу должно в первую очередь? (у меня закомменченный кусок в цикле). Владельца то выводит, но не группирует...
Должно быть Владелец -> ВидУслуги -> Строки. А получается как на картинке:
http://2.firepic.org/2/images/2015-09/04/l4rmd7kecx6s.jpg


ТабДок = Новый ТабличныйДокумент;
    ТабДок.ПолеСправа = 20;
    ТабДок.ПолеСлева = 20;
    ТабДок.ПолеСнизу = 10;
    Табдок.ПолеСверху = 15;
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.ОтображатьГруппировки = Истина;
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    Табдок.ОтображатьЗаголовки = Ложь;
    Табдок.ОтображатьСетку = Ложь;
    Макет = Отчеты.ОтчетПоРаботам.ПолучитьМакет("Макет");
    Шапка = Макет.ПолучитьОбласть("Шапка");
    Шапка.Параметры.НачДата = Формат(НачПериода,"ДФ=dd.MM.yy");
    Шапка.Параметры.КонДата = Формат(КонПериода,"ДФ=dd.MM.yy");
    ТабДок.Вывести(Шапка);
    Итого = Макет.ПолучитьОбласть("Итог");
    //ИтогоВсего = Макет.ПолучитьОбласть("ИтогВсего");
    Строка = Макет.ПолучитьОбласть("Строка");
    ОблВид = Макет.ПолучитьОбласть("Вид");
    ОблВлад = Макет.ПолучитьОбласть("Влад");
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    СчетаИАктыОстатки.Владелец,
    |    СчетаИАктыОстатки.Заказчик КАК Заказчик,
    |    СчетаИАктыОстатки.ВыписанАкт,
    |    СчетаИАктыОстатки.ВидУслуги КАК ВидУслуги,
    |    СчетаИАктыОстатки.НачДата КАК НачДата,
    |    СчетаИАктыОстатки.КонДата КАК КонДата,
    |    СчетаИАктыОстатки.Наименование КАК Наименование,
    |    СчетаИАктыОстатки.СтоимостьОстаток КАК Стоимость,
    |    СчетаИАктыОстатки.НалогОстаток КАК Налог,
    |    СчетаИАктыОстатки.ВыручкаОстаток КАК Выручка,
    |    СчетаИАктыОстатки.ВыручкаМенеджераОстаток КАК ВыручкаМенеджера
    |ИЗ
    |    РегистрНакопления.СчетаИАкты.Остатки КАК СчетаИАктыОстатки
    |ГДЕ
    |    СчетаИАктыОстатки.Дата МЕЖДУ &НачПериода И &КонПериода
    |    И СчетаИАктыОстатки.Владелец В (&Владелец)
    |    И СчетаИАктыОстатки.ВыписанАкт = &флВыписанАкт
    |ИТОГИ
    |    СУММА(Стоимость),
    |    СУММА(Налог),
    |    СУММА(Выручка),
    |    СУММА(ВыручкаМенеджера),
    |МАКСИМУМ(СчетаИАктыОстатки.Заказчик),
    |МАКСИМУМ(СчетаИАктыОстатки.Наименование),
    |МАКСИМУМ(СчетаИАктыОстатки.НачДата),
    |МАКСИМУМ(СчетаИАктыОстатки.КонДата),
    |МАКСИМУМ(СчетаИАктыОстатки.Владелец)
    |ПО
    |    ВидУслуги";
    Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачалоМесяца(НачПериода)));
    Запрос.УстановитьПараметр("КонПериода",КонецДня(КонецМесяца(КонПериода)));
    Запрос.УстановитьПараметр("флВыписанАкт",Истина);
    Если Владельцы.Количество() = 0 Тогда
        Влад = Новый СписокЗначений;
    Влад.Добавить(Справочники.Владельцы.НайтиПоКоду(1));
    Влад.Добавить(Справочники.Владельцы.НайтиПоКоду(2));
    Влад.Добавить(Справочники.Владельцы.НайтиПоКоду(3));
    Влад.Добавить(Справочники.Владельцы.НайтиПоКоду(4));
    Влад.Добавить(Справочники.Владельцы.НайтиПоКоду(6));
    Влад.Добавить(Справочники.Владельцы.НайтиПоКоду(7));
    Иначе
        Влад = Новый СписокЗначений;
        Для Каждого Вл из Владельцы Цикл
            Влад.Добавить(Вл.Владелец)
        КонецЦикла;
    КонецЕсли;
    Запрос.УстановитьПараметр("Владелец", Влад);
    Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока Выборка.Следующий() Цикл
        //ОблВлад.Параметры.Владелец = Выборка.Владелец;
        //ТабДок.Вывести(ОблВлад);
        ОблВид.Параметры.ВидУслуги = Выборка.ВидУслуги;
        ТабДок.Вывести(ОблВид);
        ТабДок.НачатьГруппуСтрок(,Ложь);
        Ном = 0;
        СтоимостьИтог = 0;
        ВыручкаИтог = 0;
        ОплатаИтог = 0;
        Строка.Параметры.Ном = Ном;
        ВыборкаДеталей = Выборка.Выбрать();
        Пока ВыборкаДеталей.Следующий() Цикл
            Ном = Ном + 1;
            Строка.Параметры.Ном = Ном;
        Строка.Параметры.Заполнить(ВыборкаДеталей);
            Строка.Параметры.Оплата = ВыборкаДеталей.ВыручкаМенеджера;
            Строка.Параметры.Период = Формат(Выборка.НачДата,"ДФ=dd.MM.yy") + ?(ПустоеЗначение(Выборка.НачДата) ИЛИ ПустоеЗначение(Выборка.КонДата),""," - ") + Формат(Выборка.КонДата,"ДФ=dd.MM.yy");
            ТабДок.Вывести(Строка);
        КонецЦикла;
        ТабДок.ЗакончитьГруппуСтрок();
        СтоимостьИтог = СтоимостьИтог + Выборка.Стоимость;
        ВыручкаИтог = ВыручкаИтог + Выборка.Выручка;
        ОплатаИтог = ОплатаИтог + Выборка.ВыручкаМенеджера;
        Итого.Параметры.СтоимостьИтог = СтоимостьИтог;
        Итого.Параметры.ВыручкаИтог = ВыручкаИтог;
        Итого.Параметры.ОплатаИтог = ОплатаИтог;
        ТабДок.Вывести(Итого);
    КонецЦикла;
    //ТабДок.Вывести(ИтогоВсего);
    ТабДок.Показать();
33 sash-ml
 
04.09.15
09:19
|ИТОГИ
   ....
    |ПО
    |    Владелец,
    |    ВидУслуги";
....

ВыборкаВладелец = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаВладелец.Следующий() цикл  
...
ВыборкаУслуги = ВыборкаВладелец Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаУслуги .Следующий() цикл  
...
ВыборкаДеталей = ВыборкаУслуги .Выбрать();
Пока ВыборкаДеталей .Следующий() цикл  
...
34 Nykos
 
04.09.15
09:57
(33)  Все сделал! Еще добавил группировку по владельцу, итоги по владельцу, и общие итоги... Отчет готов! Большое спасибо за помощь!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн