Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
02 июл 2024, 14:27

секции в макете отчета

Автор maxkov, 27 сен 2011, 15:29

0 Пользователей и 1 гость просматривают эту тему.

maxkov

Подскажите, как поправить макет или же запрос и его вывод в макет, чтобы все получилось правильно.
Скрины вложил. Там вся суть проблемы.

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

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

// Заполнение полей Контрагент
Таб.ВывестиСекцию("Контра");
КонецЦикла;
КонецЦикла;
// Заполнение полей "Итого"
Таб.ВывестиСекцию("Итого");
// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Таб.Показать("Запрос", "");
КонецПроцедуры

ОльгаН

Вы хотите перечислить в заголовке таблицы всех контрагентов, а далее на пересечении строки Номенклатура и столбца Контрагент проставить Сумму?

maxkov


ОльгаН

Алгоритм такой: выбираете всех возможных контрагентов из запроса, пробегая по ним в цикле и используя метод ПрисоединитьСекцию, формируете шапку документа. Затем организуете перебор строк запроса в двойном цикле, далее опять же пробегая по контрагентам и сравнивая контрагента из шапки с контрагентом из запроса и опять же применяя метод ПрисоединитьСекцию, формируете строку документа. Если описание алгоритма для Вас непонятно, то могу подсказать код и объяснить (если это Вам нужно) каждую строку кода (но в личке)

maxkov

Алгоритм-то понятен, но дело в том, что всего 3 дня знаком с семеркой, и совсем запутался в синтаксисе, а срок горит.

Мне кажется, я что-то приблизительное вашему алгоритму сделал. Ниже.

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


Результат и макет прикреплены.

ОльгаН

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

ОльгаН

Вдогонку. научите, пожал-ста, выкладывать код.

maxkov

В режиме "Ответ" (не "быстрый ответ") вставив код, выделите его и нажмите кнопку решетки (см.рис.)

ОльгаН

Спасибо за ответ. Шапка получилась?

maxkov

Сейчас попробую. Макет правильно исправил?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск