Имя: Пароль:
1C
1С v8
Ежедневный отчет на основе ТОРГ12
,
0 Oleg102
 
23.10.13
14:43
Всем привет! Никак не получается сделать отчет. Делаю отчет на основе ТОРГ12. Вообщем есть таблица где вводятся данные и разделяются строки только по столбцу "Питание" (это Завтрак, обед, ужин, ночное питание). Мне надо вывести это в макет печатной формы в ряд столбцами. Я так думаю надо сделать условие и вставлять исходя по условию по областям. Но не могу додуматься как правильно это сделать. Скрины отчета и таблицы прикладываю.

http://www.fotolink.su/v.php?id=91f329cb187a6da96d664a0edb448896

http://www.fotolink.su/v.php?id=2ef4aecc9fb7736ef3ca727669cc514b

Код:

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


    ТабДокумент.ПолеСверху         = 0;
    ТабДокумент.ПолеСлева          = 0;
    ТабДокумент.ПолеСнизу          = 0;
    ТабДокумент.ПолеСправа         = 0;
    ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РеализацияТоваровУслуг_ТОРГ12ЕжедневныйОтчет";
    
    Макет = ПолучитьОбщийМакет("ТОРГ12ЕжедневныйОтчет");
    
    ОбластьМакетаШапка               = Макет.ПолучитьОбласть("Шапка");
    ОбластьМакетаПитаниеШапкаНЗ      = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтроки");
    ОбластьМакетаПитаниеШапкаЗ       = Макет.ПолучитьОбласть("ШапкаТаблицы|Завтрак");
    ОбластьМакетаПитаниеНомерЗ       = Макет.ПолучитьОбласть("ТаблицаПитание|НомерСтроки");
    ОбластьМакетаПитаниеЗ            = Макет.ПолучитьОбласть("ТаблицаПитание|Завтрак");
    ОбластьМакетаПитаниеШапкаНО      = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтрокиОбед");
    ОбластьМакетаПитаниеШапкаО       = Макет.ПолучитьОбласть("ШапкаТаблицы|Обед");
    ОбластьМакетаПитаниеНомерО       = Макет.ПолучитьОбласть("ТаблицаПитание|НомерСтрокиОбед");
    ОбластьМакетаПитаниеО             = Макет.ПолучитьОбласть("ТаблицаПитание|Обед");
    ОбластьМакетаЗаголовокТаблицы    = Макет.ПолучитьОбласть("ЗаголовокТаб");
    ОбластьМакетаСтрока              = Макет.ПолучитьОбласть("Строка");
    ОбластьМакетаВсего               = Макет.ПолучитьОбласть("Всего");
    ОбластьМакетаПодвал              = Макет.ПолучитьОбласть("Подвал");
    
    // Выводим общие реквизиты шапки


    СведенияОПоставщике       = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.ЮрФизЛицо,        Шапка.ДатаДокумента, , Шапка.БанковскийСчет);
    СведенияОГрузоотправителе = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Грузоотправитель, Шапка.ДатаДокумента);
    СведенияОПокупателе       = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Покупатель,       Шапка.ДатаДокумента);
    СведенияОГрузополучателе  = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Грузополучатель,  Шапка.ДатаДокумента);
    
    ОбластьМакетаШапка.Параметры.Заполнить(Шапка);
    ОбластьМакетаШапка.Параметры.НомерДокумента = ОбщегоНазначения.ПолучитьНомерНаПечать(Шапка);
    ОбластьМакетаШапка.Параметры.ДатаДокумента  = Шапка.ДатаДокумента;
    
        
    Если СокрЛП(Шапка.АдресДоставки) <> "" Тогда
        ПредставлениеГрузополучателяДоАдреса    = ФормированиеПечатныхФорм.ОписаниеОрганизации(
        СведенияОГрузополучателе, "НаименованиеДляПечатныхФорм,ИНН,");
        ПредставлениеГрузополучателяПослеАдреса = ФормированиеПечатныхФорм.ОписаниеОрганизации(
        СведенияОГрузополучателе, "Телефоны,НомерСчета,Банк,БИК,КоррСчет,");
        ОбластьМакетаШапка.Параметры.ПредставлениеГрузополучателя = ?(СокрЛП(ПредставлениеГрузополучателяДоАдреса) = "",
        "", ПредставлениеГрузополучателяДоАдреса+", ") + Шапка.АдресДоставки
        + ?(СокрЛП(ПредставлениеГрузополучателяПослеАдреса)="", "", ", "+ПредставлениеГрузополучателяПослеАдреса);
    Иначе
        ОбластьМакетаШапка.Параметры.ПредставлениеГрузополучателя = ФормированиеПечатныхФорм.ОписаниеОрганизации(
        СведенияОГрузополучателе,"НаименованиеДляПечатныхФорм,ИНН,ФактическийАдрес,Телефоны,НомерСчета,Банк,БИК,КоррСчет");
    КонецЕсли;
    
        
    ТабДокумент.Вывести(ОбластьМакетаШапка);
    
    //Олег



    ТабДокумент.Вывести(ОбластьМакетаПитаниеШапкаНЗ);
    ТабДокумент.Присоединить(ОбластьМакетаПитаниеШапкаЗ);
    ОбластьКолонкаТоварЗ = Макет.Область("Завтрак");
    ТабДокумент.Присоединить(ОбластьМакетаПитаниеШапкаО);
    ОбластьКолонкаТоварО = Макет.Область("Обед");
        
    НС = 1;
    Пока ВыборкаСтрокТовары.Следующий() Цикл
        
        ОбластьМакетаПитаниеНомерЗ.Параметры.НомерСтроки = НС;
        ТабДокумент.Вывести(ОбластьМакетаПитаниеНомерЗ);
        
                
        ОбластьМакетаПитаниеЗ.Параметры.Заполнить(ВыборкаСтрокТовары);
        ОбластьМакетаПитаниеЗ.Параметры.Номенклатура = СокрЛП(ВыборкаСтрокТовары.Номенклатура);
        ОбластьМакетаПитаниеЗ.Параметры.Выход = ВыборкаСтрокТовары.Выход;
        ТабДокумент.Присоединить(ОбластьМакетаПитаниеЗ);
        
    НС = НС + 1;
    КонецЦикла;
        
    
    // Инициализация счетчика страниц


    НомерСтраницы = 1;
    
    // Инициализация итогов по странице


    ИтогоМестНаСтранице       = 0;
    ИтогоКоличествоНаСтранице = 0;
    ИтогоСуммаНаСтранице      = 0;
    ИтогоНДСНаСтранице        = 0;
    ИтогоСуммаСНДСНаСтранице  = 0;
    
    // Инициализация итогов по документу


    ИтогоМест       = 0;
    ИтогоКоличество = 0;
    ИтогоСуммаСНДС  = 0;
    ИтогоСумма      = 0;
    ИтогоНДС        = 0;
    
    // Инициализация счетчика строк


    НомерСтроки     = 0;
    КоличествоСтрок = ТабличнаяЧасть.Количество();
    
    // Выводим заголовок многострочной части


    
    ТабДокумент.Вывести(ОбластьМакетаЗаголовокТаблицы);
    
    // Выводим многострочную часть документа


    Для Каждого ВыборкаСтрок Из ТабличнаяЧасть Цикл
        
        НомерСтроки = НомерСтроки + 1;
        
        ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаСтрок);
        
        ОбластьМакетаСтрока.Параметры.Номер = НомерСтроки;
        
        Если НЕ ЗначениеЗаполнено(ВыборкаСтрок.КоличествоМест) Тогда
            ОбластьМакетаСтрока.Параметры.ВидУпаковки           = "";
            ОбластьМакетаСтрока.Параметры.КоличествоВОдномМесте = "";
        КонецЕсли;
        
        ОбластьМакетаСтрока.Параметры.ТоварНаименование = СокрЛП(ВыборкаСтрок.ТоварНаименование);
        
        СуммаСНДС = (ВыборкаСтрок.Сумма + ?(Шапка.СуммаВключаетНДС, 0, ВыборкаСтрок.СуммаНДС));
        
        КоличествоМест = ВыборкаСтрок.КоличествоМест;
        Количество     = ВыборкаСтрок.Количество;
        СуммаНДС       = ВыборкаСтрок.СуммаНДС;
        СуммаБезНДС    = СуммаСНДС - СуммаНДС;
        
        ОбластьМакетаСтрока.Параметры.СуммаБезНДС = СуммаБезНДС;
                
        // Проверим вывод


        СтрокаСПодвалом = Новый Массив;
        Если НомерСтроки = 1 Тогда
            СтрокаСПодвалом.Добавить(ОбластьМакетаЗаголовокТаблицы); // если первая строка, то должен


        КонецЕсли;                                                   // помещаться заголовок


        СтрокаСПодвалом.Добавить(ОбластьМакетаСтрока);
        
        Если НомерСтроки = КоличествоСтрок Тогда           // если последняя строка, должен


            СтрокаСПодвалом.Добавить(ОбластьМакетаВсего);  // помещаться и подвал документа


            СтрокаСПодвалом.Добавить(ОбластьМакетаПодвал);
        КонецЕсли;
        
        
        ТабДокумент.Вывести(ОбластьМакетаСтрока);
        
        // Увеличим итоги по странице


        ИтогоМестНаСтранице       = ИтогоМестНаСтранице       + КоличествоМест;
        ИтогоКоличествоНаСтранице = ИтогоКоличествоНаСтранице + Количество;
        ИтогоСуммаНаСтранице      = ИтогоСуммаНаСтранице      + СуммаБезНДС;
                
        // Увеличим итоги по документу


        ИтогоМест       = ИтогоМест       + КоличествоМест;
        ИтогоКоличество = ИтогоКоличество + Количество;
        ИтогоСумма      = ИтогоСумма      + СуммаБезНДС;
                
    КонецЦикла;
    
    // Выводим итоги по странице


    ОбластьМакетаВсего.Параметры.ИтогКоличество = ИтогоКоличество;
    ОбластьМакетаВсего.Параметры.ИтогСуммы      = ИтогоСумма;
        
    ТабДокумент.Вывести(ОбластьМакетаВсего);
    
    // Выводим подвал документа


    
    ОбластьМакетаПодвал.Параметры.ФИОСтПовар      = Шапка.ФИОСтПовар;
    ОбластьМакетаПодвал.Параметры.ФИОТехнолог     = Шапка.ФИОТехнолог;
        
    
    ТабДокумент.Вывести(ОбластьМакетаПодвал);
    
    Возврат ТабДокумент;
    
КонецФункции // ПечатьТОРГ12ЕжедневныйОтчет()
1 Oleg102
 
23.10.13
14:44
Грув хватит темы закрывать? Что тебе не нравится как называю. Скажи как правильно. Я пишу тему по существу.
2 zak555
 
23.10.13
14:46
питание -- группировка1
номенклатура -- группировка2 -- обход все
3 Oleg102
 
23.10.13
14:49
Зак извини пожалуйста. Как это примерно написать в коде?
4 zak555
 
23.10.13
14:52
для начала убрать области Завтрак/обед и т.д.
сделать одну вертикальную -- питание
5 Oleg102
 
23.10.13
14:54
Понял, сейчас переделаю. Я так делал по началу. Но не смог вывести данные, наверное потому, что и не знаю как делать обход по группировкам
6 Oleg102
 
23.10.13
14:56
Переделал. Вместо названия "Завтрак" в макете сделал параметр <Питание>
7 eklmn
 
гуру
23.10.13
14:56
или

    Пока ВыборкаСтрокТовары.Следующий() Цикл

//НАЧАЛО УЧЕБНОГО ПРОЦЕССА
Если ВыборкаСтрокТовары.Питание = "Обед" Тогда
      ОбластьМакетаПитание =  ПолучитьОбласть("обед");
      ОбластьМакетаПитание.параметры.Заполнить(ВыборкаСтрокТовары);
Конецесли;
// это просто намек, вообще делать надо красиво и правильно по другому
//КОНЕЦ  УЧЕБНОГО ПРОЦЕССА  

        
        ОбластьМакетаПитаниеНомерЗ.Параметры.НомерСтроки = НС;
        ТабДокумент.Вывести(ОбластьМакетаПитаниеНомерЗ);
        
                
        ОбластьМакетаПитаниеЗ.Параметры.Заполнить(ВыборкаСтрокТовары);
        ОбластьМакетаПитаниеЗ.Параметры.Номенклатура = СокрЛП(ВыборкаСтрокТовары.Номенклатура);
        ОбластьМакетаПитаниеЗ.Параметры.Выход = ВыборкаСтрокТовары.Выход;
        ТабДокумент.Присоединить(ОбластьМакетаПитаниеЗ);
        
    НС = НС + 1;
    КонецЦикла;
8 eklmn
 
гуру
23.10.13
14:58
и делать надо быстрее, пока Груви не пришел )
9 zak555
 
23.10.13
15:00
(6) теперь заполняй шапку питание
потом группировка1 питания все и группировка2 номенклатура
10 Oleg102
 
23.10.13
15:01
(8) Ага это точно.))
11 eklmn
 
гуру
23.10.13
15:07
ОбластьМакетаПитание  = ОбластьМакетаПитаниеШапкаО (у тебя)
12 Oleg102
 
23.10.13
15:11
Завтрак    
1    Каша "Дружба" на сух молоке    300
    Завтрак    
2    Масло сливочное                     25
    Завтрак    
3    Сыр                             30
    Завтрак    
4    Чай с сахаром                    400
    Завтрак    
5    Хлеб в/с                    160
    Завтрак    
6    Бефстроганов из говядины    150
13 Oleg102
 
23.10.13
15:11
Вот так все выходит в отчете((
14 eklmn
 
гуру
23.10.13
15:12
Ты каому? Заку или мне? раскрой мысли, а то непонятно них...
15 zak555
 
23.10.13
15:13
где код вывода ?
p.s. 0 не копируй
16 Oleg102
 
23.10.13
15:13
(14) Тебе.
17 Oleg102
 
23.10.13
15:22
(14) Вообщем сначало переделал макет как сказал "Зак" сделать одну область и убрать остальные. С твоим кодом на условие

//НАЧАЛО УЧЕБНОГО ПРОЦЕССА

Если ВыборкаСтрокТовары.Питание = "Обед" Тогда
      ОбластьМакетаПитание =  ПолучитьОбласть("обед");
      ОбластьМакетаПитание.параметры.Заполнить(ВыборкаСтрокТовары);
Конецесли;
// это просто намек, вообще делать надо красиво и правильно по другому

//КОНЕЦ  УЧЕБНОГО ПРОЦЕССА

выводило так как я показал выше (12). Сейчас передал как раньше было по началу, это код вообще не реагирует, без изменений.
18 eklmn
 
гуру
23.10.13
15:25
(17) пиндец, естественно не работает, надо сделать под себя!
19 Oleg102
 
23.10.13
15:27
(18) я переделал так.

//Олег

    ТабДокумент.Вывести(ОбластьМакетаПитаниеШапкаНЗ);
    ТабДокумент.Присоединить(ОбластьМакетаПитаниеШапкаЗ);
    ОбластьКолонкаТоварЗ = Макет.Область("Завтрак");
    ТабДокумент.Присоединить(ОбластьМакетаПитаниеШапкаО);
    ОбластьКолонкаТоварО = Макет.Область("Обед");
        
    НС = 1;
    Пока ВыборкаСтрокТовары.Следующий() Цикл
        
    Если ВыборкаСтрокТовары.Питание = "Обед" Тогда
      ОбластьМакетаПитаниеШапкаО.ПолучитьОбласть("ШапкаТаблицы|Обед");
      ОбластьМакетаПитаниеШапкаО.Параметры.Заполнить(ВыборкаСтрокТовары);
    Конецесли;
        
        
        ОбластьМакетаПитаниеНомерЗ.Параметры.НомерСтроки = НС;
        ТабДокумент.Вывести(ОбластьМакетаПитаниеНомерЗ);
        
                
        ОбластьМакетаПитаниеЗ.Параметры.Заполнить(ВыборкаСтрокТовары);
        ОбластьМакетаПитаниеЗ.Параметры.Номенклатура = СокрЛП(ВыборкаСтрокТовары.Номенклатура);
        ОбластьМакетаПитаниеЗ.Параметры.Выход = ВыборкаСтрокТовары.Выход;
        ТабДокумент.Присоединить(ОбластьМакетаПитаниеЗ);
        
    НС = НС + 1;
    КонецЦикла;
20 eklmn
 
гуру
23.10.13
15:54
ТабДокумент.Вывести
ТабДокумент.Присоединить
где?
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший