helpf.pro
Регистрация

v8: Как вывести на печать только первую и последнюю страницу?

Goody
07.02.2013 14:18Прочитано: 5949
Потребовалось сделать сабж. Перерыл форумы и ничего подобного не нашлось.
Сделал так:
В обработке групповой печати добавил флажок и подправил ОбщиеМодули - УниверсальныеМеханизмы

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

Процедура НапечататьДокумент(ПечДокумент, КоличествоЭкземпляров = 1, НаПринтер = Ложь, Заголовок = "", НепосредственнаяПечать = Ложь, Ссылка = Неопределено, ИмяМакета = "") Экспорт
Если ПечДокумент = Неопределено тогда
Возврат;
КонецЕсли;

// Получить необходимое количество копий
Если КоличествоЭкземпляров > 0 Тогда
ПечДокумент.КоличествоЭкземпляров = КоличествоЭкземпляров;
КонецЕсли;

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

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

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

//Выводим первую страницу
ТекФорма.ЭлементыФормы.результат.вывести(ПечДокумент.ПолучитьОбласть(1,1,КонецПервойСтраницы,ПечДокумент.ШиринаТаблицы));
//Выводим последнюю страницу
ТекФорма.ЭлементыФормы.результат.вывести(ПечДокумент.ПолучитьОбласть(НачалоПоследнейСтраницы,1,ПечДокумент.ВысотаТаблицы,ПечДокумент.ШиринаТаблицы));
Иначе
ТекФорма.ЭлементыФормы.результат.вывести(ПечДокумент);
КонецЕсли;
Возврат;
КонецЕсли;

Если НаПринтер Тогда

ПечДокумент.Напечатать(НепосредственнаяПечать = Истина);

Иначе
// Отобразить печатный документ на экране
ФормаПечати = ПолучитьОбщуюФорму("ФормаПечати",, Заголовок + ИмяМакета + Ссылка);
ФормаПечати.Документ = Ссылка;
ФормаПечати.Заголовок = Заголовок;
ФормаПечати.ИмяМакета = ИмяМакета;
ФормаПечати.ПечатныйДокумент = ПечДокумент;
ФормаПечати.Открыть();

КонецЕсли;

КонецПроцедуры // НапечататьДокумент()



Изменено 07.02.13 14:21:18
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
07.02.2013 14:33Ответ № 1
Я так понимаю это готовое решение!?
Подсказка: Щелникни по Имени пользователя напротив ответа, и тем самым покажешь, что сообщение адресовано ему.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.