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




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

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

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

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


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

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

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

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

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

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


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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Все.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

…………………………………………………………………..

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8 Comments

  1. Natali_77

    Спасибо!!!!

    Reply ↓
  2. todos

    Спасибо! Очень помогло

    Reply ↓
  3. dd74

    При запуске выдает ошибку

    : Переменная не определена (ПечатьТорговыхДокументов)

    Reply ↓
  4. ea_len

    Спасибо огромное! Появилась ясность, все получилось.

    Reply ↓
  5. avdik

    Большое-пребольшое спасибо. Получилось.

    Только немного переделала (наверное «топорно»).т.к. при добавлении внешней печатной формы в польз режиме выводилось сообщение о несоответствии текущей версии.

    Reply ↓
  6. altair057

    (5) Подскажите пожалуйста, а как вы исправили проблему несоответствия версии ?

    Reply ↓
  7. raa3738

    Вот такую ошибку дает:

    {ВнешняяОбработка.ЗагрузкаСОтбором.Форма.Форма.Форма(19,17)}: Неопознанный оператор

    ТабДок.Показать<<?>>; (Проверка: Сервер)

    {ВнешняяОбработка.ЗагрузкаСОтбором.Форма.Форма.Форма(19,17)}: Неопознанный оператор

    ТабДок.Показать<<?>>; (Проверка: Тонкий клиент)

    в строке видимо ошибка (выделено жирным):

    &НаКлиенте

    Процедура Печать(Команда)

    ТабДок = ПечатьНаСервере();

    ТабДок.Показать;

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

    А в инструкции нет ошибки, да и на видео тоже

    Reply ↓
  8. avdik

    (7)попробуйте посмотреть здесь https://forum.infostart.ru/forum9/topic164064/.

    Reply ↓

Leave a Comment

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