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

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

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

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

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

Всем доброго времени суток. У меня есть Макет (Вложение). Вопрос как сделать так что бы последняя колонка добавлялась динамически с учетом Склада. Т.Е. на пример для главного склада  количество соответствующей номенклатуры выводилось в отделном столбце, для след склада в следующем столбце и тд.
вот код котрый делаю но получается чуть не то) помогите пожалуйста)

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

vitasw

Делайте через отчет на СКД. Там проще сделать группировку колонок.

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

Через СКД не подойдет) нужно рукописный код) Но все равно спасибо попробую)

vitasw

У вас вроде все есть для результата. В чем именно вопрос? Покажите скрин результата.

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

Цитата: vitasw от 23 окт 2015, 09:40
У вас вроде все есть для результата. В чем именно вопрос? Покажите скрин результата.

Сейчас изменил чуть чуть код)   
   Пока ВыборкаСклад.Следующий() Цикл
      ОбластьШапкаТаблицыСклады.Параметры.Заполнить(ВыборкаСклад);
      ТабДок.Присоединить(ОбластьШапкаТаблицыСклады);
   КонецЦикла;
   
ВыборкаСклад = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклад.Следующий() Цикл
   
      ВыборкаДетальныеЗаписи = ВыборкаСклад.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
      Пока ВыборкаДетальныеЗаписи.Следующий() Цикл 
         ОбластьДетальныхЗаписейОснова.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
         ТабДок.вывести(ОбластьДетальныхЗаписейОснова, ВыборкаДетальныеЗаписи.Уровень());
         ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
         ТабДок.Присоединить(ОбластьДетальныхЗаписей);
      КонецЦикла ;
   
   КонецЦикла;

но все равно получаю вот такой результат

vitasw

Вы с логикой запутались. Не хочу давать готовый результат, чтобы не лишать вас удовольствия от самостоятельно решенной проблемы.
Попробуйте на словах описать последовательность выборки данных и вывода в макет.

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

Цитата: vitasw от 23 окт 2015, 10:01
Вы с логикой запутались. Не хочу давать готовый результат, чтобы не лишать вас удовольствия от самостоятельно решенной проблемы.
Попробуйте на словах описать последовательность выборки данных и вывода в макет.
Удовольствие я получу в любом случае) потому что кручу этот отчет уже третий день) и каждый раз все ни как) помогите уж мне)Буду признателен)

vitasw

Еще раз повторю, проблема с логикой понмания, а не с кодом. Пока вы для себя не поймете как должен происходить вывод - толку не будет.
Области в макет выводятся с лева на право, сверху вниз.

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

Цитата: vitasw от 23 окт 2015, 11:00
Еще раз повторю, проблема с логикой понмания, а не с кодом. Пока вы для себя не поймете как должен происходить вывод - толку не будет.
Области в макет выводятся с лева на право, сверху вниз.
Ну тогда помогите мне с логическим решением) Направьте в нужное русло) ни как не получается у меня этот отчет)
Каак работает Присоеденить я понял е могу понять к чему присоеденять его)

vitasw

Чтобы вывести шапку отчета нужно вывести секцию "Основа". Затем перебирать выборку запроса по группировке "Склад" и присоединять секцию "СкладКолонки".
Начинаем выводить строки.
Теперь нужно перебирать номенклатуру без учета складов и выводим секцию "Детали|Основа". Внутри перебора по номенклатуре нужен цикл перебора по складам. И уже внутри цикла по складам присоединяем секцию "Детали|СкладКолонки".

Теги:

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

Рейтинг@Mail.ru

Поиск