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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Вывод массива табличных документов на печать

Автор: rpervak 29.12.15, 14:43

Здравствуйте !
1С:Предприятие 8.2 (8.2.19.121)
УПП (1.3.39.1)

У меня есть отчет, в котором выводятся данные в табличный документ, указав параметр "Договор"
Я сделал выборку по договорам запросом и перебираю результат циклом. При этом при n договоров формируется n табличных документов.
Как сделать, что-бы n табличных документов выводились в один макет ?
Спасибо.

Автор: sava1 29.12.15, 15:03

Показать людям код.

Автор: rpervak 29.12.15, 16:11

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

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

    Запрос.УстановитьПараметр("ДоговорКонтрагента", Договор);
    Запрос.УстановитьПараметр("Контрагент",         Контрагент);

    Результат = Запрос.Выполнить();

    ТЗ = Результат.Выгрузить();
    
    НайденныеСтроки = ТЗ.НайтиСтроки(Новый Структура("СуммаВзаиморасчетовРасход",0));
    
    Для Каждого Стр Из НайденныеСтроки Цикл
        ТЗ.Удалить(Стр);
    КонецЦикла;
    
    ТЗ.Сортировать("ДатаДокумента");
    
    ТабДок = Новый ТабличныйДокумент;
    Макет  = ПолучитьМакет("Макет");
    
    ОбластьШапка              = Макет.ПолучитьОбласть("Шапка");
    ОбластьОплата             = Макет.ПолучитьОбласть("Оплата");
    ОбластьПоступление        = Макет.ПолучитьОбласть("Отгрузка");
    ОбластьПоступлениеКрасная = Макет.ПолучитьОбласть("ОтгрузкаКрасная");
    
    ОбластьДолг               = Макет.ПолучитьОбласть("Долг");
    ОбластьДолгПоДокументу    = Макет.ПолучитьОбласть("ДолгПоДокументу");
    
    ОбластьДолгПоПоступлению  = Макет.ПолучитьОбласть("ДолгПоПоступлению");
    
    ОбластьШапка.Параметры.Контрагент = Контрагент;
    ОбластьШапка.Параметры.Договор = Договор;
    ОбластьШапка.Параметры.Валюта =  Договор.ВалютаВзаиморасчетов;
    
    ТабДок.Вывести(ОбластьШапка);    
    
    // СЕКЦИЯ ДОЛГ
    Фильтр = Новый Структура("Контрагент,ДоговорКонтрагента", Контрагент, Договор);
    ДолгНаНачало = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.Остатки(НачПериода, Фильтр, "Контрагент,ДоговорКонтрагента", "СуммаВзаиморасчетов");
    
    ОбластьДолг.Параметры.ТекстСальдо = "Сальдо на початок періоду:";
    ОбластьДолг.Параметры.Долг        = ДолгНаНачало.Итог("СуммаВзаиморасчетов");
    ТабДок.Вывести(ОбластьДолг);    
    
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        Если Выборка.СуммаВзаиморасчетовПриход = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        Если Выборка.СуммаВзаиморасчетовПриход = Выборка.СуммаВзаиморасчетовРасход Тогда
            Продолжить;
        КонецЕсли;
        
        ДатаОплаты         = НачалоДня(Выборка.ДатаДокумента);
        ГраницаПоступления = ДатаОплаты + (ОтсрочкаПоставкиДней - 1) * 24 * 60 * 60;
        
        СумаОплаты = Выборка.СуммаВзаиморасчетовПриход;
        
        ОбластьОплата.Параметры.ДокОплаты          = Выборка.Регистратор;
        ОбластьОплата.Параметры.СумаОплаты         = СумаОплаты;
        ОбластьОплата.Параметры.ГраницаПоступления = ГраницаПоступления;
        
        Если ДатаОплаты >= НачалоДня(НачПериода) И ДатаОплаты <= КонецДня(КонПериода) Тогда
            ТабДок.Вывести(ОбластьОплата);            
        КонецЕсли;
        
        Для Каждого Стр Из ТЗ Цикл
            
            Если Стр.СуммаВзаиморасчетовРасход = 0 Тогда
                Продолжить;
            КонецЕсли;
            
            Если СумаОплаты <= 0 Тогда
                Прервать;
            КонецЕсли;
            
            СумаПоступления = Мин(Стр.СуммаВзаиморасчетовРасход, СумаОплаты);
            
            ОбластьВывода = ?(НачалоДня(Стр.ДатаДокумента) > ГраницаПоступления, ОбластьПоступлениеКрасная, ОбластьПоступление);
            
            ОбластьВывода.Параметры.ГраницаПоставки = ГраницаПоступления;
            ОбластьВывода.Параметры.СумаПоступления = СумаПоступления;
            ОбластьВывода.Параметры.ДокПоступления  = Стр.Регистратор;
            ОбластьВывода.Параметры.НомерВМД        = Стр.НомерВМД;
            
            ДатаРеализации = Стр.Регистратор.Дата;
            
            Если ДатаРеализации >= НачалоДня(НачПериода) И ДатаРеализации <= КонецДня(КонПериода) Тогда
                ТабДок.Вывести(ОбластьВывода);    
            КонецЕсли;
            
            Стр.СуммаВзаиморасчетовРасход = Стр.СуммаВзаиморасчетовРасход - СумаПоступления;
            
            СумаОплаты = СумаОплаты - СумаПоступления;
            
        КонецЦикла;
        
        Если СумаОплаты > 0 Тогда
            
            ОбластьДолгПоДокументу.Параметры.ДокОплаты  = Выборка.Регистратор;
            ОбластьДолгПоДокументу.Параметры.СуммаДолга = СумаОплаты;
            //ОбластьДолгПоДокументу.Параметры.НомерВМД   = Выборка.НомерВМД;
            
            ТабДок.Вывести(ОбластьДолгПоДокументу);    
            
        КонецЕсли;
        
        НайденныеСтроки = ТЗ.НайтиСтроки(Новый Структура("СуммаВзаиморасчетовРасход",0));
        
        Для Каждого Стр Из НайденныеСтроки Цикл
            ТЗ.Удалить(Стр);
        КонецЦикла;
        
        ТЗ.Сортировать("ДатаДокумента");
        
    КонецЦикла;
    
    // СЕКЦИЯ ПОСТУПЛЕНИЯ БЕЗ ОПЛАТЫ
    Для Каждого Стр Из ТЗ Цикл
        
        Если Стр.СуммаВзаиморасчетовРасход = 0 Тогда
            Продолжить;
        КонецЕсли;
                
        СумаПоступления = Стр.СуммаВзаиморасчетовРасход;
        
        ОбластьДолгПоПоступлению.Параметры.СумаПоступления = СумаПоступления;
        ОбластьДолгПоПоступлению.Параметры.ДокПоступления  = Стр.Регистратор;
        ОбластьДолгПоПоступлению.Параметры.НомерВМД        = Стр.НомерВМД;
        
        ДатаРеализации = Стр.Регистратор.Дата;
        
        Если ДатаРеализации >= НачалоДня(НачПериода) И ДатаРеализации <= КонецДня(КонПериода) Тогда
            ТабДок.Вывести(ОбластьДолгПоПоступлению);    
        КонецЕсли;
        
        Стр.СуммаВзаиморасчетовРасход = Стр.СуммаВзаиморасчетовРасход - СумаПоступления;
        
    КонецЦикла;

    // СЕКЦИЯ ДОЛГ
    ДолгНаНачало = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.Остатки(КонецДня(КонПериода), Фильтр, "Контрагент,ДоговорКонтрагента", "СуммаВзаиморасчетов");
    
    ОбластьДолг.Параметры.ТекстСальдо = "Сальдо на кінець періоду:";
    ОбластьДолг.Параметры.Долг        = ДолгНаНачало.Итог("СуммаВзаиморасчетов");
    ТабДок.Вывести(ОбластьДолг);    
    
    ТабДок.ТолькоПросмотр = Истина;        
    ТабДок.Показать();    
КонецЦикла;
    
КонецПроцедуры

Автор: sava1 29.12.15, 19:33

Цитата(rpervak @ 29.12.15, 16:11) http://pro1c.org.ua/index.php?act=findpost&pid=106750
    ТабДок.ТолькоПросмотр = Истина;        
    ТабДок.Показать();   

Вынести за КонецЦикла

При этом желательно вставить какой-либо разделитель в конце ОбластьДолг

Автор: rpervak 30.12.15, 11:20

Спасибо ! Все получилось.

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