Версия для печати темы (https://pro1c.org.ua/index.php?s=7235578d048d676a776e361c182f28c9&showtopic=7455)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Отчет Кросс-таблица в 7.7

Автор: Flexy 22.05.12, 13:57

Привет.Пытаюсь сделать отчет, но что-то не получается.
Скрин:
Код:

    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформ)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Товар = Документ.РасходнаяНакладная.Товар;
    |Контрагент = Документ.РасходнаяНакладная.Контрагент;
    |Количество = Документ.РасходнаяНакладная.Количество;
    |Функция КоличествоСумма = Сумма(Количество);
    |Группировка Товар без групп;
    |Группировка Контрагент без групп;
    |Условие(Товар в ВыбТовар);
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    Если Флаг = 1 Тогда
    Запрос.Выгрузить(ТЗ,,0);
    ТЗ.Свернуть("Контрагент, Товар", "Количество");
    Возврат;
    КонецЕсли;
    
    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица1");
    // Заполнение полей "Заголовок"
      Таб.ВывестиСекцию("Заголовок|ШАпка");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    
    Пока Запрос.Группировка(1) = 1 Цикл
        
        Таб.ВывестиСекцию("Товар");
        
        Пока Запрос.Группировка(2) = 1 Цикл
            
            Таб.ВывестиСекцию("Контрагент");
КонецЦикла;
    
    КонецЦикла;

    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформ", "");

Я так понимаю тут надо либо как-то хитро с группировкой играться...либо...с секциями таблицы.

Шаблон в 1С:

Автор: Kaliban 22.05.12, 14:09

С секциями.
Запустите конструктор запроса к БИ типа Шахматка.
Общий смысл поймете.

Автор: nysysimara 22.05.12, 14:14

ВыбТовар - это список необходимых товаров?
тогда
В Заголовке вместо Запрос.Товар - переменную например загТовар
В ТекстЗапроса поменять порядок группировок: сначала Контрагент, потом - товар
и

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

Автор: Flexy 22.05.12, 14:20

Цитата(nysysimara @ 22.05.12, 14:14) *
ВыбТовар - это список необходимых товаров?
тогда
В Заголовке вместо Запрос.Товар - переменную например загТовар
В ТекстЗапроса поменять порядок группировок: сначала Контрагент, потом - товар

Товар это поле ввода с типом Справочник.Номенклатура.В Моем случае он содержит группу товара "Алкоголь".
Группировки менять местами я пробовал.Но тогда у меня товар выводился столько раз, скольким контрам он был продан.
Бухии нет под рукой что бы глянуть как там формируется шахматка.
Может есть еще варианты какие?

Автор: nysysimara 22.05.12, 15:02

в запросе группировки так:

 
|Группировка Контрагент без групп;
|Группировка Товар без групп;

после запроса если можно, использовать вашу ТЗ
если нет -создать др.таблицу знач.
Если Флаг = 1 Тогда
    Запрос.Выгрузить(ТЗ,,0);
    ТЗ.Свернуть("Контрагент, Товар", "Количество");
    Возврат;
Иначе
    Запрос.Выгрузить(ТЗ,,0);
    ТЗ.Свернуть("Товар", "Количество");
        ТЗ.Сортировать("Товар");
КонецЕсли;

потом как-то так
 Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица1");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок|ШАпка");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
    загТовар = ТЗ.Товар;
    Таб.ПрисоединитьСекцию("Заголовок|Товар");
КонецЦикла;
Пока Запрос.Группировка(1) = 1 Цикл   //Контрагент  
    текКонтр = Запрос.Контрагент;
    Таб.ВывестиСекцию("Контрагент|ШАпка");
    
    КвоТовара=0; //то что вывести в Таб
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
        загТовар = ТЗ.Товар;
        Если Запрос.Получить(текКонтр,загТовар)=1 Тогда
            КвоТовара=Запрос.КоличествоСумма;
        КонецЕсли;
        Таб.ПрисоединитьСекцию("Контрагент|Товар");
        
    КонецЦикла;
КонецЦикла;



Автор: sava1 22.05.12, 15:24

А зачем тз?
Простой обход группировок (вторая группировка ВсеВошедшие в Запрос)


Вывод заголовка :

пока запрос.Группировка(1)=1 Цикл
   таб.ВывестиСекцию()

   пока запрос.Группировка(2)=1 Цикл
        таб.присоединитьСекцию(...);
   конеццикла;
   прервать;
конеццикла



 i 

Пожалуйста, выделяйте код
 

Автор: Домовик 22.05.12, 16:01

sava1 верно говорит. не выводит по товарам, скорее из-за отсутствия ВсеВошедшие в запрос.
по поводу группировок тоже верно указали.


Группировка Контрагент без групп
группировка товар всеВошедшие в запрос;

попробуйте пока без шапки это вывести.

Автор: Flexy 22.05.12, 16:20

Пробовал.Таким образом выводит только одного самого первого контрагента.
А товара выводит по всем контрам.Короче много.
Мне же надо, что бы если в папке Алкоголь 4 позиции, то должно выводить их 4.
А контрагентов с количеством разворачивало в разрезе этого товара.

Автор: Домовик 22.05.12, 16:37

не может быть, чтобы одного контрагента выводило.

мне тогда задача не понятна. А разве количество колонок-товаров не по всем контрагентам? просто ячейки будут заполняться только по нужному контрагенту. а разве нет так шахматка устроена?

Автор: Flexy 22.05.12, 16:39

Цитата(Домовик @ 22.05.12, 16:37) *
не может быть, чтобы одного контрагента выводило.

мне тогда задача не понятна. А разве количество колонок-товаров не по всем контрагентам? просто ячейки будут заполняться только по нужному контрагенту. а разве нет так шахматка устроена?

Да.Что-то типа того.Т.е. товар должен быть в таблице фиксированный (естественно тот по которому были движения), а контрагенты и количество товара должно меняться.

Автор: Домовик 22.05.12, 16:49

вам верно подсказали, тяните код.

Автор: sava1 22.05.12, 20:41

|Группировка Контрагент без групп;
|Группировка Товар без групп;

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица1");

Пока Запрос.Группировка(1) = 1 Цикл   //Контрагент
    Таб.ВывестиСекцию("Заголовок|ШАпка");
    
    Пока Запрос.Группировка(2) = 1 Цикл  //Товар
        Таб.ПрисоединитьСекцию("Контрагент|Товар");
        
    КонецЦикла;
    Прервать;
КонецЦикла;

Запрос.вНачалоВіборки();

Пока Запрос.Группировка(1) = 1 Цикл   //Контрагент
    Таб.ВывестиСекцию("Контрагент|Шапка");
    
    Пока Запрос.Группировка(2) = 1 Цикл  //Товар
        Таб.ПрисоединитьСекцию("Контрагент|Товар");
        
    КонецЦикла;
    Прервать;
КонецЦикла;


Наименования секций могут біть не те - не вижу макета

Автор: Домовик 23.05.12, 6:31

sava1,прервать при втором обходе нужно убрать.
ВсеВошедшие в запрос нужно. Иначе будет выдавать в строках разное количество колонок.только те ячейки, по которым есть количество.

Автор: sava1 23.05.12, 7:05

Согласен (код копировал - прощелкал)

Автор: Flexy 23.05.12, 8:27

Ребят, Спасибо.Получилось. icon_beer17.gif
Утром смотрел как в Бухии формирует шапку.Имхо ваш вариант для меня проще оказался.
Есть правда небольшой нюанс.Перестало Итоги выводить...

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua