В комментариях к предыдущей моей статье были просьбы описать создание внешней печатной формы с возможностью ввода параметров. В тех же комментариях была ссылка на статью, где предлагался один из методов решения проблемы. В этой статье будет рассмотрено два других способа создать печатную форму с возможностью ввода доп.параметров, расположены они будут по сложности, начиная с самого простого.
Статья отображает частное мнение автора по данному вопросу и не претендует на истину в последней инстанции. Поэтому если кто-то может предложить иные способы решения данной проблемы, можете писать их в комментах)
Видеоверсию данной статьи можете посмотреть тут: http://youtu.be/9JlR-2rNW6o
Поставим задачу: вывести счет на оплату покупателя внешний с дополнительным комментарием.
Первый метод.Вывод табличного документа.
Данный метод можно назвать довольно топорным, но зато быстрым и не требующим каких-то особых дополнительных движений. Мы просто получаем табличный документ счета, и выводим его на экран.
Для описания этого метода возьмем обработку СчетНаОплатуПокупателюВнешний.epf из предыдущей моей статьи. Добавим реквизит обработки: Комментарий, тип строка(100).
Добавим форму обработки, на которой разместим данный реквизит, разместим кнопку «Печать» и создадим команду формы «Печать»
Также у формы создадим параметр «ОбъектыНазначения» тип«Произвольный» (сделайте его ключевым)
Поясню, при открытии формы, в этот параметр будут записаны все объекты, для которых открывается данная печатная форма.
Теперь перейдем в модуль формы и создадим на сервере Функцию ПечатьСерверная.
&НаСервере
Функция ПечатьСерверная()
КонецФункции
&НаКлиенте
Процедура Печать(Команда)
КонецПроцедуры
В функции ПечатьСерверная, создадим переменную МассивДокументов, в которую запишем параметр ОбъектыНазаначения.
МассивДокументов= Параметры.ОбъектыНазначения;
Получим объект обработки.
ЭтотОбъектОбработка= РеквизитФормыВЗначение("Объект");
Теперь перейдем в модуль обработки. И внесем кое какие изменения в уже написанный код.
Первым шагом, в функции СведенияОВнешнейОбработке() , в вызове процедуре ДобавитьКоманду исправим четвертый параметр – Использование,на «ОткрытиеФормы». Я не буду пояснять что значит данный параметр, кому непонятно можете посмотреть предыдущую статью (ссылка). Также я поменяю второй параметр, что бы удобнее было отличать формы.
ДобавитьКоманду(Команды,"Счет на оплату (внешняя печатная формас выводом формы)",
"СчетНаОплатуВнешний",
"ОткрытиеФормы",
Ложь,
"ПечатьMXL");
Теперь перейдем в процедуру Печать, сделаем функцией, и оставим только первый параметр МассивОбъектов
ФункцияПечать(МассивОбъектов) Экспорт
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетНаОплатуВнешний") Тогда
ТаблицаСведенийСчетНаОплату = ПолучитьТаблицуСведенийСчетаНаОплату(МассивОбъектов);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "СчетНаОплатуВнешний", "Счет на оплату",
ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати),,"ПФ_MXL_СчетЗаказ");
КонецЕсли;
ОбщегоНазначенияБП.ЗаполнитьДополнительныеПараметрыПечати(МассивОбъектов,КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецФункции
Смотрим на тело функции, тот код который там написан в нашем случае не применим. Поэтому мы вычистим ее, оставив только код, с помощью которого можно получить табличный документ это функция ПолучитьТаблицуСведенийСчетаНаОплатуи функция ПечатьСчетаНаОплату, функция ПечатьСчетаНаОплату возвращает табличный документ.
Должен получиться следующий код:
Функция Печать(МассивОбъектов) Экспорт
ТаблицаСведенийСчетНаОплату = ПолучитьТаблицуСведенийСчетаНаОплату(МассивОбъектов);
ТабДок =ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати);
КонецФункции
Поскольку параметр объекты печати является списком значений,содержащим распечатываемые документ(справочники), то создадим данный список, и заполним его объектами из массива и возвратим табличный документ.
ФункцияПечать(МассивОбъектов) Экспорт
ТаблицаСведенийСчетНаОплату = ПолучитьТаблицуСведенийСчетаНаОплату(МассивОбъектов);
ОбъектыПечати =Новый СписокЗначений;
ОбъектыПечати.ЗагрузитьЗначения(МассивОбъектов);
ТабДок =ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати);
Возврат ТабДок;
КонецФункции
Теперь изменим макет, добавив комментарий в подвал счета.
Осталось в функции ПечатьСчетаНаОплату у соответствующей области макета соответствующему параметру присвоить реквизит обработки Комментарий.
ОбластьМакета.Параметры.Комментарий = Комментарий;
Обращаю ваше внимание, у других конфигураций и других объектов могу быть иные процедуры формирования табличного документа, чем те которые приведены в примере, в данной статья показан общий механизм.
Заканчиваем работу с модулем обработки и переходим в модуль формы. В функцию ПечатьСерверная()
В этой функции мы уже получили объект обработки, теперь вызовем экспортную функции объекта Печать(), которая возвращает табличный документ. В данную функцию мы передадим МассивОбъектов. Пусть функция ПечатьСерверная() возвращает табличный документ, который был создан функций Печать().
&НаСервере
Функция ПечатьСерверная()
МассивДокументов = Параметры.ОбъектыНазначения;
ЭтотОбъектОбработка = РеквизитФормыВЗначение("Объект");
ТабДок =ЭтотОбъектОбработка.Печать(МассивДокументов);
Возврат ТабДок;
КонецФункции
Вызовем функцию ПечатьСерверная на клиенте, и покажем сформированный табличный документ.
&НаКлиенте
Процедура Печать(Команда)
ТабДок =ПечатьСерверная();
ТабДок.Показать();
КонецПроцедуры
Сохраняем печатную форму и добавляем в дополнительные отчеты и обработки конфигурации.
Перейдем в документ, выберем данную печатную форму.
Выйдет форма, в которой мы заполним поле комментарий.
Нажимаем печать и выходит табличный документ.
Все.
Возможно многих и устроит подобный вариант выхода печатной формы. Кто же хочет, что бы выходила типовая форма.
То изучайте вторую и третью часть этой статьи.
Второй метод. Использованиедополнительных сведений документа.
У всех конфигурации, разработанных при использованииБСП, почти у каждого документа есть интерфейсдополнительных сведений, в которые пользователь может вносить любую информацию(причем даже тогда, когда документ закрыт на редактирование). В эти сведения можно записывать дополнительнуюинформацию, которая требуется в печатной форме. Сейчас мы в демо конфигурации1С Бухгалтерия предприятия 3.0 Базовая создадим новое дополнительное сведение для документа СчетНаОплатуПокупателю, назовемего КомментарийДополнительный, тип Строка(100).
Для этого заходим в список счетов на оплату покупателю инажимаем кнопку дополнительные сведения
Откроется форма Дополнительных сведений, пока она пустая,т.к. нет ни каких сведений привязанных к данному документу.
Что бы создать их заходим в Все действия – Изменить составдополнительных сведений.
Откроется форма дополнительных сведений, в которой нажимаемна кнопку Создать, после появится форма нового дополнительного сведения.
Пишем наименование КомментарийДополнительный, тип значениявыбираем строка. И записываем новое дополнительное сведение.
Все оно создано, и появится в списке дополнительных сведений документа Счет наоплату покупателю. Запишем в него какой-нибудь комментарий, и сохраним.
Теперь нам осталось узнать под каким именем данноедополнительное сведение сохранилось в плане видов характеристик «Дополнительные реквизиты и сведения».
Зайдем в него через меню «Все функции».
Название выделенное на рисунке и есть полное название вновьсозданного дополнительного сведения «КомментарийДополнительный (Счет на оплатупокупателю)». Запомните его илисохраните куда-нибудь.
Все. Все необходимые приготовления мы сделали, теперьперейдем к написанию обработки, которая будет подставлять в комментарийзначение данного дополнительного сведенья.
Как и в предыдущей части, за основу мы будем брать обработкуиз моей предыдущей статьи.
Исправим в процедуре сведения СведенияОВнешнейОбработке() наименование параметра регистрации и представление команды, что бы можно былоотличить нашу новую обработку.
Функция СведенияОВнешнейОбработке() экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение",ПолучитьНазначениеОбработки());
ПараметрыРегистрации.Вставить("Наименование", "Счет на оплату ВНЕШНИЙДОП СВЕДЕНИЯ");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", "Счет на оплату (внешняяпечатная форма)");
ПараметрыРегистрации.Вставить("БезопасныйРежим",Истина);
Команды =ПолучитьТаблицуКоманд();
ДобавитьКоманду(Команды,"Счет на оплату (внешняя печатная формас исп. доп. сведений)",
"СчетНаОплатуВнешний",
"ВызовСерверногоМетода",
Ложь,
"ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды",Команды);
Возврат ПараметрыРегистрации;
КонецФункции
Теперь создадим функцию, которая получает по ссылке надокумент, и по ссылке на доп сведение значения. Кто не знает, поясню, чтозначения доп сведений в БСП хранятся в регистре сведений «ДополнительныеСведения»
Где в измерении Объект хранится ссылка на документ, визмерении Свойство – ссылка на план видов характеристик Дополнительные сведенияи реквизиты, а в ресурсе Значение – значение данного сведения для данногодокумента.
Посмотрите на состав регистра в нашем случае.
Поэтому создадим функцию в которую будем передавать массивдокументов и массив дополнительных сведений, а возвращать она будетсоответствующую выгрузку запроса.
Функция ПолучитьДопСведения(Знач МассивДокументов, Знач МассивДопСведений)
Запрос =Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ДополнительныеСведения.Объект КАК Документ,
| ДополнительныеСведения.Свойство КАК ДопСведение,
| ДополнительныеСведения.Значение
|ИЗ
| РегистрСведений.ДополнительныеСведения КАКДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект В(&Объект)
| И ДополнительныеСведения.СвойствоВ(&Свойство)";
Запрос.УстановитьПараметр("Объект",МассивДокументов);
Запрос.УстановитьПараметр("Свойство",МассивДопСведений);
Возврат запрос.Выполнить().Выгрузить();
КонецФункции
Теперь, перейдем в процедуру печать. В этой процедуре впервых строках кода нам нужно создать массив доп сведений, и получить результатвыполнения вышеприведенной функции.
МассивДопСведений= Новый Массив;
МассивДопСведений.Добавить(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("КомментарийДополнительный (Счет наоплату покупателю)
ТаблицаДопСвойств = ПолучитьДопСведения(МассивОбъектов,МассивДопСведений);
Поскольку у нас только одно свойство, то и элемент массивабудет один. Если в задаче будет стоять использование нескольких свойств, тонужно соответственно несколько элементов массива. В сам элемент массива записываем ссылку наплан видов характеристик «Дополнительные реквизиты и сведения», которую мы ищемпо названию, на которое я акцентировал внимание раньше.
Следующим шагом необходимо таблицу значений ТаблицаДопСвойствпередать в функцию ПечатьСчетаНаОплату, где мы будем извлекать значения, иподставлять в нужные параметры табличного документа. Добавим у данной функции новый параметр.
Функция ПечатьСчетаНаОплату(СведенияСчетаНаОплату, ОбъектыПечати,ТаблицаДопСвойств, СПечатью = Ложь) Экспорт
.............................................................................
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетНаОплатуВнешний") Тогда
ТаблицаСведенийСчетНаОплату = ПолучитьТаблицуСведенийСчетаНаОплату(МассивОбъектов);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "СчетНаОплатуВнешний", "Счет на оплату",
ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати,ТаблицаДопСвойств),,"ПФ_MXL_СчетЗаказ");
КонецЕсли;
Теперь добавим в макет новый параметр «Комментарий»
Найдем в процедуре ПечатьСчетаНаОплату место, где выводитсясоответствующая область в табличный документ, тут все индивидуально и в каждомслучае нужен свой подход. В нашем случае это будет область ПодвалСчета. Найдем вкоде, где она получается и рядом с типовым вводом параметров будем дописыватьобработку.
ОбластьМакета= Макет.ПолучитьОбласть("ПодвалСчета");
ОбластьМакета.Параметры.ФИОРуководителя = СведенияОДокументе.РуководительФИО;
ОбластьМакета.Параметры.ФИОБухгалтера = СведенияОДокументе.ГлавныйБухгалтерФИО;
//Получим значение допсвойство для данного документа внесем изменения в этот участок кода
//конецизменений
ЗаполнитьЗначенияСвойств(ОбластьМакета.Параметры, СведенияОДокументе);
Первым делом нам необходимо извлечь из таблицы значений ТаблицаДопСвойствзначение для распечатываемого документа и нужного дополнительного свойства. Дляэтого получим ссылку на доп. свойства используя наименование, которое мы ужезнаем.
//Получимзначение доп свойства для данного документа
ДопСведение =ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("КомментарийДополнительный (Счет наоплату покупателю)");
//
После этого создаем структуру с полями Документ иДопСведение, в которую вставим ссылку на наш документ и ссылку на найденноедополнительное сведение.
НоваяСтруктура= Новый Структура;
НоваяСтруктура.Вставить("Документ",СведенияОДокументе.Документ);
НоваяСтруктура.Вставить("ДопСведение",ДопСведение);
Ищем в таблице значений ТаблицаДопСвойств строки по данномуотбору.
МассивЗначения= ТаблицаДопСвойств.НайтиСтроки(НоваяСтруктура);
Проверим, есть ли в полученном массиве записи, и если естьто возьмем первый элемент массива, который будет являться строкой таблицы значений, и получим содержимоеколонки «Значение». Запишем этосодержимое в параметр.
Если МассивЗначения.Количество() <> 0 тогда
ЗначениеДопСведения = МассивЗначения[0].Значение;
ОбластьМакета.Параметры.Комментарий =ЗначениеДопСведения;
КонецЕсли;
Осталось сохранить обработку, добавить ее в дополнительныепечатные формы и посмотреть как выйдет наш счет.
Данным способом можно решить большинство задач где необходимо ввести дополнительные параметры во внешнюю печатную форму. Но если он вас чем-то не устраивает, остается третий способ интерактивным вызовом формы ПечатьДокументов и передачей в нее параметров. Он приведен в комментариях к моей предыдущей статье.