Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула

03.01.19

Задачи пользователя - Адаптация типовых решений

Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.

Скачать исходный код

Наименование Файл Версия Размер
Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула:
.epf 596,52Kb
52
.epf 596,52Kb 52 Скачать

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

Когда решив использовать функция для вывода всего содержимого страницы, а порой двух, трёх, четырёх.  Выявились у этого алгоритма огрехи, частично из-за проблем самой платформы с. Функция проверки возможности вывода ТабличныйДокумент.ПроверитьВывод(МассивДляПроверки) всегда возвращает клади Ложь если перед этим в ТабличныйДокумент не было выведено ни одной области. На массивах с большим количеством областей печати, код мог иногда выводить содержимое частично, оставляя 1/2 - 1/4 страницы не занятой, всё как обычно - ТабличныйДокумент.ПроверитьВывод(МассивДляПроверки) возвращала Ложь.

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

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

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

Вывод ускоряем строками разной высоты, на примере они раскрашены разными цветами.

 

Пример использования вывода:

	ОблНаПечать	= Новый Массив;
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ЛоготипНаименование"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ШапкаДоговора"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ОбластьП1"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ОбластьП2_1_1"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ОбластьП2_3"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ОбластьП3_1"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ОбластьП3_2"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ОбластьП4_1"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ОбластьП6_2"));
	ОблНаПечать.Добавить(Макет.ПолучитьОбласть("ОбластьРеквизиты"));
	
	МакетВК = Макет.ПолучитьОбласть("ВерхнийКолонтитул"); // Можно и не передавать, код пережуёт это
	МакетНК = Макет.ПолучитьОбласть("НижнийКолонтитул"); // Можно и не передавать, код пережуёт это

	Макет1Строки = Макет.ПолучитьОбласть("ПустаяСтрока0001Высоты"); // Должна присутствовать в вашем макете
	//Нужно если вы переностите код в общие модули, и используете для отступа области из общего макета.
	
	ПараметрыВывода = ПолучитьСписокПараметров_МК();
	
	ПараметрыВывода.СчитатьВсегоСтраниц	= СчетСтраниц;
	ПараметрыВывода.ВК_На_Первой		= ВК_На_ПервойСтранице;
	ПараметрыВывода.ВК_На_Последней		= ВК_На_ПоследнейСтранице;
	ПараметрыВывода.НК_На_Первой		= НК_На_ПервойСтранице;
	ПараметрыВывода.НК_На_Последней		= НК_На_ПоследнейСтранице;
	ПараметрыВывода.РазрывСтраниц		= РазрывСтраниц;
	ПараметрыВывода.ОднаСтраница		= ОднаСтраница; // вывод одной страницы, функция вернёт массив не выведенных областей
	ПараметрыВывода.Макет1Строки		= Макет1Строки;
	
	//Доступные параметры
	
	//	РазрывСтраниц		= Истина
	//	ОднаСтраница		= Ложь
	//	ВК_На_Первой		= Истина //ВК - Верхний колонтитул
	//	ВК_На_Последней		= Ложь
	//	НК_На_Первой		= Истина //НК - Нижний колонтитул
	//	НК_На_Последней		= Ложь
	//	СчитатьВсегоСтраниц	= Ложь - Ускоряем вывод . но теряем реальное количество страниц. можно задать параметром ниже если знаем, что больше этого параметра их не будет.
	//	ТекущаяСтраница		= 0
	//	ВсегоСтраниц		= 0
	//	ФорматДаты			= "ДЛФ=D"
	//	ФорматВремени		= "ДЛФ=T"
	
	ОблНаПечать = ВывестиМаксимумКонтента(ТабличныйДокумент, ОблНаПечать, МакетВК, МакетНК, ПараметрыВывода);
	
	//Выведем всё что отсталось, Если ОднаСтраница		= Истина
	Для Каждого ТБ из ОблНаПечать Цикл
		//Если не выводить то видим. что вывелось содержимого только до конца страницы
		//ТабличныйДокумент.Вывести(ТБ);
	КонецЦикла;

 

Плюсы моего решения:

  • Выводит в колонтитулы абсолютно любую область с любым содержанием.
  • Запрет вывода колонтитула на первой и последней странице. Актуально для договоров, когда на каждой странице кроме последней выводишь подписи сторон.
  • Прижимание области колонтитула к низу страницы.

Минусы:

  • Пока отсутствует вывод верхнего колонтитула (не актуально, решаемо).
  • Отсутствуют параметры с указанием номера текущей страницы (решается двойным формированием, либо вывод в цикле способом #1).
  • После изменения размеров верхнего и нижнего отступов необходимо заново формировать печатную форму.
  • Ощутимо медленно работает, хотя не критично.
  • 21.02.2018  Авто масштаб по ширине и широкая форма рушат всю логику. 1с делает вывод с учётом высоты страницы, а уже после поджимает результат по ширине.

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

П.С. Тестировалось на платформе: 8.3.9.2170.
В обработке бонусом идёт функция проверки существования макета печатной формы, схожий в действии с функцией - ОбщегоНазначения.ЕстьРеквизитДокумента(), только ищет макет. Легко модернизируется на получение самого макета.

 

П.П.С. Обращение к разработчикам 1С. Добавьте к своему функционал печати возможность указать как начальную, так и конечную страницу вывода колонтитула, + возможность указанием в качестве шаблона произвольной области макета.

П.П.П.С Внесены доработки для работы кода в глобальном модуле. с.м. процедуру печати

Колонтитул Нижний колонтитул Верхний колонтитул Поиск макета Проверка существования макета. Прижать область к низу страницы Прижать к низу

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4871    10    5    

19

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3246    5    0    

22

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

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    3728    dimanich70    77    

75

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    3116    3    John_d    11    

57

Переоткрытие внешних обработок

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    4428    ke.92@mail.ru    16    

64
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. luanachaos 21.08.23 12:38 Сейчас в теме
При попытке просмотреть макет падает с ошибкой "Неизвестный формат картинки"
2. agent00mouse 256 27.08.23 13:19 Сейчас в теме
просмотрап где? Скачал обработку, В куонфигураторе открывается нормально, версия платформы 8.3.22.1750
Оставьте свое сообщение