В процессе разработки часто возникает задача, когда одна внешняя печатная форма должна выполнять несколько схожих функций. Например, печатать один и тот же документ, но с разными настройками (с факсимиле и без) или использовать разные макеты в зависимости от выбора пользователя. Создавать для каждой такой кнопки отдельный файл обработки неудобно с точки зрения поддержки кода. Рассмотрим, как реализовать механизм нескольких кнопок в рамках одной внешней печатной формы (ВПФ) на базе Библиотеки стандартных подсистем (БСП).
Первым делом проанализируем функцию СведенияОВнешнейОбработке, которая находится в модуле объекта внешней обработки. Именно здесь мы сообщаем системе, какие команды должна отображать наша форма в меню «Печать» документа-хозяина. Ключевым моментом является то, что таблица команд может содержать неограниченное количество строк.
Разберем по шагам, как правильно сформировать таблицу команд, чтобы в интерфейсе появилось несколько кнопок. Каждая команда должна иметь уникальный Идентификатор, по которому мы будем отличать их при выполнении кода на сервере.
Посмотрим на пример заполнения таблицы команд:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Наименование = "Групповая печать актов";
// Добавляем назначение (к каким документам цепляем форму)
ПараметрыРегистрации.Назначение.Добавить("Документ.ПриемНаРаботу");
// Создаем таблицу команд
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Добавляем первую команду
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Акт (вариант 1 - Стандарт)";
НоваяКоманда.Идентификатор = "АктВариант1";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьМногократно";
// Добавляем вторую команду
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Акт (вариант 2 - С логотипом)";
НоваяКоманда.Идентификатор = "АктВариант2";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьМногократно";
ПараметрыРегистрации.Команды.Загрузить(ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
В этом примере мы создали две кнопки. Обратите внимание на колонку Модификатор. Если указать там значение ПечатьМногократно, БСП будет понимать, что это печатная форма, и корректно обработает вывод в коллекцию печатных форм.
После того как мы зарегистрировали команды, нам необходимо научить обработку реагировать на нажатие конкретной кнопки. Основная логика печати в ВПФ сосредоточена в процедуре Печать. Рассмотрим, как проанализировать, какая именно кнопка была нажата пользователем.
Параметр КоллекцияПечатныхФорм содержит в себе список имен макетов, которые система ожидает получить на выходе. В случае использования нескольких команд, в эту коллекцию будет передан именно тот Идентификатор, который мы указали при регистрации команды.
Выясним, как структурировать код внутри процедуры Печать:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем каждую форму, которую запросила система
Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
Если ПечатнаяФорма.ИмяМакета = "АктВариант1" Тогда
// Логика для первого варианта
ТабличныйДокумент = СформироватьАкт(МассивОбъектов, ОбъектыПечати, Ложь); // Ложь - без логотипа
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
"АктВариант1", "Акт (вариант 1)", ТабличныйДокумент);
ИначеЕсли ПечатнаяФорма.ИмяМакета = "АктВариант2" Тогда
// Логика для второго варианта
ТабличныйДокумент = СформироватьАкт(МассивОбъектов, ОбъектыПечати, Истина); // Истина - с логотипом
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
"АктВариант2", "Акт (вариант 2)", ТабличныйДокумент);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В данном примере мы используем одну и ту же экспортную функцию СформироватьАкт, но передаем в нее разный набор параметров в зависимости от выбранной команды. Это позволяет максимально повторно использовать код, меняя лишь нюансы формирования документа.
Стоит отметить, что механизм БСП позволяет передавать не только идентификатор команды, но и дополнительные параметры печати через структуру ПараметрыВывода. Проанализируем ситуацию, когда нам нужно программно управлять поведением формы, например, выводить или скрывать подписи должностных лиц.
Важный момент: если вы добавляете новую кнопку в уже существующую внешнюю печатную форму, простого сохранения файла обработки недостаточно. Необходимо зайти в справочник «Дополнительные отчеты и обработки», нажать кнопку «Обновить из файла» и убедиться, что в таблице команд на форме элемента справочника появились новые записи. В противном случае интерфейс документа не узнает о существовании новой кнопки, так как список команд кэшируется в базе данных при регистрации обработки.
Посмотрим, как упростить процесс отладки такой обработки. Поскольку процедура Печать находится в модуле объекта и вызывается системой программно, стандартная отладка через «Файл - Открыть» не сработает. Рекомендуется использовать специальные инструменты (обработки-отладчики ВПФ), которые имитируют поведение БСП. В такой отладке вы сможете вручную указать ИмяМакета (идентификатор команды) и проверить, правильно ли отрабатывает условие Если ... ИначеЕсли в вашем коде.
Подведем итог: использование нескольких команд в одной внешней печатной форме — это эффективный способ организации кода. Это позволяет:
.epf.Печать.Используйте идентификаторы команд как основной рычаг управления логикой, и ваша работа с внешними печатными формами станет значительно профессиональнее и удобнее.