7.7 Две таблицы в одном отчете

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем ixxvivxxi, 16 мар 2010.

  1. TopicStarter Overlay
    ixxvivxxi
    Offline

    ixxvivxxi

    Регистрация:
    8 май 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Подскажите как из данных 2-ух запросов сформировать 2 таблицы на одном листе параллельно друг другу.
  2. Steel Rain
    Offline

    Steel Rain Опытный в 1С

    Регистрация:
    29 сен 2006
    Сообщения:
    408
    Симпатии:
    2
    Баллы:
    29
    Как вариант, выгрузить значения Запросов в ТЗ и выводить данные из ТЗ как нравиться.
  3. TopicStarter Overlay
    ixxvivxxi
    Offline

    ixxvivxxi

    Регистрация:
    8 май 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Хотелось бы узнать сам процесс формирования табличной части, просто у меня получается только одна за другой, а хотелось бы параллельно.
  4. Mitay_D
    Offline

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26
    Покажи печатную форму!
  5. TopicStarter Overlay
    ixxvivxxi
    Offline

    ixxvivxxi

    Регистрация:
    8 май 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
  6. Mitay_D
    Offline

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26
    давай еще свой отчет кидай!
  7. TopicStarter Overlay
    ixxvivxxi
    Offline

    ixxvivxxi

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

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26
    У тебя 2-а разных запроса! На выходе 2-е таблицы, если ты хочешь, чтобы они у тебя соприкасались, то тогда убери расстояние между ними! или ты хочешь, чтобы они были взаимосвязаны? Уточни результат на выходе!
  9. TopicStarter Overlay
    ixxvivxxi
    Offline

    ixxvivxxi

    Регистрация:
    8 май 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    нужно две таблицы на одном листе - одна слева, другая справа, с промежутком в одну колонку
  10. Mitay_D
    Offline

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26
    а у тебя получается, что в начале печатается "1", потом присоединяется "2"?
  11. TopicStarter Overlay
    ixxvivxxi
    Offline

    ixxvivxxi

    Регистрация:
    8 май 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    ну да, а как по-другому??
  12. Mitay_D
    Offline

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26
    Код:
    	ТЗ = СоздатьОбъект("ТаблицаЗначений"); 
    ТЗ.НоваяКолонка("Контрагент");  
    ТЗ.НоваяКолонка("ВидДеятельности"); 
    ТЗ.НоваяКолонка("Командировка");
    ТЗ.НоваяКолонка("Дата"); 
    ТЗ.НоваяКолонка("КоличествоТочно"); 
    ТЗ.НоваяКолонка("Количество"); 
    // Запрос
    Пока Запрос.Группировка("Дата") = 1 Цикл  
    Пока Запрос.Группировка("КоличествоТочно") = 1 Цикл 
    ТЗ.Контаргент = Запрос.Контрагент;
    и т.д.
    КонецЦикла
    ТЗ.Свернуть("Контрагент","Дата,Количество");      // вобщем здесь возмешь то что тебе надо  
    ТЗ.Сортировать("Контрагент");         // сортировка, в данном случае по контрагенту
    

    потом создаешь перед 2-м запросом еще таблицуЗначений
    ТАбЗнач = .........
    и так далее, а потом в конце выводишь все значения создаешь любые переменные хоть "горшок".
    Горшок = ТЗ.Контрагент
    в таблице пишешь горшок и получаешь все как надо! примерно так
  13. TopicStarter Overlay
    ixxvivxxi
    Offline

    ixxvivxxi

    Регистрация:
    8 май 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Спасибо, суть понял, буду пробовать.
  14. Mitay_D
    Offline

    Mitay_D Опытный в 1С

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

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26
  16. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Видно телепат :)

    Честно говоря, даже я не понял, что Mitay_D имел в виду.

    Тебе надо сначала выполнить оба запроса, а потом параллельно их перебирать и выводить.

    Суть сводится к следующему: таблица формируется, в общем случае, построчно. Поэтому делаешь так:
    Выводишь шапку Т1, присоединяешь шапку Т2.
    Выводишь Строку Т1, присоединяешь Строку Т2.
    Выводишь Строку Т1, присоединяешь Строку Т2.
    ......
    Выводишь Строку Т1, присоединяешь Строку Т2.

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

    Если все же использовать общую мысль Mitay_D, то нужно выгрузить значения из обоих запросов в одну ТЗ (кстати, есть метод Выгрузить), а потом перебирать строки ТЗ для вывода. Но проблем при таком случае не меньше.

    Как вариант, можно сильно упростить предыдущий алгоритм, если все же выгрузить запросы в разные ТЗ. Отдельно их обработать, а потом в цикле от 1 до (макс(колвоСтрок1, колвоСтрок2)) делать проверку на попадание каждой таблицы в данный диапазон и собирать итоговый макет по секциям.
  17. Mitay_D
    Offline

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26

    Как было написано выше было предложен вариант "Как я думаю" ))) а "Выгрузить" действительно забыл!
  18. TopicStarter Overlay
    ixxvivxxi
    Offline

    ixxvivxxi

    Регистрация:
    8 май 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Вобщем способ Mitay_D дает примерно тот же результат что и мой без ТЗ

    - как это сделать?
  19. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Добавляете еще горизонтальную секцию без выражений/шаблонов
  20. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Менять алгоритм. Тут простым перебором ничего не получится. Или одним совмещенным циклом, или тремя отдельными (2 подготовочных, третий для вывода)

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