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

03.01.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула:
.epf 596,52Kb
55
55 Скачать (1 SM) Купить за 1 850 руб.

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

Когда решив использовать функция для вывода всего содержимого страницы, а порой двух, трёх, четырёх.  Выявились у этого алгоритма огрехи, частично из-за проблем самой платформы с. Функция проверки возможности вывода ТабличныйДокумент.ПроверитьВывод(МассивДляПроверки) всегда возвращает клади Ложь если перед этим в ТабличныйДокумент не было выведено ни одной области. На массивах с большим количеством областей печати, код мог иногда выводить содержимое частично, оставляя 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С. Добавьте к своему функционал печати возможность указать как начальную, так и конечную страницу вывода колонтитула, + возможность указанием в качестве шаблона произвольной области макета.

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

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

См. также

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

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

7200 руб.

02.08.2023    4168    14    1    

32

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

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

29400 руб.

29.06.2023    5993    14    5    

24

Печатные формы Адаптация типовых решений Бухгалтер Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с установленными именами. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

3000 руб.

07.02.2023    6705    73    10    

30

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

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

21.05.2024    20118    dimanich70    81    

144

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

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

1 стартмани

18.03.2024    4091    3    John_d    11    

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