В некоторых случаях перед печатью документа требуется вручную указать какие-либо значения или параметры и передать в процедуру Печать() обработки. Для конфигураций линии УТ 10.3, БП 2.0 есть возможность передачи параметров, а также возможность без особых ухищрений вызвать форму обработки перед печатью с последующим выводом результата печати в штатное окно. В конфигурациях на основе Библиотеки стандартных процедур (Управление торговлей 11, Розница 2, УНФ, Бухгалтерия предприятия 3 и прочие) предусмотрены способы вызова команды печати в виде "ОткрытиеФормы" или "ВызовКлиентскогоМетода", но в этом случае вывод сформированного табличного документа необходимо реализовывать самостоятельно.
Рассмотрим один из способов передачи параметров для печати, не претендующий на оригинальность, так как используются штатные процедуры БСП.
В качестве примера выбрана печать простой накладной для УТ 11.0.9.15 - УТ 11.3 с возможностью печати со скидками или без них.
Создадим внешнюю обработку с основной формой "Форма" и реквизитом, например, "ПечататьСкидки", значение которого требуется передать в процедуру Печать() модуля обработки.
На вкладке "Параметры" укажем ключевые параметры "ДополнительнаяОбработкаСсылка" тип "СправочникСсылка.ДополнительныеОтчетыИОбработки", "ИдентификаторКоманды" тип "Строка", "ИмяФормы" тип "Строка", "ОбъектыНазначения" тип "Произвольный" (см. скриншот). Эти параметры передаются в обработку из конфигурации, а именно из диалога выбора внешних печатных форм, ключевыми в нашем случае они сделаны для упрощения обработки.
Далее определяем команду для печати или вывода печатной формы, навешиваем кнопку на форму.
Присваиваем команде обработчик действия (код следует поместить в модуль формы)
&НаСервереБезКонтекста
Функция ЕстьОбщийМодуль(НазваниеМодуля)
Возврат Метаданные.ОбщиеМодули.Найти(НазваниеМодуля) <> Неопределено;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьВерсиюБСП()
Возврат СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
КонецФункции
&НаКлиенте
Процедура ВыполнитьОткрытиеПечатнойФормы(Команда)
ВыполняемаяКоманда = Параметры;
СтандартнаяОбработка = Истина;
//Проверка на релиз БСП для универсальности.
//Общий модуль ДополнительныеОтчетыИОбработкиКлиентПереопределяемый существует в версии БСП выше 2.0.1.19
Если ЕстьОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиентПереопределяемый") Тогда
Выполнить("ДополнительныеОтчетыИОбработкиКлиентПереопределяемый.ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ВыполняемаяКоманда.ОбъектыНазначения, СтандартнаяОбработка);");
КонецЕсли;
Отказ = Ложь;
//Проверка на релиз БСП для универсальности.
//Если необходимо печатать из непроведённых документов, удалите этот фрагмент
ВерсияБСП = ПолучитьВерсиюБСП();
Если СравнитьВерсии(ВерсияБСП, "2.2.3") >= 0 Тогда
Выполнить("СписокДокументов = ВыполняемаяКоманда.ОбъектыНазначения;
|НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов(СписокДокументов);
|Если СтандартнаяОбработка И НепроведенныеДокументы.Количество() > 0 Тогда Отказ = Истина; КонецЕсли;
|");
Иначе
Выполнить("Если СтандартнаяОбработка И Не УправлениеПечатьюКлиент.ПроверитьДокументыПроведены(ВыполняемаяКоманда.ОбъектыНазначения) Тогда Отказ = Истина; КонецЕсли;");
КонецЕсли;
Если Не Отказ Тогда
//Определение и заполнение штатных параметров для общей формы ПечатьДокументов
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
ПараметрыОткрытия.ИсточникДанных = ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка;
ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ВыполняемаяКоманда.ИдентификаторКоманды;
//Здесь передаём наши значения в модуль обработки.
//Структура для передачи параметров или значений в процедуру Печать обработки
//В процедуре печати она будет доступна в качестве первого элемента массива МассивОбъектовНазначения
ДополнительныеПараметры = Новый Структура();
//Значения для передачи
ДополнительныеПараметры.Вставить("ПечататьСкидки", ЭтаФорма.ПечататьСкидки);
//Еще какие-то значения
//ДополнительныеПараметры.Вставить("РеквизитФормы1", РеквизитФормы1);
//ДополнительныеПараметры.Вставить("РеквизитФормы2", РеквизитФормы2);
//В массиве ОбъектыНазначения будут содержаться ссылки на вызвавший форму объект (документ, справочник)
// и наши значения из реквизитов формы или обработки
ОбъектыНазначения = Новый СписокЗначений;
ОбъектыНазначения.Добавить(ДополнительныеПараметры);
//Ссылки на вызвавшие форму объекты
Для каждого ОбъектНазначения Из ВыполняемаяКоманда.ОбъектыНазначения Цикл
ОбъектыНазначения.Добавить(ОбъектНазначения);
КонецЦикла; //Для каждого ОбъектНазначения Из
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначения;
//Вывод сформированного табличного документа в штатную форму.
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецЕсли;
ЭтаФорма.Закрыть();
КонецПроцедуры
В модуле обработки создаём экспортную процедуру Печать(), с параметрами согласно стандартам БСП для печати с использованием серверной процедуры примерно такого вида
// Экспортная процедура печати, вызываемая из основной программы
//
// Параметры:
// ВХОДЯЩИЕ:
// МассивОбъектовНазначения - Массив - список объектов ссылочного типа для печати документа
// Как правило, содержит один элемент с ссылкой на вызвавший форму объект (документ, справочник)
//
// ИСХОДЯЩИЕ:
// КоллекцияПечатныхФорм - ТаблицаЗначений - таблица сформированных табличных документов.
// Как правило, содержит одну строку с именем текущей печатной формы
// ОбъектыПечати - СписокЗначений - список объектов печати.
// ПараметрыВывода - Структура - Параметры сформированных табличных документов. Содержит поля:
// ДоступнаПечатьПоКомплектно - булево - по умолчанию Ложь
// ПолучательЭлектронногоПисьма
// ОтправительЭлектронногоПисьма
//
Процедура Печать(МассивОбъектовНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
//Получаем переданные из формы параметры для печати документа
//Из формы МассивОбъектовНазначения передаётся как список значений, поэтому преобразуем его в массив
Если ТипЗнч(МассивОбъектовНазначения) = Тип("СписокЗначений") Тогда
МассивОбъектовНазначения = МассивОбъектовНазначения.ВыгрузитьЗначения();
КонецЕсли;
//Присваиваем значение по умолчанию нашему параметру, переданному из формы
ПечататьСкидки = Истина;
//Смотрим, что содержится в первом элементе массива МассивОбъектовНазначения
//Если это структура, значит есть дополнительные параметры, почти как в прежних конфигурациях
Если ТипЗнч(МассивОбъектовНазначения[0]) = Тип("Структура") Тогда
ДополнительныеПараметры = МассивОбъектовНазначения[0];
Если ДополнительныеПараметры.Свойство("ПечататьСкидки") Тогда
ПечататьСкидки = ДополнительныеПараметры.ПечататьСкидки;
КонецЕсли;
//А теперь структуру из массива объектов можно удалить, больше она там не нужна
МассивОбъектовНазначения.Удалить(0);
КонецЕсли;
//Дальше используем штатный функционал БСП
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "РасходнаяНакладнаяСДиалогомВыбора") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "РасходнаяНакладнаяСДиалогомВыбора", "Расходная накладная", СформироватьПечатнуюФормуНакладная(МассивОбъектовНазначения, ОбъектыПечати, ПечататьСкидки));
КонецЕсли;
Реализация функции СформироватьПечатнуюФормуНакладная() зависит от конкретной задачи и здесь не рассматривается.
В экспортной функции СведенияОВнешнейОбработке() необходимо указать использование команды печати "ОткрытиеФормы" с модификатором "ПечатьMXL".
Подробнее смотрите статью Внешние обработки и отчеты 1С:Предприятие 8.2 или прилагаемый пример обработки.
//Определяем команды для печати формы
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Расходная накладная (с диалогом выбора)", // Представление команды в пользовательском интерфейсе
"РасходнаяНакладнаяСДиалогомВыбора", // Уникальный идентификатор команды
"ОткрытиеФормы", // Использование команды
Истина, // Показывать оповещение.
"ПечатьMXL" // Дополнительный модификатор команды.
);
Если всё сделано правильно, после регистрации внешней печатной формы в справочнике "ДополнительныеОбработки" она будет доступна из формы списка или документа в меню "Дополнительные печатные формы". После выбора из списка ВПФ на экране появится форма обработки.
Всё описанное выше изложено и прокомментировано в прилагаемой обработке.
Другой пример обработки можно скачать в Cпецификация на товар к договору с контрагентом - Бухгалтерия предприятия 3.0