7.7 Вывод результатов запроса в двумерную таблицу

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Konrad, 19 окт 2011.

  1. TopicStarter Overlay
    Konrad
    Offline

    Konrad Опытный в 1С

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

    Для начала, это вообще реально?
  2. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    думаю, реально, но придется макет отчета поправить и вывод соответственно тоже
  3. TopicStarter Overlay
    Konrad
    Offline

    Konrad Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    61
    Симпатии:
    1
    Баллы:
    29
    ОК, тогда подскажите как?
    я пробовал так:
    Код:
    	Перем Запрос, ТекстЗапроса, Таб;
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Товар = Регистр.ДоступныеОстатки.Товар;
    |Отдел = Регистр.ДоступныеОстатки.Отдел;
    |Количество = Регистр.ДоступныеОстатки.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Товар;
    |Группировка Отдел;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    
    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Выведем секцию с шапкой-заголовком столбца "Товары"
    Таб.ВывестиСекцию("Заголовок|Основа");
    
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    
    Пока Запрос.Группировка(1) = 1 Цикл
    // Выведем первый столбец следующей строки с названием товара
    Таб.ВывестиСекцию("Товар|Основа");
    Пока Запрос.Группировка(2) = 1 Цикл
    
    // Присоединим к заголовкам столбцов следующий Отдел
    Таб.ПрисоединитьСекцию("Заголовок|Отдел");
    //Присоединим столбец с количеством товара на остатке к столбцу с его названием
    Таб.ПрисоединитьСекцию("Товар|Отдел");
    КонецЦикла;
    КонецЦикла;
    
    // Заполнение полей "Итого"
    Таб.ВывестиСекцию("Итого|Основа");
    
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
    
    
    Так получается каша.
  4. TopicStarter Overlay
    Konrad
    Offline

    Konrad Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    61
    Симпатии:
    1
    Баллы:
    29
    Так я перестроил макет отчета:
    [​IMG]

    И вот что получилось на выходе:
    [​IMG]
  5. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Вывести это более чем реально.
    Для начала руками соберите таблицу значений из 3-х строк и 2-3 колонок и поиграйтесь с ПрисоединитьСекцию() - работает, делал и не раз.
    Сейчас тонкостей сказать не смогу, давненько 7ку не ковырял, да и лениво.
    Но это:
    а) Реально
    б) Нормально

    Епическая сила!!!!

    Код:
    Пока Запрос.Группировка(2) = 1 Цикл
    // Присоединим к заголовкам столбцов следующий Отдел
    Таб.ПрисоединитьСекцию("Заголовок|Отдел");
    //Присоединим столбец с количеством товара на остатке к столбцу с его названием
    Таб.ПрисоединитьСекцию("Товар|Отдел");
    КонецЦикла;
    
    Это чЁ такое?
    Сначала нужно первым проходом сформировать строку заголовка, с присоединениями, и лишь вторым обходом уже формировать строку Товар.

    Закоментите в вашем цикле Таб.ПрисоединитьСекцию("Заголовок|Отдел"); и посмотрите результат - станет понятнее.
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Цикла по запросу будет три...
    1) заголовки
    2) тело
    3) итоги
  7. TopicStarter Overlay
    Konrad
    Offline

    Konrad Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    61
    Симпатии:
    1
    Баллы:
    29
    Спасибо за подсказку, так и сделал, добавил еще кое-что от себя, и все заработало! :angry:

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

    Konrad Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    61
    Симпатии:
    1
    Баллы:
    29
    Ну и результат, собственно, такой примерно каким он планировался:
    [​IMG]

    Осталось добавить пару столбцов, навести красоту в макете отчета, и закрыть тему ;)
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    А пустые строки вам обязательны или это просто не видно столбцов?
  10. TopicStarter Overlay
    Konrad
    Offline

    Konrad Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    61
    Симпатии:
    1
    Баллы:
    29
    Да, здесь просто не видно. А показатели будут дальше, по другим отделам.
  11. dedalx7
    Offline

    dedalx7 Опытный в 1С

    Регистрация:
    20 май 2009
    Сообщения:
    97
    Симпатии:
    0
    Баллы:
    26
    Подозреваю, что так могут получиться пустые столбцы. Думаю в этом случае можно было бы заменить
    Код:
    |Группировка Отдел Все 
    
    на
    Код:
    |Группировка Отдел Все ВошедшиеВЗапрос
    
  12. TopicStarter Overlay
    Konrad
    Offline

    Konrad Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    61
    Симпатии:
    1
    Баллы:
    29
    2 DeDaL_X
    Да, действительно, так стало лучше. Спасибо!

Поделиться этой страницей