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

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

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

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

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

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

Свежие комментарии