1. Создаем новую внешнюю обработку и указываем сведения в модуле объекта:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //Варианты: "ДополнительнаяОбработка", "ДополнительныйОтчет", "ЗаполнениеОбъекта", "Отчет", "ПечатнаяФорма", "СозданиеСвязанныхОбъектов"
МассивНазначений = Новый Массив();
МассивНазначений.Добавить("Справочник.Сотрудники");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Пример печатной формы с вводом параметров");
ПараметрыРегистрации.Вставить("Версия", "1.0"); //например: "1.0"
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); //Варианты: Истина, Ложь
ПараметрыРегистрации.Вставить("Информация", "");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
НСтр("ru = 'Пример печатной формы с вводом параметров'"),//для отображения пользователю
"ПримерПечатнойФормы",
"ВызовКлиентскогоМетода", //Использование. Варианты: "ОткрытиеФормы", "ВызовКлиентскогоМетода", "ВызовСерверногоМетода"
Истина,//Показывать оповещение. Варианты Истина, Ложь
"ПечатьMXL",//Модификатор
""); //Строка с идентификаторами заменяемых внутренних печатных форм. Например "Счет,Заказ"
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ЗаменяемыеКоманды", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "",ЗаменяемыеКоманды = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
НоваяКоманда.ЗаменяемыеКоманды = ЗаменяемыеКоманды;
КонецПроцедуры
Также в модуле объекта пишем:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода = Неопределено) Экспорт
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПримерПечатнойФормы") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПримерПечатнойФормы", //тот же - что и в функции "СведенияОВнешнейОбработке"!
"Пример печатной формы с вводом параметров",
СформироватьПримерПечатнойФормы(МассивОбъектов, ОбъектыПечати)//исполняющая функция (в этом же модуле)
);
КонецЕсли;
КонецПроцедуры
Функция СформироватьПримерПечатнойФормы(МассивОбъектов, ОбъектыПечати)
ДокументРезультат = Новый ТабличныйДокумент;
ДокументРезультат.КлючПараметровПечати = "ПараметрыПечати_ПримерВПФ";
ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ДокументРезультат.ПолеСправа = 20;
ДокументРезультат.АвтоМасштаб = Истина;
Макет = ПолучитьМакет("Макет");
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьМакета");
Сотрудники = МассивОбъектов[0].Сотрудники;
ТекстИзФормы = МассивОбъектов[0].ТекстДляПечати;
ВставлятьРазделительСтраниц = Ложь;
Для каждого стр Из Сотрудники Цикл
Если ВставлятьРазделительСтраниц Тогда
ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ОбластьМакета.Параметры.ТекстИзФормы = ТекстИзФормы;
ДокументРезультат.Вывести(ОбластьМакета);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
Возврат ДокументРезультат;
КонецФункции
2. Переходим к созданию основной формы обработки, она нам понадобится только для исполнения процедур:
- Добавим параметры к форме, обязательно в свойствах параметров указать "Ключевой параметр", после этого параметры выделятся жирным шрифтом
- В модуле основной формы пишем следующий код:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Сотрудники", ОбъектыНазначенияМассив);
ОткрытьФорму("ВнешняяОбработка.ПримерПечатнойФормы.Форма.ФормаВвода",ПараметрыФормы,,,,,Новый ОписаниеОповещения("ПечатьЗавершение", ЭтаФорма, ОбъектыНазначенияМассив), РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
Если Результат.Печать Тогда
ВыполняемаяКоманда = Параметры;
//начиная с версии БСП 3.1.9... в параметры добавляем КоллекцияПечатныхФорм
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника, КоллекцияПечатныхФорм");
ПараметрыОткрытия.ИсточникДанных = Параметры.ДополнительнаяОбработкаСсылка;
ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ВыполняемаяКоманда.ИдентификаторКоманды;
ДополнительныеПараметры = Новый Структура();
ДополнительныеПараметры.Вставить("СтруктураПараметров", Результат);
ОбъектыНазначения = Новый Массив;
ОбъектыНазначения.Добавить(Результат);
//Ссылки на вызвавшие форму объекты
Для каждого ОбъектНазначения Из ВыполняемаяКоманда.ОбъектыНазначения Цикл
ОбъектыНазначения.Добавить(ОбъектНазначения);
КонецЦикла;
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначения;
СформироватьПечатныеФормы(ПараметрыОткрытия); //<--начиная с версии БСП 3.1.9...
//Вывод сформированного табличного документа
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура СформироватьПечатныеФормы(ПараметрыОткрытия)
//добавляем с версии БСП 3.1.9...
Результат = Неопределено;
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Неопределено;
УправлениеПечатью.ПечатьПоВнешнемуИсточнику(
ПараметрыОткрытия.ИсточникДанных,
ПараметрыОткрытия.ПараметрыИсточника,
Результат,
ОбъектыПечати,
ПараметрыВывода);
ПараметрыОткрытия.КоллекцияПечатныхФорм = Общегоназначения.ТаблицаЗначенийВМассив(Результат);
КонецПроцедуры
- Создаем еще одну форму, и назовем ее "ФормаВвода", разместим на ней реквизит "ТекстДляПечати":
- В модуль формы добавим следующий код:
&НаКлиенте
Процедура Печать(Команда)
Структура = Новый Структура;
Структура.Вставить("Сотрудники", Сотрудники);
Структура.Вставить("ТекстДляПечати", ТекстДляПечати);
Структура.Вставить("Печать" , Истина);
ЭтаФорма.Закрыть(Структура);
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Сотрудники.ЗагрузитьЗначения(Параметры.Сотрудники);
ТекстДляПечати = "Пример печати";
КонецПроцедуры
В обработке "Внешняя печатная форма с вводом параметров (с версии БСП 3.1.9...)" есть возможность отладки печатной формы. Для этого необходимо указать основную форму "ФормаДляТестирования" и запускать в режиме 1С Предприятие через Файл-Открыть. Перед добавлением обработки в базу необходимо переназначить основную форму на "Форма".
Внешняя печатная форма с вводом параметров (с версии БСП 3.1.9...) тестировалась в конфигурации Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.27.90)
Внешняя печатная форма с вводом параметров (Версия БСП ниже 3.1.9...) тестировалась в конфигурации Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.25.136)