Проверка размещения табличного документа на странице и экономия бумаги

У клиента небольшие расходные накладные и вполне помещались бы по 2 на лист. Но 1С после каждой выводит разделитель страниц. Возникла задача убрать разделители между накладными, когда печатается список таких накладных.

Результат выглядит так:

А если накладная не помещается на лист, то не соединяется со следующей накладной:

Правда, чтобы накладные умещались, пришлось уменьшить масштаб, но это делает сам пользователь в настройках печати:

Как реализовано удаление разделителя?

При печати накладной из функции СформироватьПФ менеджера обработки ПечатьНакладная для каждого объекта печати вызывается ПечатьДокументовУНФ.ПередНачаломФормированияДокумента:

Эта процедура и добавляет разделитель строки.

Поэтому я вмешиваюсь уже после формирования печатной формы:


&Вместо("СформироватьПФ")
Функция мл_СформироватьПФ(ОписаниеПечатнойФормы, ДанныеОбъектовПечати, ОбъектыПечати, ВключаяУслуги)
	Результат = ПродолжитьВызов(ОписаниеПечатнойФормы, ДанныеОбъектовПечати, ОбъектыПечати, ВключаяУслуги);
	
	//Тут проходимся по разделителям страниц
	ТабличныйДокумент = ОписаниеПечатнойФормы.ТабличныйДокумент;
	УбратьЛишниеРазделителиСтраниц(ТабличныйДокумент);
	
	Возврат Результат;
КонецФункции


Масштабирование на одну страницу

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

Я написал специальную функцию, подбирающую масштаб.

Код полезных функций

С проверкой размещения табличного документа на листе пришлось повозиться, чтобы он корректно отрабатывал. Но в итоге получилось красиво!

Функция УбратьЛишниеРазделителиСтраниц(ТабличныйДокумент)
	ПредОбластьСтрока = Неопределено;
	НачалоЛиста = 1; 
	ПустойТД = Новый ТабличныйДокумент();
	ПустойТД.КлючПараметровПечати = ТабличныйДокумент.КлючПараметровПечати;
	
	НачалоСтраницы = 1;
	Для Стр = 1 ПО ТабличныйДокумент.ВысотаТаблицы Цикл
		ОбластьСтрока = ТабличныйДокумент.Область(Стр,,Стр);
		Если ОбластьСтрока.КонецСтраницы ИЛИ Стр = ТабличныйДокумент.ВысотаТаблицы Тогда

			//Временно убираем разделитель страницы
			ОбластьСтрока.КонецСтраницы = Ложь;    
			
			Если НЕ ПроверитьПомещаетсяЛиТабличныйДокументНаСтраницу(ТабличныйДокумент, ТабличныйДокумент.ПолучитьОбласть(НачалоЛиста, , Стр)) Тогда
				//Если не помещается 
				Если ПредОбластьСтрока <> Неопределено Тогда
					ПредОбластьСтрока.КонецСтраницы = истина; //Возвращаем разрыв страницы
					НачалоЛиста = НачалоСтраницы;
				КонецЕсли;
			КонецЕсли;
			
			//Отмечаем начало новой страницы
			ПредОбластьСтрока = ОбластьСтрока;
			НачалоСтраницы = Стр + 1;

		КонецЕсли;
	КонецЦикла;
КонецФункции           

Функция ВписатьВСтраницу(ТабличныйДокумент) Экспорт   
	ТабличныйДокумент.Автомасштаб = ложь;
	Масштаб = 100;
	Пока Масштаб > 10 Цикл
		ТабличныйДокумент.МасштабПечати = Масштаб;
		Если ПроверитьПомещаетсяЛиТабличныйДокументНаСтраницу(ТабличныйДокумент, ТабличныйДокумент, "ВыводПрисоединение") Тогда
			Возврат истина;
		КонецЕсли;
		Масштаб = Масштаб - 2; //с шагом в 2%
	КонецЦикла;
	Возврат ложь;
	
КонецФункции    

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


Среда: УНФ 3.0.7.122 Объем: 2.5 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *