Имя: Пароль:
1C
1С v8
8.1 Печатная форма
0 Wefast
 
03.04.15
14:12
Суть такова.
на первой странице одна шапка. А на последующих другая

Вывожу строки, делаю проверку поместится ли следующая строка. Если не поместится, вывожу шапку и заголовок таблицы.


В шапке на первой странице нужно вывести сколько будет листов всего в итоге

В шапке на 2 и последующих страницах должно выводится кол-во строк в табличной части на данной странице.


Собственно как мне посчитать кол-во листов до того как я их выведу
И как посчитать сколько строк на странице поместится до того как я их вывел.
1 Кирр
 
03.04.15
14:45
Экспериментальным путем.
2 bodri
 
03.04.15
14:48
Если строго указать сколько строк будет помещаться на страницу, тогда проблем не вижу выяснить, сколько будет страниц/листов
3 Wefast
 
03.04.15
15:22
А если настройки принтера изменятся?

Можно запросом узнать сколько будет строк, но он только для этого и сгодится, срабатывать будет вечность на больших табличных документах
4 Wefast
 
03.04.15
15:31
Первым запросом у меня берется табличная часть документа(номенклатура, характеристика)

Вторым запросом у меня берутся значения свойств характеристики (там мне нужен только вес и проба)

Третьим запросом у меня берутся значения свойств (только "вставки (1,2,3,4,5 и т.д)"

Мне нужно вывести
номенклатура1 | характеристика | проба | вставка1
номенклатура1 | характеристика | проба | вставка2
номенклатура1 | характеристика | проба | вставка3
номенклатура2 | характеристика | проба | вставка


Поэтому идет цикл перебора табличной части документа
Потом идет цикл перебора этих вставок
прос то условие
И не в одном из этих запросов нет того кол-ва строк что у меня выведется в итоге
5 Кирр
 
03.04.15
15:34
Количество элементов известно?
Предположи, что один элемент будет выводиться на 2 (или 3) строки. Если меньше, точно влезет. Больше чем в 2 (или 3) строки не должно быть.
6 dmpl
 
03.04.15
15:35
(0) Табличный документ можно тоже менять. Запоминай координаты поля, где количество строк ставить надо и правь его после вывода.
7 DrShad
 
03.04.15
15:36
(0) посчитать Высоту табдока в мм и разделить на высоту листа
8 Wefast
 
03.04.15
16:00
(6) смотрю вот на возвращаемый Табличный Документ и на методы табличного документа и не могу понять как в нем теперь что то поменять перед выводом на печать то...

И высота там есть, она считается же в колличествах строк, да и где мне взять высоту будущего листа печати.
9 Wefast
 
03.04.15
16:02
(5) Не известно, можно посчитать конечно запросом, но уж больно не оптимизировано, берется весь регистр сведений с характеристиками а потом накладывается отбор по нужным мне номенклатурам
10 DrShad
 
03.04.15
16:04
(8) высоту можно и в мм посчитать, если очень нужно, а высоту будущего листа печати узнать из параметров печати
11 dmpl
 
04.04.15
21:12
(8) Надо с помощью метода Область() получить ОбластьЯчеекТабличногоДокумента с нужными координатами, и уже ее править. Координаты можно получить, если анализировать результат метода Вывести() (он тоже возвращает ОбластьЯчеекТабличногоДокумента, результат нужен нам чтобы определить номер строки, с которого начался вывод этой области макета).

Ну или еще возможен вариант, когда сначала выводишь во временный документ области, а как накопится нужная высота - выводишь заголовок и временный ТД в основной документ.
12 echo77
 
05.04.15
09:10
Я делал так:
Строил табличный документ в цикле на каждую страницу отдельно
- результаты(табличные документы) помещал в массив.
После того как все построил выводил все страницы в один табличный документ из массива
13 echo77
 
05.04.15
09:11
p.s. В массив можно запихнуть не только табличный документ, но и структуру, содержащую в себе табличный документ и другие доп.свойства, типа количество строк в ТЗ
14 Wefast
 
06.04.15
14:38
(11)  В итоге что то такое и проделал.
Если временный документы делать, мне кажется время работы удвоится, а он и так не шибко быстрый.

Если вдруг кому интересно:

Функция Печать() Экспорт
    

    НомерСтроки     = 0;
    ПорядковыйНомер = 1;    
    НомерСтраницы    = 2;
    КолвоСтрокНаСтр = 0;
    
    Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
    
    ТабДокумент = Новый ТабличныйДокумент;                      
    ТабДокумент.ИмяПараметровПечати = "ИнвентаризационнаяОписьДрагМеталлов";
    ТабДокумент.ЧерноБелаяПечать    = Истина;
    ТабДокумент.ОриентацияСтраницы  = ОриентацияСтраницы.Портрет;
    
    
    Макет = ПолучитьМакет("Макет");
    ОбластьШапкаРеквезиты      = Макет.ПолучитьОбласть("ШапкаРевезиты");
    ОбластьШапка               = Макет.ПолучитьОбласть("Шапка");
    ОбластьШапка2              = Макет.ПолучитьОбласть("Шапка2");
    ОбластьРасписка             = Макет.ПолучитьОбласть("Расписка");
    ОбластьЗаголовокТаблицы  = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    ОбластьСтрока              = Макет.ПолучитьОбласть("Строка");
    
    ЗапросИнвентаризации = Новый Запрос;    
    ЗапросИнвентаризации.Текст =
    "ВЫБРАТЬ *
    |ГДЕ
    |    ИнвентаризацияТоваровНаСкладеТовары.Ссылка = &Ссылка";
    ЗапросИнвентаризации.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
    РезультатЗапроса = ЗапросИнвентаризации.Выполнить();    
    ВыборкаОбъектов = РезультатЗапроса.Выбрать();
    
    Организация = ВыборкаОбъектов;
    Организация.Следующий();    
    
    КоличествоСтрок = ВыборкаОбъектов.Количество();
    
    ОбластьШапкаРеквезиты.Параметры.Заполнить(Организация);
    СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Организация.Организация, Организация.ДатаДокумента);
    ОбластьШапкаРеквезиты.Параметры.ПредставлениеОрганизации            = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации);
    ОбластьШапкаРеквезиты.Параметры.ОрганизацияПоОКПО                   = СведенияОбОрганизации.КодПоОКПО;
    
    
    ОбластьШапкаРеквезиты.Параметры.ПредставлениеОрганизации            = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации);
    
    ОбластьШапка.Параметры.Дата = "ПО СОСТОЯНИЮ НА «" + Формат(СсылкаНаОбъект.Дата,"ДФ='d MMMM'") + "» " + Формат(СсылкаНаОбъект.Дата,"ДФ=yyyy"+"г.");
    
    ТабДокумент.Вывести(ОбластьШапкаРеквезиты);
    ТабДокумент.Вывести(ОбластьШапка);
    ТабДокумент.Вывести(ОбластьРасписка);
    ТабДокумент.Вывести(ОбластьЗаголовокТаблицы);
    
    Пока ВыборкаОбъектов.Следующий() Цикл
        
        //Если у данной номерклатуры есть характеристика сработает расшифровка этой хар-ки
        Если НЕ ВыборкаОбъектов.вставка = NULL  Тогда
            Структурище = РасшифровкаВставки(ВыборкаОбъектов.вставка.Наименование);
            КолвоКамней = Структурище.КолвоКамней;
            Масса = Структурище.Масса;
        Иначе
            КолвоКамней = "";
            Масса = "";
        КонецЕсли;
        ОбластьСтрока.Параметры.Заполнить(ВыборкаОбъектов);
                
        ОбластьСтрока.Параметры.КолвоКамней             = КолвоКамней;
        ОбластьСтрока.Параметры.МассаКамня           = Масса;
        
        ОбластьСтрока.Параметры.Номер               = ПорядковыйНомер;
                
        ПорядковыйНомер = ПорядковыйНомер + 1;
        
        //Сравнивается номеклатура с предыдущей, если они равны то номер строки остается прежним
        Если ВыборкаОбъектов.Номенклатура = Номенклатура Тогда
            ОбластьСтрока.Параметры.НомерСтроки         = НомерСтроки;
        Иначе
            НомерСтроки = НомерСтроки +1;
            ОбластьСтрока.Параметры.НомерСтроки         = НомерСтроки;
        КонецЕсли;
        
        Номенклатура = ВыборкаОбъектов.Номенклатура;
        
        ТабДокумент.Вывести(ОбластьСтрока);
        КолвоСтрокНаСтр = КолвоСтрокНаСтр+1;
        
        
        Если НЕ ТабДокумент.ПроверитьВывод(ОбластьСтрока) Тогда
            
            ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
            
            ОбластьШапка2.Параметры.НомерЛиста = НомерСтраницы;
            
            ТабДокумент.Вывести(ОбластьШапка2);
            ТабДокумент.Вывести(ОбластьРасписка);
            ТабДокумент.Вывести(ОбластьЗаголовокТаблицы);
            
            //номер ячейки что предстоит изменить
            НомерЯчейки = (НомерСтраницы-2)*40+8;
            
            НомерСтраницы = НомерСтраницы +1;
            
            //Условие для того чтобы менять второй лист тогда когда начал выводится третий
            Если НомерСтраницы >3 ТОгда
                ТабДокумент.Область(НомерЯчейки,5,НомерЯчейки+1,5).Текст = КолвоСтрокНаСтр;
            КонецЕсли;
            КолвоСтрокНаСтр = 0;
            
        КонецЕсли;
        
        
    КонецЦикла;
        
    // Меняет склонение у "Листов" если кол-во страниц заканчивается на 1
    Если Найти("1", Прав(ТабДокумент.КоличествоСтраниц(),1))>0 Тогда
        ТабДокумент.Область(14,11,14,11).Текст = "ЛИСТЕ";
    КонецЕсли;
    
    //Вписывает на последнем листе кол-во строк что на нем, конечно если листов больше 1
    Если НомерСтраницы > 2 Тогда
        НомерЯчейки = (НомерСтраницы-2)*40+8;
        ТабДокумент.Область(НомерЯчейки,5,НомерЯчейки+1,5).Текст = КолвоСтрокНаСтр;
    КонецЕсли;
    //Вписывает в данную ячейку кол-во страниц
    ТабДокумент.Область(14,10,14,10).Текст=ТабДокумент.КоличествоСтраниц();
    ТабДокумент.Область(14,10,14,10).ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
    
    Возврат ТабДокумент;
    
КонецФункции
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс