Имя: Пароль:
1C
1С v8
Вывод колонтитулов с привязкой к размеру страницы
0 NIGHTHUNTER
 
19.11.20
07:32
Выводимый макет содержит изображения колонтитулов. Которые должны быть на каждой странице, в заданном виде.
Без возможности выводиться в плавающем виде. Как это есть сейчас.
Подскажите какую технологию можно опробовать, для вывода заданных фиксировано колонтитулов на выводимых страницах макета?
1 NIGHTHUNTER
 
19.11.20
09:09
Не понятно как регулировать, что бы выводились нужные листы на печать, но вверху и внизу в твердо заданных местах выводились колонтитулы.
2 ДенисЧ
 
19.11.20
09:10
ТабличныйДокумент (SpreadsheetDocument)
ВерхнийКолонтитул (Header)
Использование:
Только чтение.
Описание:
Тип: КолонтитулТабличногоДокумента.
Содержит верхний колонтитул табличного документа.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
См. также:
КолонтитулТабличногоДокумента
Использование в версии:
Доступен, начиная с версии 8.0.
     Методическая информация

Дальше сам.
3 RomanYS
 
19.11.20
09:10
ПроверитьВывод()
4 NIGHTHUNTER
 
19.11.20
09:12
(2) Что сам? Мне нужно в колонтитул выводить изображение. Это принципиально другое.
5 NIGHTHUNTER
 
19.11.20
09:14
(3) Есть такой метод, но я не знаком с его работой. Подскажите если вам это известно.


Процедура ВыводСПроверкой(ТабДок,СекцияВывод)
М = Новый Массив;
М.Добавить(СекцияВывод);
М.Добавить(СекцияНиз);
// Проверим, уместится ли строка на странице или надо открывать новую страницу
Если Не ТабДок.ПроверитьВывод(М) Тогда
   Если СекцияВывод=СекцияДоп Тогда
       Возврат
   КонецЕсли;
   ВыводСПроверкой(ТабДок,СекцияДоп);    
   ТабДок.Вывести(СекцияНиз);    
   ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
   ТабДок.Вывести(СекцияВерх);
КонецЕсли;

ТабДок.Вывести(СекцияВывод);
Если СекцияВывод=СекцияДоп Тогда
   ВыводСПроверкой(ТабДок,СекцияДоп);
КонецЕсли;


СекцияВерх секция с картинкой - верхний колонтитул
СекцияНиз  секция с картинкой - нижний колонтитул
СекцияДоп секция "пустая строка с высотой 1" - для того что бы нижний колонтитул всегда ровно ложился.

Такую вот технологию нашел, но как применить пока не знаю.
6 RomanYS
 
19.11.20
09:16
(5) пример нашёл, СП почитай. Что подсказать то ещё?
7 NIGHTHUNTER
 
19.11.20
09:23
(6) Хотелось бы разобраться с примером, понять как он работает. Как его применить.
То есть в (5) пример, который реально применить для решения (0) ? Я его ещё не опробовал, пока не знаю с какой стороны к нему подобраться.
Что бы разобраться и понять его. Начать применять. Смотреть результат. И как то соединять начать со своим, разрабатываемым макетом.
8 NIGHTHUNTER
 
19.11.20
09:24
Есть ещё вот такой пример.


Процедура ВывестиКолонтитулы(ТабличныйДокумент, МакетОбработки, ТекущаяОбластьМакета,
    ОбластьШапкаСпецификацияКДоговору, ФИОПокупателя)
    
    //Получаем область - нижний колонтитул
    ОбластьНижнийКолонтитул = МакетОбработки.ПолучитьОбласть("НижнийКолонтитул");
    
    //Пока не выводим текущую область,
    //складываем текущую область с областью нижнего колонтитула в массив
    
    //Внимание! Не надо складывать все выведенные до этого области,
    //только Текущая и Нижний колонтитул
    ВыводимыеОбласти = Новый Массив;
    ВыводимыеОбласти.Добавить(ТекущаяОбластьМакета);
    ВыводимыеОбласти.Добавить(ОбластьНижнийКолонтитул);
    
    //Проверяем войдут ли сложенные области на страницу
    Если НЕ ТабличныйДокумент.ПроверитьВывод(ВыводимыеОбласти) Тогда
        //Если сложенные области не входят на страницу,
        //выводим нижний колонтитул и горизонтальный разделитель страниц
        ОбластьНижнийКолонтитул.Параметры.ФИОПокупателя = ФИОПокупателя;
        ОбластьНижнийКолонтитул.Параметры.ФИОДиректора = "Анищенко Б.С.";
        ТабличныйДокумент.Вывести(ОбластьНижнийКолонтитул);
        ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        //Затем выводим шапку, уже на следующей странице
        ТабличныйДокумент.Вывести(ОбластьШапкаСпецификацияКДоговору);
    КонецЕсли;
КонецПроцедуры
9 НЕА123
 
19.11.20
09:36
фоноваякартинка
?
10 RomanYS
 
19.11.20
10:02
(7) Так разберись. Будут вопрос по существу - пиши. (8) вообще практически твоя тема
11 NIGHTHUNTER
 
19.11.20
11:57
(9) Колонтитулы.
12 mistеr
 
19.11.20
12:47
(7) На ИС погугли ПроверитьВывод, много статей.
13 NIGHTHUNTER
 
23.11.20
07:03
Суть вопроса такова.

Я не говорю пока когда в документе много строк. И нужно делать соответствующую обработку.

Но вот например, что я не понимаю.

1. Вывод титульного листа. Нужно что бы картинка верхнего колонтитула выводилась вверху, а картинка нижнего колонтитула выводилась внизу.
   Титульный лист выводится одним макетом. Если в нем выводится это не так как нужно. Как сделано статически в ворде. Это самому нужно как то подгонять?
   Через предварительный просмотр это можно выявлять?

2. Если в документе мало строк, то нижний колонтитул с картинкой выводится по средине страницы, а должен так же внизу как при статическом выводе в документе ворд.
   Как этим управлять? Считать строки? Они тоже погут быть разной величины. (2) Я как понимаю не подойдет, потому что тут я вывожу изображение в месте колонтитула.
14 NIGHTHUNTER
 
23.11.20
07:10
(13) 1. - Титульный лист выводится одной секцией в макете, т. е.
15 NIGHTHUNTER
 
23.11.20
07:22
Методом проб, и проверок в предварительном просмотре, добился что бы титульный выводился на 1 страницу.
И колонтитулы что бы были вверху страницы и внизу. Колонтитулы представляют собой изображения.
То есть так делается?

Думал как то задавать одинаковую высоту строк, и есть определенные параметры, когда столько то строк умещается на одном листе.

Хотя если сбиваешь высоту строк, потом как её примести к высоте по умолчанию тоже не понятно.
16 NIGHTHUNTER
 
24.11.20
06:37
Провожу аудит, имеющихся примеров. Пытаюсь понять что они делают и какой подойдет мне.

1). Пока такая задача. Имеется ВерхнийКолонтитул, НижнийКолонтитул и Строки .

2). Ещё есть Титульный. Отдельная секция. И подвал, отличающийся от нижнего колонтитула. Который нужно вывести в конце всего выводимого макета.

Пока что не пойму как это все применить. И какой из этих примеров мне нужен.



ПРИМЕР 1.

Процедура ВывестиКолонтитулы(ТабличныйДокумент, МакетОбработки, ТекущаяОбластьМакета, ОбластьШапкаСпецификацияКДоговору, ФИОПокупателя)
    //Получаем область - нижний колонтитул
    ОбластьНижнийКолонтитул = МакетОбработки.ПолучитьОбласть("НижнийКолонтитул");
    //Пока не выводим текущую область, складываем текущую область с областью нижнего колонтитула в массив
    //Внимание! Не надо складывать все выведенные до этого области, только Текущая и Нижний колонтитул
    ВыводимыеОбласти = Новый Массив;
    ВыводимыеОбласти.Добавить(ТекущаяОбластьМакета);
    ВыводимыеОбласти.Добавить(ОбластьНижнийКолонтитул);
    //Проверяем войдут ли сложенные области на страницу
    Если НЕ ТабличныйДокумент.ПроверитьВывод(ВыводимыеОбласти) Тогда
        //Если сложенные области не входят на страницу, выводим нижний колонтитул и горизонтальный разделитель страниц
        ОбластьНижнийКолонтитул.Параметры.ФИОПокупателя = ФИОПокупателя;
        ОбластьНижнийКолонтитул.Параметры.ФИОДиректора = "Анищенко Б.С.";
        ТабличныйДокумент.Вывести(ОбластьНижнийКолонтитул);
        ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        //Затем выводим шапку, уже на следующей странице
        ТабличныйДокумент.Вывести(ОбластьШапкаСпецификацияКДоговору);
    КонецЕсли;
КонецПроцедуры

Также стоит отметить что параметры: «ТабличныйДокумент.ПолеСверху» и «ТабличныйДокумент.ПолеСнизу» не должны быть заданы программно.

// --------------------------------------------------------------------------------

ПРИМЕР 2.

Процедура ВыводСПроверкой(ТабДок,СекцияВывод)
    М = Новый Массив;
    М.Добавить(СекцияВывод);
    М.Добавить(СекцияНиз);
    // Проверим, уместится ли строка на странице или надо открывать новую страницу
    Если Не ТабДок.ПроверитьВывод(М) Тогда
       Если СекцияВывод=СекцияДоп Тогда
           Возврат
       КонецЕсли;
       ВыводСПроверкой(ТабДок,СекцияДоп);    
       ТабДок.Вывести(СекцияНиз);    
       ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
       ТабДок.Вывести(СекцияВерх);
    КонецЕсли;
    ТабДок.Вывести(СекцияВывод);
    Если СекцияВывод=СекцияДоп Тогда
       ВыводСПроверкой(ТабДок,СекцияДоп);
    КонецЕсли;
КонецПроцедуры

// --------------------------------------------------------------------------------
17 NIGHTHUNTER
 
24.11.20
06:43
Вот эту процедуру не проверял. Но кажется она зацикленная? Рекурсивная, судя по коду ...

ПРИМЕР 2.

Процедура ВыводСПроверкой(ТабДок,СекцияВывод)
    М = Новый Массив;
    М.Добавить(СекцияВывод);
    М.Добавить(СекцияНиз);
    // Проверим, уместится ли строка на странице или надо открывать новую страницу

    Если Не ТабДок.ПроверитьВывод(М) Тогда
       Если СекцияВывод=СекцияДоп Тогда
           Возврат
       КонецЕсли;
       ВыводСПроверкой(ТабДок,СекцияДоп);    
       ТабДок.Вывести(СекцияНиз);    
       ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
       ТабДок.Вывести(СекцияВерх);
    КонецЕсли;
    ТабДок.Вывести(СекцияВывод);
    Если СекцияВывод=СекцияДоп Тогда
       ВыводСПроверкой(ТабДок,СекцияДоп);
    КонецЕсли;
КонецПроцедуры
18 NIGHTHUNTER
 
24.11.20
06:49
Вот, делаю под себя. А где вывод самих строк?

Процедура ВывестиКолонтитулы(ТабличныйДокумент, МакетОбработки, ТекущаяОбластьМакета, ОбластьШапкаСпецификацияКДоговору, ФИОПокупателя)
    // Получаем области - верхний, нижний колонтитул
    ОбластьВерхнийКолонтитул = МакетОбработки.ПолучитьОбласть("ВерхнийКолонтитул");
    ОбластьНижнийКолонтитул  = МакетОбработки.ПолучитьОбласть("НижнийКолонтитул");
    // Пока не выводим текущую область, складываем текущую область с областью нижнего колонтитула в массив
    // Внимание! Не надо складывать все выведенные до этого области, только Текущая и Нижний колонтитул
    ВыводимыеОбласти = Новый Массив;
    ВыводимыеОбласти.Добавить(ТекущаяОбластьМакета);
    ВыводимыеОбласти.Добавить(ОбластьНижнийКолонтитул);
    //Проверяем войдут ли сложенные области на страницу
    Если НЕ ТабличныйДокумент.ПроверитьВывод(ВыводимыеОбласти) Тогда
        // Если сложенные области не входят на страницу, выводим нижний колонтитул и горизонтальный разделитель страниц
        ТабличныйДокумент.Вывести(ОбластьНижнийКолонтитул);
        ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        // Затем выводим шапку, уже на следующей странице
        ТабличныйДокумент.Вывести(ОбластьВерхнийКолонтитул);
    КонецЕсли;
КонецПроцедуры
19 Йохохо
 
24.11.20
06:58
(18) "А где вывод самих строк?" в коде выше "по стеку", где формируется ТекущаяОбластьМакета. Похоже ты скопипастил что то не универсальное и логику надо допилить
20 NIGHTHUNTER
 
24.11.20
07:02
(19) То есть вывод строк, идет до вызова этой процедуры?

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

(19) Или все же вывод самих строк, будет в этой процедуре (18). Да что я нашел примеры, они наверное только идею подкидывают а сами не рабочие. И уже самому в процессе тестирования, нужно их дорабатывать.
21 NIGHTHUNTER
 
24.11.20
07:17
(19) Вот, кажется по смыслу. Отредактировал процедуру. Правильно же??


//
Процедура ВывестиКолонтитулы(ТабличныйДокумент, ТекущаяОбластьМакета)
    ОбластьВерхнийКолонтитул = МакетОбработки.ПолучитьОбласть("ВерхнийКолонтитул");
    ОбластьНижнийКолонтитул  = МакетОбработки.ПолучитьОбласть("НижнийКолонтитул");
    ВыводимыеОбласти = Новый Массив;
    ВыводимыеОбласти.Добавить(ОбластьВерхнийКолонтитул);
    ВыводимыеОбласти.Добавить(ТекущаяОбластьМакета);
    ВыводимыеОбласти.Добавить(ОбластьНижнийКолонтитул);
    Если НЕ ТабличныйДокумент.ПроверитьВывод(ВыводимыеОбласти) Тогда
        ТабличныйДокумент.Вывести(ОбластьНижнийКолонтитул);
        ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        ТабличныйДокумент.Вывести(ОбластьВерхнийКолонтитул);
        ТабличныйДокумент.Вывести(ТекущаяОбластьМакета);
    Иначе
        ТабличныйДокумент.Вывести(ОбластьВерхнийКолонтитул);
    КонецЕсли;
КонецПроцедуры
//
22 K1RSAN
 
24.11.20
07:24
(20) Тут, грубо говоря, перед выводом КАЖДОЙ области необходимо делать проверку на вывод колонтитула "а вдруг лист кончится". Поэтому в результате может получиться монстр из проверок. А еще надо учесть, что текущая область уже не влезает, но она может быть достаточно большая, чтобы вставить пару пустых строк, чтобы колонтитул будет именно в конце страницы. И тогда после проверки на вставку "текущей области + колонтитул" надо будет еще добавить вставку пустых строк)
Вот вам еще пища для размышлений)
23 K1RSAN
 
24.11.20
07:27
(22)+ но она может быть достаточно большая, чтобы вставить пару пустых строк, чтобы колонтитул будет именно в конце страницы*
но сама область достаточно большая, а потому даже если она не влезает - может быть место для пустых строк, иначе колонтитул окажется не в самом низу страницы, а грубо говоря - "в основной части"
24 Йохохо
 
24.11.20
07:28
(21) для формы по доку с ТЧ обычно выводится верхний, потом шапка, потом в цикле надо выводить строки, и перед выводом строки проверить что влезет Облать1(новая выводимая строка + итоги+ подвал + колонтитул), если Область1 не влезает то выводим Область(Подвал+Колонтитул), она обязана влезать алгоритмически, потом разрывстраницы и инициализируем наполнение новой страницы. Код у тебя есть, выкинь куски чужого кода и реализуй свою логику
25 Йохохо
 
24.11.20
07:29
Область(промежуточныеИтоги+Колонтитул)
26 NIGHTHUNTER
 
24.11.20
07:33
(22) - (25) Спасибо, принимаю все для размышления. Буду приходить к верному решению.
27 NIGHTHUNTER
 
24.11.20
08:52
Если можно подскажите пожалуйста, какой тут заложен смысл, и что не доработанно? Я не понимаю.

Процедура ВыводСПроверкой(ТабДок,СекцияВывод)
М = Новый Массив;
М.Добавить(СекцияВывод);
М.Добавить(СекцияНиз);
// Проверим, уместится ли строка на странице или надо открывать новую страницу
Если Не ТабДок.ПроверитьВывод(М) Тогда
   Если СекцияВывод=СекцияДоп Тогда
       Возврат
   КонецЕсли;
   ВыводСПроверкой(ТабДок,СекцияДоп);    
   ТабДок.Вывести(СекцияНиз);    
   ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
   ТабДок.Вывести(СекцияВерх);
КонецЕсли;

ТабДок.Вывести(СекцияВывод);
Если СекцияВывод=СекцияДоп Тогда
   ВыводСПроверкой(ТабДок,СекцияДоп);
КонецЕсли;
28 Йохохо
 
24.11.20
09:08
на вход СекцияВывод, если она не влезает выводим СекцияДоп (до конца страницы? <- это не реализовано)
Основная теорема систематики: Новые системы плодят новые проблемы.