Итак. Делаем на базе БП 2.0. Для начала создадим внешнюю печатную форму Акта для печати из документа «Реализация товаров и услуг». Для этого создаём новую внешнюю обработку и даём ей название "АктСРекламой". Далее сразу добавляем реквизит "СсылкаНаОбъект" с типом "ДокументСсылка.РеализацияТоваровУслуг" и "ДополнительныеПараметры" с типом "Произвольный". Далее просто копируем макет "Акт" из документа "РеализацияТоваровУслуг" в нашу обработку. Для тестирования и отладки печатной формы, давайте сразу создадим форму вот такого вида
На кнопку выполнить вешаем процедуру
Процедура КнопкаВыполнитьНажатие(Кнопка) ТабДокумент=Печать(); КоличествоЭкземпляров =1; НаПринтер =Ложь; НепосредственнаяПечать=Ложь; УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(СсылкаНаОбъект, ""), НепосредственнаяПечать); КонецПроцедуры
При сохранении или проверке синтаксиса конечно же будет выдана ошибка относительно отсутствующей процедуры Печать, но скоро мы это поправим. В самом деле в теле процедуры можно ввести и просто Печать().Показать(); и этого будет вполне достаточно для тестирования. Однако при таком написании можно получить вывод печатной формы именно в том виде, в каком будет выведено программой в случае печати из документа. Хотя это и не существенно.
Теперь собственно создадим процедуру печати. Для этого перейдём в модуль объекта, и впишем туда заколовок функции печати: Функция Печать() Экспорт ну и КонецФункции. Теперь в модуле документа (РеализацияТоваровУслуг) найдём Функцию Печать и и посмотрим какой функцией формируется печатная форма Акта. И это функция ПечатьАктаОбОказанииУслуг(). Найдём её или перейдём к ней нажав F12. Всё содержимое этой функции копируем в нашу функцию Печать. Теперь если мы проверим модуль на ошибки, то будет выдано, что у нас не определена переменная мВалютаРегламентированногоУчета и функция ПодготовитьДанныеДляПечатиАктаОбОказанииУслуг. Опять же из модуля копируем определение переменной и присвоение ей значения (внизу модуля). С функцией поступаем так же (просто копируем её из модуля документа). Снова проверяем синтаксис и видим кучу ошибок о неопределённых переменных и о функции СформироватьСтруктуруПодписейДляПечати. Функцию снова копируем из модуля документа. Теперь остались ошибки только о неопределённых переменных. Но давайте на них посмотрим. Все эти переменные являются реквизитами документа, а так как теперь вызов функций происходит не в модуле документа, то и обращение к реквизитам документа напрямую теперь не доступно, теперь это должно происходить через реквизит нашей обработки "СсылкаНаОбъект". Т.е. теперь перед каждой такой "не определённой" переменной нужно вписать "СсылкаНаОбъект.", кроме "Ссылка" её можно просто заменить на "СсылкаНаОбъект". Теперь синтаксических ошибок нет, но если Вы попытаетесь вывести с её помощью документ на печать, то получите ещё ошибку "Поле объекта не обнаружено (Ссылка)". Корни этой ошибки теже самые, нужно заменить "ЭтотОбъект.Ссылка" на "СсылкаНаОбъект". Вот теперь можно пробовать напечатать документ. Это мы получили стандартную печатную форму Акта в виде внешней печатной формы. Её можно зарегистрировать и использовать. Но пока не зачем.
Первое что нужно сделать, это собственно создать секцию в макете с рекламным блоком. Это можно сделать любым удобным способом, например просто вставить в подготовленную секцию с именем "Реклама" блок с картинкой (как было у меня). Чтож приступим к выводу рекламы. Если мы просто в конце функции печать перед возвратом табличного документа впишем вывод секции "Реклама", то она конечно же будет отображена непосредственно под подписями, но у нас задача вывести рекламу внизу бланка. Для реализации этой задачи нам потребуется вывести перед блоком отступ. Для этого добавим ещё одну секцию и назовём её "ОтступРекламы". Она будет представлять из себя просто пустую строку, которую мы будем выводить в печатный документ до тех пор, пока секция с рекламой не окажется внизу бланка. Для этого впишем следующий текст в конце функции печать перед возвратом табличного документа
МассивСекций=Новый Массив; ОбластьМакета=Макет.ПолучитьОбласть("Реклама"); МассивСекций.Добавить(ОбластьМакета); Если НЕ ТабДокумент.ПроверитьВывод(МассивСекций) Тогда // Если реклама не влезает на последнем листе, значит её совсем не выводим Возврат ТабДокумент КонецЕсли; Пока 0=0 Цикл ОбластьМакета=Макет.ПолучитьОбласть("ОтступРекламы"); МассивСекций.Вставить(0,ОбластьМакета); // Пробуем вставить отступ (ещё один) перед блоком рекламы (пока в массив) Если НЕ ТабДокумент.ПроверитьВывод(МассивСекций) Тогда // Проверем, влезет ли на последнюю страницу // Если не влезло, то удаляем один отступ и выводим все секции накопленные в массиве МассивСекций.Удалить(0); Для Н=0 По МассивСекций.ВГраница() Цикл ОбластьМакета=МассивСекций.Получить(Н); ТабДокумент.Вывести(ОбластьМакета) КонецЦикла; Возврат ТабДокумент // готово, возвращаем табличный документ КонецЕсли КонецЦикла;
Вот и всё, на печать выводится Акт с блоком рекламы в самом низу листа. Регистрируем форму и пользуемся. Кстати если указать в качестве заменяемой печатной формы "Акт об оказании услуг", то вызов нашей формы будет производиться вместо стандартной формы.
А теперь усложним задачу. Нужно сделать так, чтобы блок выводился при печати только одной из организаций, а для другой (например чья реклама) блок выводить не нужно. Для этого воспользуемся Параметрами обработки для внешних печатных форм
Нажимаем "Задать параметры" и затем кнопку выбора. Добавляем параметр "Организация" и Тип "Строка" (жаль что нельзя прямо организацию указать) и пишем наименование организации в актах которой будем выводить рекламный блок.
Теперь в функцию печать перед определением массива (то что добавляли прошлый раз) добавляем следующий текст
Если Найти(Шапка.Организация.Наименование,ДополнительныеПараметры.Организация)=0 Тогда // Не то наименование, значит не выводим Возврат ТабДокумент КонецЕсли;
Сохраняем обработку и заменяем файл. Теперь при печати Акта блок будет выводиться только для той организации, которая указана в параметре обработки. Если в предыдущем коде вместо "=0" написать "0", тогда наоборот реклама будет выводиться для всех организаций, кроме указанной в параметре.
Ссылка на обработку из статьи: https://docs.google.com/file/d/0B3RtU7Pow7y3Y2Q0RTZMYXI3a2M/edit?usp=sharing