Рассмотрим случай когда надо перед формированием печатной формы ввести какие-то значения, которые потом будут выведены в печатной форме.
Общий алгоритм следующий:
- Определяем сведения об обработке в модуле обработки, с учетом того, что нам надо запустить клиентский метод.
- Так же в модуле обработки создаем процедуру "Печать" в которой формируется табличный документ и добавляется в коллекцию печатных форм.
- Создаем основную форму обработки, в которой прописываем клиентскую процедуру Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт. В этой процедуре либо открываем форму с параметрами, либо программируем ввод параметров в диалоге (Ввод значений).
- Формируем из введенных значений структуру и передаем её в метод модуля обработки (п. 2) для получения табличного документа и коллекции печатных форм. В принципе процедуру из пункта 2 можно разместить и в модуле текущей формы - это дело вкуса.
- После того, как сформировали коллекцию печатных форм, выполняем метод УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбъектыПечати). Здесь есть нюанс: КоллекцияПечатныхФорм - это таблица значений. Таблицу значений нельзя передать с сервера на клиент, так как она не доступна на клиенте, поэтому таблица значений преобразовывается в массив структур с помощью метода ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм)
Рассмотрим подробнее случай когда параметры вводятся в отдельной форме:
1. Создаем внешнюю обработку.
Чтобы формирование табличного документа началось с клиентской процедуры надо в сведениях о внешней обработки указать Использование = "ВызовКлиентскогоМетода". Встречал в интернете альтернативное значение ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода().
В модуле обработки формируем сведения об обработки:
Перем НазваниеФормы;
Перем ИдентификаторФормы;
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг"); //Указываем документ к которому делаем внешнюю печ. форму
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", НазваниеФормы); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", НазваниеФормы);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, НазваниеФормы, НазваниеФормы, "ВызовКлиентскогоМетода", Ложь, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));//как будет выглядеть описание печ.формы для пользователя
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //имя макета печ.формы
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); //ВызовКлиентскогоМетода
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение, Модификатор)
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
В переменнst НазваниеФормы и ИдентификаторФормы записываем значения, чтобы не пришлось писать одно и тоже название в разных частях модуля. Здесь рассматриваем случай, когда в обработке только одна внешняя форма. Если несколько, то в других вызовах метода ДобавитьКоманду() надо будет указать соответствующие данные.
2. Создаем процедуру формирования табличного документа и заполнения коллекции печатных форм. В параметр СтруктураДопПараметров мы будем передавать структуру введенных данных на форме
// МассивОбъектов - массив ссылок на выбранные документы
// СтруктураДопПараметров - структура с значениями введенных параметров
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, СтруктураДопПараметров) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, ИдентификаторФормы) Тогда
Макет = ПолучитьМакет("Макет");
ТабличныйДокумент = Новый ТабличныйДокумент;
Для каждого ДокументСсылка Из МассивОбъектов Цикл
//Начало области, для параметра ОбъектыПечати.
//ОбъектыПечати используется для связи документа с его областью печати,
//когда в табличный документ выводится 2 и более документов
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
//формируем табличный документ
ФормированиеТабДокумента(ТабличныйДокумент, Макет, ДокументСсылка, СтруктураДопПараметров);
//Заполнение параметра ОбъектыПечати
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент,
НомерСтрокиНачало,
ОбъектыПечати,
ДокументСсылка);
КонецЦикла;
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
ИдентификаторФормы,
ИдентификаторФормы,
ТабличныйДокумент);
КонецЕсли;
КонецПроцедуры
Процедура ФормированиеТабДокумента(ТабличныйДокумент, Макет, ДокументСсылка, СтруктураДопПараметров)
Область = Макет.ПолучитьОбласть("Область1");
Область.Параметры.Контрагент = СтруктураДопПараметров.Контрагент; // выводим параметр из формы
Область.Параметры.Документ = ДокументСсылка; // выводим ссылку на выбранный в списке документ
ТабличныйДОкумент.Вывести(Область);
КонецПроцедуры
ИдентификаторФормы = "АктТест";
НазваниеФормы = "Тестовая форма";
3. Создаем основную форму обработки. В модуле моры создаем клиентскую процедуру Печать(). Эта форма открываться не будет. Её задача поймать момент вызова печатной формы. В этой процедуре открываем форму, в которой вводятся параметры. (Если параметр один, то можно организовать ввод значения и дальнейшую обработку сделать в этой форме)
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт
ОткрытьФорму("ВнешняяОбработка.ТестПечатнойФормыСВводомДанных.Форма.ФормаПараметров", Новый Структура("ИдентификаторКоманды,МассивОбъектов",ИдентификаторКоманды,МассивОбъектов));
КонецПроцедуры // Печать()
Создаем дополнительную форму "ФормаПараметров". У этой формы надо сделать 2 ключевых параметра: ИдентификаторКоманды (тип строка) и МассивОбъектов (тип Произвольный). Это делается для того, чтобы можно было во модуле формы всегда обратиться к этим значениям без дополнительных манипуляций.
Создаем в форме реквизиты для ввода нужных значений и размещаем их на форме. В данном случае это "Контрагент".
Создаем команду для вывода печатной формы после ввода нужных реквизитов. (ПечатьДокумента)
В модуле формы пишем обработку нажатия на кнопку:
&НаКлиенте
Процедура ПечатьДокумента(Команда)
СтруктураПечати = ПродолжитьПечатьНаСервере();
УправлениеПечатьюКлиент.ПечатьДокументов(СтруктураПечати.КоллекцияПечатныхФорм, СтруктураПечати.ОбъектыПечати);
Закрыть();
КонецПроцедуры
&НаСервере
Функция ПродолжитьПечатьНаСервере()
СтруктураДопПараметров = Новый Структура();
СтруктураДопПараметров.Вставить("Контрагент", Контрагент);
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(Параметры.ИдентификаторКоманды);
ОбъектыПечати = Новый СписокЗначений; // Не заполняем его. Он заполнится сам в УправлениеПечатью.ЗадатьОбластьПечатиДокумента();
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.Печать(Параметры.МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, СтруктураДопПараметров);
СтруктураПечати = Новый Структура;
СтруктураПечати.Вставить("КоллекцияПечатныхФорм", ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм));
СтруктураПечати.Вставить("ОбъектыПечати", ОбъектыПечати);
Возврат СтруктураПечати;
КонецФункции
Если бы мы не использовали параметры формы, то пришлось бы перехватывать значения в методу "ПриСозданииНаСервере" и заботиться о хранении значений.
Сначала формируем результирующий табличный документ и коллекцию печатных форм.
Обратите на то, что КоллекцияПечатныхФорм - это таблица значений и её нельзя вернуть на клиент, поэтому предварительно преобразовываем её в массив структур.
4. Формируем структуру данных в которой храним введенные значения на форме. Передаем эту структуру в качестве дополнительного параметра метода в модуле обработки.
5. Вызываем метод УправлениеПечатьюКлиент.ПечатьДокументов(), который выводит печатную форму на экран.
|