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

Динамическое добавление Столбцов

Автор Пустовалов Артем, 22 окт 2015, 16:41

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

Kironten

Еще раз.
Присоединить работает слева направо.
Ваш пример:
Сначала выводим область "заголовок".
Выводим область "областьшапкатаблицы"
Далее, нужно перебрать все возможные склады, какие у вас есть в отчете.
Можно например сделать массив входящих в отчет складов и в цикле его перебрать:

Для Каждого Склад Из МассивСкладов Цикл
    ОбластьШапкаТаблицыСклады.Параметры.Склад = Склад;
    ТабДок.Вывести(ОбластьШапкаТаблицыСклады);
КонецЦикла


Этим вы получите всю шапку складов.
Общие итоги я опущу. Если хотите обойдите выборку сразу и посчитайте, но это получится 2 прогона. С итогами по складу, то же самое.

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


И вот так вот, сверху вниз, слева направо. Принцип именно такой.
В общем, вы сами себе этот "геморрой" придумали.

Пустовалов Артем

Наконец то сделал) спасибо за помощь) Вот такой текст получился) Вдруг кому то понадобится)

ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;   
   Макет = ВнешнийОтчетОбъект.ПолучитьМакет("Отчет");
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |   ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
   |   ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
   |   ЦеныНоменклатурыСрезПоследних.Цена,
   |   ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
   |   ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток * (ЦеныНоменклатурыСрезПоследних.Цена * ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения.Коэффициент / ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент) КАК СуммаНачальная,
   |   ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
   |   ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход * (ЦеныНоменклатурыСрезПоследних.Цена * ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения.Коэффициент / ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент) КАК СуммаПриход,
   |   ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
   |   ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход * (ЦеныНоменклатурыСрезПоследних.Цена * ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения.Коэффициент / ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент) КАК СуммаРасход,
   |   ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
   |   ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток * (ЦеныНоменклатурыСрезПоследних.Цена * ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения.Коэффициент / ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент) КАК СуммаКонечная,
   |   ЦеныНоменклатурыСрезПоследних.Валюта
   |ПОМЕСТИТЬ ВеменныеОст
   |ИЗ
   |   РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
   |         &НачалоПериода,
   |         &КонецПериода,
   |         ,
   |         ,
   |         Склад = &Склад
   |            ИЛИ &Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)) КАК ТоварыНаСкладахОстаткиИОбороты
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&КонецПериода, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
   |      ПО ТоварыНаСкладахОстаткиИОбороты.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ВеменныеОст.Склад КАК Склад,
   |   ВеменныеОст.Номенклатура,
   |   ВеменныеОст.Цена,
   |   ВеменныеОст.КоличествоНачальныйОстаток,
   |   СУММА(ВеменныеОст.СуммаНачальная * КурсыВалютСрезПоследних.Курс) КАК СуммаНачальная,
   |   ВеменныеОст.КоличествоПриход,
   |   СУММА(ВеменныеОст.СуммаПриход * КурсыВалютСрезПоследних.Курс) КАК СуммаПриход,
   |   ВеменныеОст.КоличествоРасход,
   |   СУММА(ВеменныеОст.СуммаРасход * КурсыВалютСрезПоследних.Курс) КАК СуммаРасход,
   |   ВеменныеОст.КоличествоКонечныйОстаток,
   |   СУММА(ВеменныеОст.СуммаКонечная * КурсыВалютСрезПоследних.Курс) КАК СуммаКонечная
   |ИЗ
   |   ВеменныеОст КАК ВеменныеОст
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&КонецПериода, ) КАК КурсыВалютСрезПоследних
   |      ПО ВеменныеОст.Валюта = КурсыВалютСрезПоследних.Валюта
   |
   |СГРУППИРОВАТЬ ПО
   |   ВеменныеОст.Склад,
   |   ВеменныеОст.Номенклатура,
   |   ВеменныеОст.Цена,
   |   ВеменныеОст.КоличествоНачальныйОстаток,
   |   ВеменныеОст.КоличествоПриход,
   |   ВеменныеОст.КоличествоРасход,
   |   ВеменныеОст.КоличествоКонечныйОстаток
   |
   |УПОРЯДОЧИТЬ ПО
   |   Склад
   |ИТОГИ ПО
   |   Склад
   |АВТОУПОРЯДОЧИВАНИЕ";
   
   Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
   Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
   Запрос.УстановитьПараметр("Склад", Склад);
   Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
   
   РезультатЗапроса = Запрос.Выполнить();
   
   ОбластьЗаголовок = Макет.ПолучитьОбласть           ("Заголовок");
   ОбластьПодвал = Макет.ПолучитьОбласть              ("Подвал");
   ОбластьШапкаТаблицы = Макет.ПолучитьОбласть           ("ШапкаТаблицы|Основа");
   ОбластьШапкаТаблицыСклады = Макет.ПолучитьОбласть    ("ШапкаТаблицы|СкладКолонки");
   ОбластьПодвалТаблицы = Макет.ПолучитьОбласть        ("ПодвалТаблицы");
   ОбластьОбщийИтог = Макет.ПолучитьОбласть           ("ОбщиеИтоги");
   ОбластьСкладОснова =  Макет.ПолучитьОбласть           ("Склад|Основа");
   ОбластьСклад = Макет.ПолучитьОбласть              ("Склад|СкладКолонки");
   ОбластьДетальныхЗаписейОснова = Макет.ПолучитьОбласть("Детали|Основа");
   ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть       ("Детали|СкладКолонки");
   ПустаяОбласть = Макет.ПолучитьОбласть             ("ПустаяОбласть | СкладКолонки");
   
   ТабДок.Очистить();
   ТабДок.Вывести(ОбластьЗаголовок);
   ТабДок.НачатьАвтогруппировкуСтрок();
   
   
   ВыборкаСклад = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   ТабДок.Вывести(ОбластьШапкаТаблицы);
   
   Пока ВыборкаСклад.Следующий() Цикл
      ОбластьШапкаТаблицыСклады.Параметры.Заполнить(ВыборкаСклад);
      ТабДок.Присоединить(ОбластьШапкаТаблицыСклады,ВыборкаСклад.Уровень());
   КонецЦикла;
   
   ВыборкаСклад = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   Пока ВыборкаСклад.Следующий() Цикл
      ВыборкаДетальныеЗаписи = ВыборкаСклад.Выбрать();
         Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
         
         ОбластьДетальныхЗаписейОснова.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
         ТабДок.вывести(ОбластьДетальныхЗаписейОснова, ВыборкаДетальныеЗаписи.Уровень());
         ВыборкаСклад1 = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Склад");
         
         Пока ВыборкаСклад1.Следующий() Цикл
            Если  ВыборкаСклад1.Склад = ВыборкаСклад.Склад Тогда
               ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
            ТабДок.Присоединить(ОбластьДетальныхЗаписей); Иначе
               ТабДок.Присоединить(ПустаяОбласть);
            КонецЕсли;
         КонецЦикла
      КонецЦикла;
      
   конецЦикла;
   
   ТабДок.ЗакончитьАвтогруппировкуСтрок();
   ТабДок.Вывести(ОбластьПодвалТаблицы);
   ТабДок.Вывести(ОбластьПодвал);

Теги:

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

Рейтинг@Mail.ru

Поиск