gifts2017

Создание внешней печатной формы под УП с возможностью передачи параметров (для конфигураций на БСП)

Опубликовал Ильяс Низамутдинов (signum2009) в раздел Печать - Печатные формы документов

В статье будет широко рассмотрен вопрос создания внешней печатной формы под управляемым приложением  с возможностью передачи параметров. Предложено два способа распечатать ВПФ и передать в нее нужные параметры.

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

Статья отображает частное мнение автора по данному вопросу и не претендует на истину в последней инстанции. Поэтому если кто-то может предложить иные способы решения данной проблемы, можете писать их в комментах)

Видеоверсию данной статьи можете посмотреть тут: http://youtu.be/9JlR-2rNW6o

Поставим задачу: вывести счет на оплату покупателя внешний с дополнительным комментарием.


Первый метод.Вывод табличного документа.


Данный метод можно назвать довольно топорным, но зато быстрым и не требующим каких-то особых дополнительных движений. Мы просто получаем табличный документ счета, и выводим его на экран.

Для описания этого метода возьмем обработку СчетНаОплатуПокупателюВнешний.epf из предыдущей моей статьи. Добавим реквизит обработки: Комментарий, тип строка(100).

Добавим форму обработки, на которой разместим данный реквизит, разместим кнопку «Печать» и создадим команду формы «Печать»

Также у формы создадим параметр «ОбъектыНазначения» тип«Произвольный» (сделайте его ключевым)

Поясню, при открытии формы, в этот параметр будут записаны все объекты, для которых открывается данная печатная форма.



Теперь перейдем в модуль формы и создадим на сервере Функцию ПечатьСерверная.

&НаСервере
Функция ПечатьСерверная()

КонецФункции
&НаКлиенте
Процедура Печать(Команда)

КонецПроцедуры

В функции ПечатьСерверная, создадим переменную МассивДокументов, в которую запишем параметр ОбъектыНазаначения.

МассивДокументов= Параметры.ОбъектыНазначения;

Получим объект обработки.

ЭтотОбъектОбработка= РеквизитФормыВЗначение("Объект");

Теперь перейдем в модуль обработки. И внесем кое какие изменения в уже написанный код.

Первым шагом, в функции СведенияОВнешнейОбработке() , в вызове процедуре ДобавитьКоманду исправим четвертый параметр – Использование,на «ОткрытиеФормы». Я не буду пояснять что значит данный параметр, кому непонятно можете посмотреть предыдущую статью (ссылка). Также я поменяю второй параметр, что бы удобнее было отличать формы.


ДобавитьКоманду(Команды,"Счет на оплату (внешняя печатная формас выводом формы)", 
                           "СчетНаОплатуВнешний",
       
                    "ОткрытиеФормы",
                           Ложь,
                          
"ПечатьMXL");

Теперь перейдем в процедуру Печать, сделаем функцией, и оставим только первый параметр МассивОбъектов

ФункцияПечать(МассивОбъектов) Экспорт
   
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;


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

   
ОбщегоНазначенияБП.ЗаполнитьДополнительныеПараметрыПечати(МассивОбъектов,КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецФункции


Смотрим на тело функции, тот код который там написан в нашем случае не применим. Поэтому мы вычистим ее, оставив только код, с помощью которого можно получить табличный документ это функция ПолучитьТаблицуСведенийСчетаНаОплатуи функция ПечатьСчетаНаОплату, функция ПечатьСчетаНаОплату возвращает табличный документ.


Должен получиться следующий код:

Функция Печать(МассивОбъектов) Экспорт

   
ТаблицаСведенийСчетНаОплату = ПолучитьТаблицуСведенийСчетаНаОплату(МассивОбъектов);

   
ТабДок =ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати);

КонецФункции


Поскольку параметр объекты печати является списком значений,содержащим распечатываемые документ(справочники), то создадим данный список, и заполним его объектами из массива и возвратим табличный документ.

ФункцияПечать(МассивОбъектов) Экспорт

   
ТаблицаСведенийСчетНаОплату = ПолучитьТаблицуСведенийСчетаНаОплату(МассивОбъектов);

   
ОбъектыПечати =Новый СписокЗначений;
   
ОбъектыПечати.ЗагрузитьЗначения(МассивОбъектов);

   
ТабДок =ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати);
    Возврат
ТабДок;
КонецФункции

Теперь изменим макет, добавив комментарий в подвал счета.



Осталось в функции ПечатьСчетаНаОплату у соответствующей области макета соответствующему параметру присвоить реквизит обработки Комментарий.

ОбластьМакета.Параметры.Комментарий     = Комментарий;


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

Заканчиваем работу с модулем обработки и переходим в модуль формы. В функцию ПечатьСерверная()

В этой функции мы уже получили объект обработки, теперь вызовем экспортную функции объекта Печать(), которая возвращает табличный документ. В данную функцию мы передадим МассивОбъектов. Пусть функция ПечатьСерверная() возвращает табличный документ, который был создан функций Печать().

&НаСервере
Функция ПечатьСерверная()
   
МассивДокументов = Параметры.ОбъектыНазначения;
   
ЭтотОбъектОбработка = РеквизитФормыВЗначение("Объект");

   
ТабДок =ЭтотОбъектОбработка.Печать(МассивДокументов);
    Возврат
ТабДок;
КонецФункции

Вызовем функцию ПечатьСерверная на клиенте, и покажем сформированный табличный документ.

&НаКлиенте
Процедура Печать(Команда)
   
ТабДок =ПечатьСерверная();
   
ТабДок.Показать();
КонецПроцедуры


Сохраняем печатную форму и добавляем в дополнительные отчеты и обработки конфигурации.

Перейдем в документ, выберем данную печатную форму.

Выйдет форма, в которой мы заполним поле комментарий.

Нажимаем печать и выходит табличный документ.

Все.

Возможно многих и устроит подобный вариант выхода печатной формы. Кто же хочет, что бы выходила типовая форма.

То изучайте вторую и третью часть этой статьи.


Второй метод. Использованиедополнительных сведений документа.

У всех конфигурации, разработанных при использованииБСП, почти у каждого документа есть интерфейсдополнительных сведений, в которые пользователь может вносить любую информацию(причем даже тогда, когда документ закрыт на редактирование). В эти сведения можно записывать дополнительнуюинформацию, которая требуется в печатной форме. Сейчас мы в демо конфигурации1С Бухгалтерия предприятия 3.0 Базовая создадим новое дополнительное сведение для документа СчетНаОплатуПокупателю, назовемего КомментарийДополнительный, тип Строка(100).


Для этого заходим в список счетов на оплату покупателю инажимаем кнопку дополнительные сведения

Откроется форма Дополнительных сведений, пока она пустая,т.к. нет ни каких сведений привязанных к данному документу.

Что бы создать их заходим в Все действия – Изменить составдополнительных сведений.

Откроется форма дополнительных сведений, в которой нажимаемна кнопку Создать, после появится форма нового дополнительного сведения.

Пишем наименование КомментарийДополнительный, тип значениявыбираем строка. И записываем новое дополнительное сведение.



Все оно создано, и появится в списке дополнительных сведений документа Счет наоплату покупателю. Запишем в него какой-нибудь комментарий, и сохраним.




Теперь нам осталось узнать под каким именем данноедополнительное сведение сохранилось в плане видов характеристик «Дополнительные реквизиты и сведения».

Зайдем в него через меню «Все функции».


Название выделенное на рисунке и есть полное название вновьсозданного дополнительного сведения «КомментарийДополнительный (Счет на оплатупокупателю)». Запомните его илисохраните куда-нибудь.

Все. Все необходимые приготовления мы сделали, теперьперейдем к написанию обработки, которая будет подставлять в комментарийзначение данного дополнительного сведенья.

Как и в предыдущей части, за основу мы будем брать обработкуиз моей предыдущей статьи.

Исправим в процедуре сведения СведенияОВнешнейОбработке() наименование параметра регистрации и представление команды, что бы можно былоотличить нашу новую обработку.

Функция СведенияОВнешнейОбработке() экспорт

   
ПараметрыРегистрации = Новый Структура;
   
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
   
ПараметрыРегистрации.Вставить("Назначение",ПолучитьНазначениеОбработки());
   
ПараметрыРегистрации.Вставить("Наименование", "Счет на оплату ВНЕШНИЙДОП СВЕДЕНИЯ");
   
ПараметрыРегистрации.Вставить("Версия", "1.0");
   
ПараметрыРегистрации.Вставить("Информация", "Счет на оплату (внешняяпечатная форма)");
   
ПараметрыРегистрации.Вставить("БезопасныйРежим",Истина);

   
Команды =ПолучитьТаблицуКоманд();

   
ДобавитьКоманду(Команды,"Счет на оплату (внешняя печатная формас исп. доп. сведений)",
                          
"СчетНаОплатуВнешний",
                          
"ВызовСерверногоМетода",
                           Ложь,
                          
"ПечатьMXL");

   
ПараметрыРегистрации.Вставить("Команды",Команды);
    Возврат
ПараметрыРегистрации;

КонецФункции

Теперь создадим функцию, которая получает по ссылке надокумент, и по ссылке на доп сведение значения. Кто не знает, поясню, чтозначения доп сведений в БСП хранятся в регистре сведений «ДополнительныеСведения»




Где в измерении Объект хранится ссылка на документ, визмерении Свойство – ссылка на план видов характеристик Дополнительные сведенияи реквизиты, а в ресурсе Значение – значение данного сведения для данногодокумента.

Посмотрите на состав регистра в нашем случае.



Поэтому создадим функцию в которую будем передавать массивдокументов и массив дополнительных сведений, а возвращать она будетсоответствующую выгрузку запроса.

Функция ПолучитьДопСведения(Знач МассивДокументов, Знач МассивДопСведений)

   
Запрос =Новый Запрос;
   
Запрос.Текст = "ВЫБРАТЬ
                  |    ДополнительныеСведения.Объект КАК Документ,
                  |    ДополнительныеСведения.Свойство КАК ДопСведение,
                  |    ДополнительныеСведения.Значение
                  |ИЗ
                  |    РегистрСведений.ДополнительныеСведения КАКДополнительныеСведения
                  |ГДЕ
                  |    ДополнительныеСведения.Объект В(&Объект)
                  |    И ДополнительныеСведения.СвойствоВ(&Свойство)"
;
   
Запрос.УстановитьПараметр("Объект",МассивДокументов);
   
Запрос.УстановитьПараметр("Свойство",МассивДопСведений);

    Возврат
запрос.Выполнить().Выгрузить();

КонецФункции

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

МассивДопСведений= Новый Массив;

МассивДопСведений.Добавить(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("КомментарийДополнительный (Счет наоплату покупателю)

ТаблицаДопСвойств = ПолучитьДопСведения(МассивОбъектов,МассивДопСведений);

Поскольку у нас только одно свойство, то и элемент массивабудет один. Если в задаче будет стоять использование нескольких свойств, тонужно соответственно несколько элементов массива. В сам элемент массива записываем ссылку наплан видов характеристик «Дополнительные реквизиты и сведения», которую мы ищемпо названию, на которое я акцентировал внимание раньше.

Следующим шагом необходимо таблицу значений ТаблицаДопСвойствпередать в функцию ПечатьСчетаНаОплату, где мы будем извлекать значения, иподставлять в нужные параметры табличного документа. Добавим у данной функции новый параметр.

Функция ПечатьСчетаНаОплату(СведенияСчетаНаОплату, ОбъектыПечати,ТаблицаДопСвойств, СПечатью = Ложь) Экспорт

.............................................................................

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

Теперь добавим в макет новый параметр «Комментарий»


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

ОбластьМакета= Макет.ПолучитьОбласть("ПодвалСчета");

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


Первым делом нам необходимо извлечь из таблицы значений ТаблицаДопСвойствзначение для распечатываемого документа и нужного дополнительного свойства. Дляэтого получим ссылку на доп. свойства используя наименование, которое мы ужезнаем.

//Получимзначение доп свойства для данного документа

ДопСведение =ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("КомментарийДополнительный (Счет наоплату покупателю)");
//

После этого создаем структуру с полями Документ иДопСведение, в которую вставим ссылку на наш документ и ссылку на найденноедополнительное сведение.

НоваяСтруктура= Новый Структура;
НоваяСтруктура.Вставить("Документ",СведенияОДокументе.Документ);
НоваяСтруктура.Вставить("ДопСведение",ДопСведение);

Ищем в таблице значений ТаблицаДопСвойств строки по данномуотбору.

МассивЗначения= ТаблицаДопСвойств.НайтиСтроки(НоваяСтруктура);

Проверим, есть ли в полученном массиве записи, и если естьто возьмем первый элемент массива, который будет являться строкой таблицы значений, и получим содержимоеколонки «Значение». Запишем этосодержимое в параметр.

Если МассивЗначения.Количество() <> 0 тогда

   
ЗначениеДопСведения = МассивЗначения[0].Значение;

   
ОбластьМакета.Параметры.Комментарий =ЗначениеДопСведения;
КонецЕсли;

Осталось сохранить обработку, добавить ее в дополнительныепечатные формы и посмотреть как выйдет наш счет.





Данным способом можно решить большинство задач где необходимо ввести дополнительные параметры во внешнюю печатную форму. Но если он вас чем-то не устраивает, остается третий способ интерактивным вызовом формы ПечатьДокументов и передачей в нее параметров. Он приведен в комментариях к моей предыдущей статье.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
СчетНаОплатуВнешнийДляДопСвойств.epf
.epf 14,02Kb
07.08.14
21
.epf 14,02Kb 21 Скачать
СчетНаОплатуВнешнийСФОРМОЙ.epf
.epf 15,77Kb
07.08.14
29
.epf 15,77Kb 29 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Наталья (Natali_77) 17.01.15 13:27
2. Александр Кузенный (todos) 11.06.15 14:25
3. Alex Pr (dd74) 19.01.16 09:24
При запуске выдает ошибку
: Переменная не определена (ПечатьТорговыхДокументов)
4. Елена Шекемова (ea_len) 29.02.16 22:41
Спасибо огромное! Появилась ясность, все получилось.
5. Aнастасия Дикарева (avdik) 25.11.16 15:20
Большое-пребольшое спасибо. Получилось.
Только немного переделала (наверное "топорно").т.к. при добавлении внешней печатной формы в польз режиме выводилось сообщение о несоответствии текущей версии.


Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа