Здравствуйте !
1С:Предприятие 8.2 (8.2.19.121)
УПП (1.3.39.1)
У меня есть отчет, в котором выводятся данные в табличный документ, указав параметр "Договор"
Я сделал выборку по договорам запросом и перебираю результат циклом. При этом при n договоров формируется n табличных документов.
Как сделать, что-бы n табличных документов выводились в один макет ?
Спасибо.
Показать людям код.
Процедура КнопкаСформироватьНажатие(Кнопка)
ЗапросНачало = Новый Запрос;
ЗапросНачало.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентов.Владелец КАК Контрагент,
| ДоговорыКонтрагентов.Ссылка КАК Договор,
| ДоговорыКонтрагентов.ВалютаВзаиморасчетов КАК Валюта
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ
| И ДоговорыКонтрагентов.ВалютаВзаиморасчетов <> &Валюта
|
|УПОРЯДОЧИТЬ ПО
| Контрагент";
ЗапросНачало.УстановитьПараметр("Валюта", Справочники.Валюты.НайтиПоКоду(980));
РезультатНачало = ЗапросНачало.Выполнить();
ТЗНачало = РезультатНачало.Выгрузить();
Для Каждого СтрНачало Из ТЗНачало Цикл
Контрагент = СтрНачало.Контрагент;
Договор = СтрНачало.Договор;
//Сообщить("" + Контрагент + Договор);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
| СУММА(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход) КАК СуммаВзаиморасчетовПриход,
| СУММА(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход) КАК СуммаВзаиморасчетовРасход,
| ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.Дата КАК ДатаДокумента,
| ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.НомерВходящегоДокумента КАК НомерВМД
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(
| ,
| ,
| Регистратор,
| Контрагент = &Контрагент
| И ДоговорКонтрагента = &ДоговорКонтрагента) КАК ВзаиморасчетыСКонтрагентамиОбороты
|ГДЕ
| ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход <> ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход
|
|СГРУППИРОВАТЬ ПО
| ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
| ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.Дата,
| ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.НомерВходящегоДокумента
|
|УПОРЯДОЧИТЬ ПО
| ДатаДокумента";
Запрос.УстановитьПараметр("ДоговорКонтрагента", Договор);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
НайденныеСтроки = ТЗ.НайтиСтроки(Новый Структура("СуммаВзаиморасчетовРасход",0));
Для Каждого Стр Из НайденныеСтроки Цикл
ТЗ.Удалить(Стр);
КонецЦикла;
ТЗ.Сортировать("ДатаДокумента");
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьОплата = Макет.ПолучитьОбласть("Оплата");
ОбластьПоступление = Макет.ПолучитьОбласть("Отгрузка");
ОбластьПоступлениеКрасная = Макет.ПолучитьОбласть("ОтгрузкаКрасная");
ОбластьДолг = Макет.ПолучитьОбласть("Долг");
ОбластьДолгПоДокументу = Макет.ПолучитьОбласть("ДолгПоДокументу");
ОбластьДолгПоПоступлению = Макет.ПолучитьОбласть("ДолгПоПоступлению");
ОбластьШапка.Параметры.Контрагент = Контрагент;
ОбластьШапка.Параметры.Договор = Договор;
ОбластьШапка.Параметры.Валюта = Договор.ВалютаВзаиморасчетов;
ТабДок.Вывести(ОбластьШапка);
// СЕКЦИЯ ДОЛГ
Фильтр = Новый Структура("Контрагент,ДоговорКонтрагента", Контрагент, Договор);
ДолгНаНачало = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.Остатки(НачПериода, Фильтр, "Контрагент,ДоговорКонтрагента", "СуммаВзаиморасчетов");
ОбластьДолг.Параметры.ТекстСальдо = "Сальдо на початок періоду:";
ОбластьДолг.Параметры.Долг = ДолгНаНачало.Итог("СуммаВзаиморасчетов");
ТабДок.Вывести(ОбластьДолг);
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.СуммаВзаиморасчетовПриход = 0 Тогда
Продолжить;
КонецЕсли;
Если Выборка.СуммаВзаиморасчетовПриход = Выборка.СуммаВзаиморасчетовРасход Тогда
Продолжить;
КонецЕсли;
ДатаОплаты = НачалоДня(Выборка.ДатаДокумента);
ГраницаПоступления = ДатаОплаты + (ОтсрочкаПоставкиДней - 1) * 24 * 60 * 60;
СумаОплаты = Выборка.СуммаВзаиморасчетовПриход;
ОбластьОплата.Параметры.ДокОплаты = Выборка.Регистратор;
ОбластьОплата.Параметры.СумаОплаты = СумаОплаты;
ОбластьОплата.Параметры.ГраницаПоступления = ГраницаПоступления;
Если ДатаОплаты >= НачалоДня(НачПериода) И ДатаОплаты <= КонецДня(КонПериода) Тогда
ТабДок.Вывести(ОбластьОплата);
КонецЕсли;
Для Каждого Стр Из ТЗ Цикл
Если Стр.СуммаВзаиморасчетовРасход = 0 Тогда
Продолжить;
КонецЕсли;
Если СумаОплаты <= 0 Тогда
Прервать;
КонецЕсли;
СумаПоступления = Мин(Стр.СуммаВзаиморасчетовРасход, СумаОплаты);
ОбластьВывода = ?(НачалоДня(Стр.ДатаДокумента) > ГраницаПоступления, ОбластьПоступлениеКрасная, ОбластьПоступление);
ОбластьВывода.Параметры.ГраницаПоставки = ГраницаПоступления;
ОбластьВывода.Параметры.СумаПоступления = СумаПоступления;
ОбластьВывода.Параметры.ДокПоступления = Стр.Регистратор;
ОбластьВывода.Параметры.НомерВМД = Стр.НомерВМД;
ДатаРеализации = Стр.Регистратор.Дата;
Если ДатаРеализации >= НачалоДня(НачПериода) И ДатаРеализации <= КонецДня(КонПериода) Тогда
ТабДок.Вывести(ОбластьВывода);
КонецЕсли;
Стр.СуммаВзаиморасчетовРасход = Стр.СуммаВзаиморасчетовРасход - СумаПоступления;
СумаОплаты = СумаОплаты - СумаПоступления;
КонецЦикла;
Если СумаОплаты > 0 Тогда
ОбластьДолгПоДокументу.Параметры.ДокОплаты = Выборка.Регистратор;
ОбластьДолгПоДокументу.Параметры.СуммаДолга = СумаОплаты;
//ОбластьДолгПоДокументу.Параметры.НомерВМД = Выборка.НомерВМД;
ТабДок.Вывести(ОбластьДолгПоДокументу);
КонецЕсли;
НайденныеСтроки = ТЗ.НайтиСтроки(Новый Структура("СуммаВзаиморасчетовРасход",0));
Для Каждого Стр Из НайденныеСтроки Цикл
ТЗ.Удалить(Стр);
КонецЦикла;
ТЗ.Сортировать("ДатаДокумента");
КонецЦикла;
// СЕКЦИЯ ПОСТУПЛЕНИЯ БЕЗ ОПЛАТЫ
Для Каждого Стр Из ТЗ Цикл
Если Стр.СуммаВзаиморасчетовРасход = 0 Тогда
Продолжить;
КонецЕсли;
СумаПоступления = Стр.СуммаВзаиморасчетовРасход;
ОбластьДолгПоПоступлению.Параметры.СумаПоступления = СумаПоступления;
ОбластьДолгПоПоступлению.Параметры.ДокПоступления = Стр.Регистратор;
ОбластьДолгПоПоступлению.Параметры.НомерВМД = Стр.НомерВМД;
ДатаРеализации = Стр.Регистратор.Дата;
Если ДатаРеализации >= НачалоДня(НачПериода) И ДатаРеализации <= КонецДня(КонПериода) Тогда
ТабДок.Вывести(ОбластьДолгПоПоступлению);
КонецЕсли;
Стр.СуммаВзаиморасчетовРасход = Стр.СуммаВзаиморасчетовРасход - СумаПоступления;
КонецЦикла;
// СЕКЦИЯ ДОЛГ
ДолгНаНачало = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.Остатки(КонецДня(КонПериода), Фильтр, "Контрагент,ДоговорКонтрагента", "СуммаВзаиморасчетов");
ОбластьДолг.Параметры.ТекстСальдо = "Сальдо на кінець періоду:";
ОбластьДолг.Параметры.Долг = ДолгНаНачало.Итог("СуммаВзаиморасчетов");
ТабДок.Вывести(ОбластьДолг);
ТабДок.ТолькоПросмотр = Истина;
ТабДок.Показать();
КонецЦикла;
КонецПроцедуры
Спасибо ! Все получилось.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua