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

Помогите, плиз сделать отчет с вертикальными секциями

Автор yury, 12 апр 2010, 10:19

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

yury

Здравствуйте, уважаемые фомрумчане!

Помогите чайнику сделать отчет в нужной форме.

Есть вот такой процедура для формирования отчета:
================================================================
Процедура Взаиморасчеты02()
   Перем ЗапросНоменклатуры, ЗапросНоменклатурыТекст, Таб;
   Перем ЗапросПоРегиону, ЗапросаПоРегионуТекст;

   ЗапросНоменклатуры = СоздатьОбъект("Запрос");

   ЗапросНоменклатурыТекст =
      "//{{ЗАПРОС(Заявки)
      |Период с ВыбНачПериода по ВыбКонПериода;
      |Номенклатура = Регистр.Заявки.Номенклатура;
        |Контрагент = Регистр.Заявки.Контрагент;
        |Регион = Регистр.Заявки.Регион;
        |Док = Регистр.Заявки.Документ;
      |Количество = Регистр.Заявки.Количество; 
      |Функция КоличествоПриход = Приход(Количество);
      |Группировка Регион Упорядочить По Регион.Наименование;
      |Группировка Контрагент Упорядочить По Контрагент.Наименование;
      |Группировка Номенклатура Упорядочить По Номенклатура.Наименование;";
   
     Если (ВыбранРегион.Выбран () = 0) Тогда
       ЗапросНоменклатурыТекст = ЗапросНоменклатурыТекст + "
       |";//}}ЗАПРОС"
     ИначеЕсли (ВыбранРегион.Выбран () = 1) и (ИсклРегион = 1) Тогда
         ЗапросНоменклатурыТекст = ЗапросНоменклатурыТекст + "
         |Условие (Регион <> ВыбранРегион);
         |";//}}ЗАПРОС"                   
   Иначе
         ЗапросНоменклатурыТекст = ЗапросНоменклатурыТекст + "
         |Условие (Регион = ВыбранРегион);
         |";//}}ЗАПРОС"                   
     КонецЕсли;

      


   // Если ошибка в запросе, то выход из процедуры
   Если ЗапросНоменклатуры.Выполнить(ЗапросНоменклатурыТекст) = 0 Тогда
      Возврат;
   КонецЕсли;


   ЗапросПоРегиону = СоздатьОбъект("Запрос");

   ЗапросПоРегионуТекст =
      "//{{ЗАПРОС(Заявки1)
      |Период с ВыбНачПериода по ВыбКонПериода;
      |Номенклатура = Регистр.Заявки.Номенклатура;
        |Регион = Регистр.Заявки.Регион;
      |Количество = Регистр.Заявки.Количество; 
      |Функция КоличествоПриход = Приход(Количество);
      |Группировка Номенклатура Упорядочить По Номенклатура.Наименование;";

      
      
      
   
   // Подготовка к заполнению выходных форм данными запроса
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("ЗаявкиНовая");
   // Заполнение полей "Заголовок"
   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); 
   Пока ЗапросНоменклатуры.Группировка ("Регион") = 1 Цикл
       Таб.ВывестиСекцию("Регион");
      Пока ЗапросНоменклатуры.Группировка ("Контрагент") = 1 Цикл
         Если ЗапросНоменклатуры.Контрагент.ЭтоГруппа () = 0 Тогда
            Таб.ВывестиСекцию("Контрагент");
            Пока ЗапросНоменклатуры.Группировка ("Номенклатура") = 1 Цикл
                Если ЗапросНоменклатуры.Номенклатура.ЭтоГруппа () = 0 Тогда
                   Док = ЗапросНоменклатуры.Док;
                  Таб.ВывестиСекцию("ГорНоменклатура");   
                КонецЕсли;
            КонецЦикла; // Номенклатура
            Таб.ВывестиСекцию("ИтогоПоКонтрагенту");   
         КонецЕсли;
      КонецЦикла; // Контрагент
      
      Таб.ВывестиСекцию("ИтогоПоРегиону");   
      
         ЗапросПоРегионуТекст = ЗапросПоРегионуТекст + "
            |Условие (Регион = ЗапросНоменклатуры.Регион);
            |";//}}ЗАПРОС"
      

        // Если ошибка в запросе, то выход из процедуры
      Если ЗапросПоРегиону.Выполнить(ЗапросПоРегионуТекст) = 0 Тогда
         Возврат;
      КонецЕсли;                                   
      
      Пока ЗапросПоРегиону.Группировка (1) =1 Цикл   
         Если ЗапросПоРегиону.Номенклатура.ЭтоГруппа () =  0 Тогда
            Таб.ВывестиСекцию("НоменклатураПоРегиону");   
         КонецЕсли;
      КонецЦикла;
      
      Таб.ВывестиСекцию("Разделитель");   
      
   КонецЦикла; // Регион

   // Вывод заполненной формы
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Заявки покупателей", "");
КонецПроцедуры   
================================================================

Получаю отчет вот в такой форме:
============================================================================
Заявки покупателей за период 31.03.10 - 31.03.10                     
                     
Н.Новгород                     
ООО "Мерканто" пл. Горького                     
Классический заварной ржаной хлеб "Боярский" 160 г                     2
Классический заварной ржаной хлеб "Боярский" 400 г                     2
Пшеничнзаварной кислосладкий хлеб Домашний 400 г                     2
Ржаной заварной кислосладкий хлеб "Купеческий"400г                     2
Ржаной заварной кислосладкий хлеб"Купеческий"160г                     2
Хл из  ржан-пшен муки завар под"Дворянский"160г                     2
Хл из  ржан-пшен муки завар под"Деревенский"160г                     2
Хлеб ржаной с орех и сухофрукт "Праздничный"400г                     2
Итого по ООО "Мерканто" пл. Горького                     16
                     
ООО "Прод-серв" Сп НН Белинск                     
Классический заварной ржаной хлеб "Боярский" 160 г                     6
Классический заварной ржаной хлеб "Боярский" 400 г                     4
Ржаной заварной кислосладкий хлеб"Купеческий"160г                     6
Хл из  ржан-пшен муки завар под"Дворянский"160г                     6
Хл из  ржан-пшен муки завар под"Деревенский"160г                     6
Хлеб ржаной с орех и сухофрукт "Праздничный"400г                     5
Итого по ООО "Прод-серв" Сп НН Белинск                     33
============================================================================
Хотелось бы получить отчет с вертикальными секциями, где наименования номенклатуры должны выводиться вертикальными секциями,
вот в таком варианте:

                                              Товар1       Товар2 .....
Регион: Регион 1
Контраагент1
Контраагент2
...
КонтрагентN
Итого по региону Регион 1

Помогите разобраться, пожалуйста.


Myti

так,сделай,в чем проблема,,,в запросе группировка по номенклат идет,

yury

Так если бы мог, не спрашивал. Я понимаю, что все данные есть. Но как вывести в нужной форме не понимаю.

Myti

ВывестиСекцию(<?>);
Синтаксис:
ВывестиСекцию(<ИмяСекции>)
Назначение:
Перенести секцию исходной таблицы-шаблона в результирующую таблицу.
Параметры:
<ИмяСекции> - выражение типа строка, задающее имя выводимой секции, или значение типа секция, полученное при помощи метода ПолучитьСекцию.
Имя секции задается строковым выражением следующего формата:
ИдентификаторСекции1[<|>|-][|ИдентификаторСекции2[<|>|-]]
Символы ''<'' , ''>'' , ''-'' после идентификатора секции указывают на то, что выбирается только часть секции. ''<'' -   заголовочная часть (с начала секции до начала вложенной секции). ''>'' - подвальная часть (с конца вложенной секции до конца секции). ''-'' - средняя часть (собственно вложенная секция).
В выражении можно задавать имена двух секций, разделенных знаком ''|''. При этом будет получена область исходной таблицы, являющаяся пересечением первой и второй указанных секций. При этом одна секция может быть горизонтальной (состоять из строк), а другая - вертикальной (состоять из колонок). В результате получится прямоугольная область таблицы.


===================
ИдентификаторСекции2 - суда указываешь вертик секцию

yury

Цитата: Myti от 12 апр 2010, 10:58
ИдентификаторСекции2 - суда указываешь вертик секцию
Вот как раз в этом месте и не понятно, Как должны выглядеть вертикальная секция и где (в каком цикле) ее выводить??

Опыт по созданию отчетов и написанию запросов есть, но вот никак не могу понять как работать с вертикальными секциями.

Myti

Перем СписокПодбора,СправочникПодбора;

//*******************************************
Процедура Печать(ТабЯчейки)
   ПечЗанято = 0;
   ПечМест = ТабЯчейки.КоличествоСтрок();
   ТабЯчейки.ВыбратьСтроки();
   Пока ТабЯчейки.ПолучитьСтроку() = 1 Цикл
      Если ТабЯчейки.Остаток > 0 Тогда
         ПечЗанято = ПечЗанято + 1;           
      КонецЕсли;
   КонецЦикла;
   ПечСвободно = ПечМест - ПечЗанято;
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Таблица");
   Таб.ВывестиСекцию("Шапка");   
   ТабЯчейки.Сортировать("Проезд+,Ярус-,Стеллаж+,Позиция+");
   ТабЯчейки.ВыбратьСтроки();
   ПечПроезд = "";
   ПредПозиция = 0;
   ТабПроезд = СоздатьОбъект("ТаблицаЗначений");
   ТабПроезд.НоваяКолонка("Ячейка");
   ТабПроезд.НоваяКолонка("Стеллаж");
   ТабПроезд.НоваяКолонка("Ярус");
   ТабПроезд.НоваяКолонка("Позиция");
   ТабПроезд.НоваяКолонка("Остаток","Число");
   Пока ТабЯчейки.ПолучитьСтроку() = 1 Цикл
      Если ПечПроезд <> ТабЯчейки.Проезд Тогда
         Если ТабПроезд.КоличествоСтрок() > 0 Тогда
            ПечЯрус = "";
            ТабПроезд.ВыбратьСтроки();
            ОстПаллет = 0;
            Пока ТабПроезд.ПолучитьСтроку() = 1 Цикл
               Если ПечЯрус <> ТабПроезд.Ярус Тогда
                  ПечЯрус = ТабПроезд.Ярус;
                  Таб.ВывестиСекцию("Ячейка1|Ярус");
                  ПредПозиция = 0;
               КонецЕсли;
               ПечЯчейка = ТабПроезд.Позиция;
               Если ((ПредПозиция > ПечЯчейка) и (ПредПозиция <> 3)) или (ПредПозиция = ПечЯчейка) Тогда
                  Для к = ПредПозиция по 2 Цикл
                     Таб.ПрисоединитьСекцию("Ячейка3|Ячейка");
                  КонецЦикла;
               ИначеЕсли (ПредПозиция = 0) и (ПечЯчейка <> 1) Тогда
                  Для к = 2 по ПечЯчейка Цикл
                     Таб.ПрисоединитьСекцию("Ячейка3|Ячейка");
                  КонецЦикла;
               ИначеЕсли (ПредПозиция = 3) и (ПечЯчейка <> 1) Тогда
                  Для к = 1 по (ПечЯчейка - 1) Цикл
                     Таб.ПрисоединитьСекцию("Ячейка3|Ячейка");
                  КонецЦикла;
               ИначеЕсли (ПредПозиция < ПечЯчейка - 1) Тогда
                  Пока ПредПозиция <> ПечЯчейка - 1 Цикл
                     Таб.ПрисоединитьСекцию("Ячейка3|Ячейка");
                     ПредПозиция = ПредПозиция + 1;
                  КонецЦикла;
               КонецЕсли;
               Если ТабПроезд.Остаток > 0 Тогда
                  ПечЯ = Строка(ТабПроезд.Остаток);
                  ОстПаллет = ОстПаллет + 1;
                  Таб.ПрисоединитьСекцию("Ячейка2|Ячейка");
               Иначе
                  Таб.ПрисоединитьСекцию("Ячейка1|Ячейка");
                  
            КонецЕсли;
               //Сообщить(""+ТабПроезд.Остаток+"");
               ПредПозиция = ТабПроезд.Позиция;
            КонецЦикла;
            ПечМестРяд = ТабПроезд.КоличествоСтрок();
            ПечЗанятоРяд = ОстПаллет;
            ПечСвободноРяд = ПечМестРяд - ПечЗанятоРяд;
            Таб.ВывестиСекцию("Подвал|Ярус");
            ТабПроезд.УдалитьСтроки();
         КонецЕсли;
         ПечПроезд = ТабЯчейки.Проезд;
         Таб.ВывестиСекцию("Проезд|Ярус");
         ТекСтеллаж = "";
      КонецЕсли;
      ТСтеллаж = ТабЯчейки.Стеллаж;
      Если ТекСтеллаж <> ТСтеллаж Тогда
         ТСтеллаж = ТабЯчейки.Стеллаж;
         ПечЯчейка = "Стеллаж " + Строка(ТСтеллаж);
         Если ТекСтеллаж = "" Тогда
            Таб.ВывестиСекцию("Ячейка3|Ярус");
            ПредПозиция = 0;
            Таб.ПрисоединитьСекцию("Ячейка4|Стеллаж");
         Иначе
            Таб.ПрисоединитьСекцию("Ячейка4|Стеллаж");
         КонецЕсли;
         ТекСтеллаж = ТабЯчейки.Стеллаж;
      КонецЕсли;
      ТабПроезд.НоваяСтрока();      
      ТабПроезд.Ячейка = ТабЯчейки.Ячейка;;
      ТабПроезд.Стеллаж = ТабЯчейки.Стеллаж;
      ТабПроезд.Ярус = ТабЯчейки.Ярус;
      ТабПроезд.Позиция = ТабЯчейки.Позиция;
      ТабПроезд.Остаток = ТабЯчейки.Остаток;
   КонецЦикла;
   Если ТабПроезд.КоличествоСтрок() > 0 Тогда
      ПечЯрус = "";
      ТабПроезд.ВыбратьСтроки();
      ОстПаллет = 0;
      Пока ТабПроезд.ПолучитьСтроку() = 1 Цикл
         Если ПечЯрус <> ТабПроезд.Ярус Тогда
            ПечЯрус = ТабПроезд.Ярус;
            Таб.ВывестиСекцию("Ячейка1|Ярус");
            ПредПозиция = 0;
         КонецЕсли;
         ПечЯчейка = ТабПроезд.Позиция;
         Если ((ПредПозиция > ПечЯчейка) и (ПредПозиция <> 3)) или (ПредПозиция = ПечЯчейка) Тогда
            Для к = ПредПозиция по 2 Цикл
               Таб.ПрисоединитьСекцию("Ячейка3|Ячейка");
            КонецЦикла;
         ИначеЕсли (ПредПозиция = 0) и (ПечЯчейка <> 1) Тогда
            Для к = 2 по ПечЯчейка Цикл
               Таб.ПрисоединитьСекцию("Ячейка3|Ячейка");
            КонецЦикла;
         ИначеЕсли (ПредПозиция = 3) и (ПечЯчейка <> 1) Тогда
            Для к = 1 по (ПечЯчейка - 1) Цикл
               Таб.ПрисоединитьСекцию("Ячейка3|Ячейка");
            КонецЦикла;
         ИначеЕсли (ПредПозиция < ПечЯчейка - 1) Тогда
            Пока ПредПозиция <> ПечЯчейка - 1 Цикл
               Таб.ПрисоединитьСекцию("Ячейка3|Ячейка");
               ПредПозиция = ПредПозиция + 1;
            КонецЦикла;
         КонецЕсли;
         
         Если ТабПроезд.Остаток > 0 Тогда
            ОстПаллет = ОстПаллет + 1;
            ПечЯ = Строка(ТабПроезд.Остаток);
            //ПечЯ = Строка(ПечЯчейка) +" "+ Строка(ТабПроезд.Остаток);
            Таб.ПрисоединитьСекцию("Ячейка2|Ячейка");
            ПредПозиция = ПечЯчейка;
         Иначе
            Таб.ПрисоединитьСекцию("Ячейка1|Ячейка");
            ПредПозиция = ПечЯчейка;
         КонецЕсли;
      КонецЦикла;
      ПечМестРяд = ТабПроезд.КоличествоСтрок();
      ПечЗанятоРяд = ОстПаллет;
      ПечСвободноРяд = ПечМестРяд - ПечЗанятоРяд;
      Таб.ВывестиСекцию("Подвал|Ярус");
   КонецЕсли;
   Таб.Опции(0,0,0,0,"Карта склада","Карта склада");                                                         
   Таб.ТолькоПросмотр(1);
   Таб.Показать();   
   
КонецПроцедуры 

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


///******************************************************************
Процедура РаботаСоСписком(Режим,Список,ТипСправочника)
   Перем ТекПоз;
   Перем ТекЭлемент;
   Перем Фрм;
   
   ТекПоз = Список.ТекущаяСтрока();
   Если ТекПоз>0 Тогда
      ТекЭлемент=Список.ПолучитьЗначение(ТекПоз);
   КонецЕсли;
   
   Если Режим="Добавить" Тогда   
      СписокПодбора = Список;
      СправочникПодбора = ВРег(ТипСправочника);
      ОткрытьПодбор("Справочник."+ТипСправочника,,Фрм,0,ТекЭлемент);
      Фрм.ВыборГруппы(1);
   ИначеЕсли Режим="ДобавитьНесколько" Тогда
      СписокПодбора = Список;
      СправочникПодбора = ВРег(ТипСправочника);
      ОткрытьПодбор("Справочник."+ТипСправочника,,Фрм,1,ТекЭлемент);
      Фрм.ВыборГруппы(1);
   ИначеЕсли Режим="УдалитьВсе" Тогда
      Список.УдалитьВсе();
   ИначеЕсли Режим="Удалить" Тогда
      Если ТекПоз>0 Тогда
         Список.УдалитьЗначение(ТекПоз);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

//*****************************************************************
Процедура ОбработкаПодбора(Значение) 
   Если (ВРег(Значение.Вид())=СправочникПодбора)И(СписокПодбора.НайтиЗначение(Значение)=0) Тогда
      СписокПодбора.ДобавитьЗначение(Значение);
      СписокПодбора.ТекущаяСтрока(СписокПодбора.РазмерСписка());
   КонецЕсли;
КонецПроцедуры 

ТекДата=ПолучитьДатуТА();

=============================

ярус,стеллаж,ячейка - вертикальные

Myti


yury


Tatitutu


*  MAGAZKA - лучшая программа для розничного магазина (с) *

yury


Теги:

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

Рейтинг@Mail.ru

Поиск