Имя: Пароль:
1C
1С v8
Проблема с выводом отчёта в 2 колонки
,
0 StarkNotDead
 
19.08.15
10:24
Добрый день! Необходимо выводить номенклатуру в отчёте в две колонки, столкнулась с проблемой, что при разном количестве строк отчёт отображается неккоректно. Что нужно дописать?

Функция Команда1НаСервере()

Макет = ПолучитьМакет("Макет1");

ТабДок = Новый ТабличныйДокумент;
ТабДок.Очистить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьИмяГруппы = Макет.ПолучитьОбласть("ИмяГруппы");

ОписаниеПериода = "на " + Формат(Дата, "ДФ = ""дд.ММ.гггг""");
ОбластьЗаголовок.Параметры.Период = "Данные "+ ОписаниеПериода;

ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ТоварыНаСкладахОстатки.Номенклатура,
               |    ТоварыНаСкладахОстатки.КоличествоОстаток,
               |    ТоварыНаСкладахОстатки.Номенклатура.Родитель КАК НоменклатураРодитель
               |ИЗ
               |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК ТоварыНаСкладахОстатки
               |ГДЕ
               |    ТоварыНаСкладахОстатки.КоличествоОстаток <> 0
               |    И ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ(&Номенклатура)
               |
               |СГРУППИРОВАТЬ ПО
               |    ТоварыНаСкладахОстатки.Номенклатура,
               |    ТоварыНаСкладахОстатки.КоличествоОстаток,
               |    ТоварыНаСкладахОстатки.Номенклатура.Родитель
               |ИТОГИ ПО
               |    НоменклатураРодитель";

Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Номенклатура",Справочники.Номенклатура.НайтиПоКоду("00000001624"));
Выб = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
     Счетчик =1;
Пока Выб.Следующий() цикл
    ОбластьИмяГруппы.Параметры.ИмяГруппы1 = Выб.НоменклатураРодитель;
    ТабДок.Вывести(ОбластьИмяГруппы);
    Выборка=Выб.Выбрать();
    пока Выборка.Следующий() цикл
        СтрокаКолонка1  = Макет.ПолучитьОбласть("СтрокаТаблицы|Колонка1");
        СтрокаКолонка1.Параметры.Поле1 = Выборка.Номенклатура;
    Если Счетчик = 1 Тогда //первая колонка
        ТабДок.Вывести(СтрокаКолонка1);
        Счетчик = 2;
    Иначе
        СтрокаКолонка2  = Макет.ПолучитьОбласть("СтрокаТаблицы|Колонка2");
        СтрокаКолонка2.Параметры.Поле2 = Выборка.Номенклатура;
        ТабДок.Присоединить(СтрокаКолонка2);
       Счетчик = 1;
    КонецЕсли;
КонецЦикла;
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ТолькоПросмотр = Истина;
Возврат ТабДок;
КонецФункции
1 Ёпрст
 
19.08.15
10:25
(0) выкинуть ТоварыНаСкладахОстатки.Номенклатура.Родитель КАК НоменклатураРодитель из текста запроса, это для начала
2 StarkNotDead
 
19.08.15
11:45
(1) Хорошо, а дальше?
3 Nuobu
 
19.08.15
11:47
(2) После цикла дописать
Если Счетчик = 1 Тогда

СтрокаКолонка2  = Макет.ПолучитьОбласть("СтрокаТаблицы|Колонка2");
        ТабДок.Присоединить(СтрокаКолонка2);
    КонецЕсли;
4 StarkNotDead
 
19.08.15
13:01
(3) нет, это не помогает.
5 Ёпрст
 
19.08.15
13:08
(2) итоги по ссылке по иерархии (ежели нужны все вышестоящие родители) или автоупорядочить по иерархии + либо в построитель запрос пихнуть - она сам всё выведет и колоночки и строчки, либо в скд
6 Nuobu
 
19.08.15
13:09
(4) Счетчик = 1 поменяй на Счетчик = 2
7 Desna
 
19.08.15
13:14
(0) сделайте на скд и не морочьте голову
8 StarkNotDead
 
19.08.15
13:20
(7) мне начальник сказал - в СКД не делать
9 Desna
 
19.08.15
13:59
(8) насяльника права знать
10 Ёпрст
 
19.08.15
14:03
(8)ну не делай, делай на построителе.
Если и его делать нельзя - делай руками
11 Ёпрст
 
19.08.15
14:03
Всю и ерархию получишь через Итоги по иерархии
12 Ёпрст
 
19.08.15
14:05
Ну и.. самый примитив - скорми свой запрос универсальному отчету.
13 kudlach
 
19.08.15
14:40
НайтиПоКоду("00000001624")   режет глаз мне одному ?...
Получение секции внутри цикла - моветон.

По тексту в (0)  Название группы должно выводиться перед каждой строкой с элементом.

У тебя нет в запросе СУММА(ХХХ), но есть ИТОГИ ПО
поэтому можно не делать СГРУППРОВАТЬ ПО,
Поменяй итоги:
ИТОГИ ПО
НоменклатураРодитель, Номенклатура

Упорядочивание поставь какое-нибудь

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

переделай на
Выб = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"НоменклатураРодитель");
14 kudlach
 
19.08.15
14:42
я так понимаю, тебе тупо экзамен устраивают ?
15 StarkNotDead
 
20.08.15
07:35
(14) нет, это отчёт для заказчика.
16 StarkNotDead
 
31.08.15
13:20
(13) (12) (3) спасибо большое за помощь! Может и не очень красиво, зато работает!))

Макет = ПолучитьМакет("Макет1");  

    ТабДок = Новый ТабличныйДокумент;  
    ТабДок.Очистить();
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьИмяГруппы = Макет.ПолучитьОбласть("ИмяГруппы");
    ОбластьСтрокаТаблицы = Макет.ПолучитьОбласть("СтрокаТаблицы");
    
    ОписаниеПериода = "на " + Формат(Дата, "ДФ = ""дд.ММ.гггг""");
    ОбластьЗаголовок.Параметры.Период = "Данные "+ ОписаниеПериода;
    
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);

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

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