Как реализовать несколько кнопок печати для одной внешней печатной формы в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача, когда одна внешняя печатная форма должна выполнять несколько схожих функций. Например, печатать один и тот же документ, но с разными настройками (с факсимиле и без) или использовать разные макеты в зависимости от выбора пользователя. Создавать для каждой такой кнопки отдельный файл обработки неудобно с точки зрения поддержки кода. Рассмотрим, как реализовать механизм нескольких кнопок в рамках одной внешней печатной формы (ВПФ) на базе Библиотеки стандартных подсистем (БСП).

Регистрация нескольких команд в функции СведенияОВнешнейОбработке

Первым делом проанализируем функцию СведенияОВнешнейОбработке, которая находится в модуле объекта внешней обработки. Именно здесь мы сообщаем системе, какие команды должна отображать наша форма в меню «Печать» документа-хозяина. Ключевым моментом является то, что таблица команд может содержать неограниченное количество строк.

Разберем по шагам, как правильно сформировать таблицу команд, чтобы в интерфейсе появилось несколько кнопок. Каждая команда должна иметь уникальный Идентификатор, по которому мы будем отличать их при выполнении кода на сервере.

Посмотрим на пример заполнения таблицы команд:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Наименование = "Групповая печать актов";
    
    // Добавляем назначение (к каким документам цепляем форму)
    ПараметрыРегистрации.Назначение.Добавить("Документ.ПриемНаРаботу");

    // Создаем таблицу команд
    ТаблицаКоманд = ПолучитьТаблицуКоманд();

    // Добавляем первую команду
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = "Акт (вариант 1 - Стандарт)";
    НоваяКоманда.Идентификатор = "АктВариант1";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьМногократно";

    // Добавляем вторую команду
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = "Акт (вариант 2 - С логотипом)";
    НоваяКоманда.Идентификатор = "АктВариант2";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьМногократно";

    ПараметрыРегистрации.Команды.Загрузить(ТаблицаКоманд);

    Возврат ПараметрыРегистрации;

КонецФункции

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

В этом примере мы создали две кнопки. Обратите внимание на колонку Модификатор. Если указать там значение ПечатьМногократно, БСП будет понимать, что это печатная форма, и корректно обработает вывод в коллекцию печатных форм.

Обработка выбора команды в модуле объекта

После того как мы зарегистрировали команды, нам необходимо научить обработку реагировать на нажатие конкретной кнопки. Основная логика печати в ВПФ сосредоточена в процедуре Печать. Рассмотрим, как проанализировать, какая именно кнопка была нажата пользователем.

Параметр КоллекцияПечатныхФорм содержит в себе список имен макетов, которые система ожидает получить на выходе. В случае использования нескольких команд, в эту коллекцию будет передан именно тот Идентификатор, который мы указали при регистрации команды.

Выясним, как структурировать код внутри процедуры Печать:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    // Проверяем каждую форму, которую запросила система
    Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
        
        Если ПечатнаяФорма.ИмяМакета = "АктВариант1" Тогда
            
            // Логика для первого варианта
            ТабличныйДокумент = СформироватьАкт(МассивОбъектов, ОбъектыПечати, Ложь); // Ложь - без логотипа
            УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, 
                "АктВариант1", "Акт (вариант 1)", ТабличныйДокумент);
                
        ИначеЕсли ПечатнаяФорма.ИмяМакета = "АктВариант2" Тогда
            
            // Логика для второго варианта
            ТабличныйДокумент = СформироватьАкт(МассивОбъектов, ОбъектыПечати, Истина); // Истина - с логотипом
            УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, 
                "АктВариант2", "Акт (вариант 2)", ТабличныйДокумент);
                
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

В данном примере мы используем одну и ту же экспортную функцию СформироватьАкт, но передаем в нее разный набор параметров в зависимости от выбранной команды. Это позволяет максимально повторно использовать код, меняя лишь нюансы формирования документа.

Использование параметров печати и дополнительных настроек

Стоит отметить, что механизм БСП позволяет передавать не только идентификатор команды, но и дополнительные параметры печати через структуру ПараметрыВывода. Проанализируем ситуацию, когда нам нужно программно управлять поведением формы, например, выводить или скрывать подписи должностных лиц.

Важный момент: если вы добавляете новую кнопку в уже существующую внешнюю печатную форму, простого сохранения файла обработки недостаточно. Необходимо зайти в справочник «Дополнительные отчеты и обработки», нажать кнопку «Обновить из файла» и убедиться, что в таблице команд на форме элемента справочника появились новые записи. В противном случае интерфейс документа не узнает о существовании новой кнопки, так как список команд кэшируется в базе данных при регистрации обработки.

Отладка нескольких команд

Посмотрим, как упростить процесс отладки такой обработки. Поскольку процедура Печать находится в модуле объекта и вызывается системой программно, стандартная отладка через «Файл - Открыть» не сработает. Рекомендуется использовать специальные инструменты (обработки-отладчики ВПФ), которые имитируют поведение БСП. В такой отладке вы сможете вручную указать ИмяМакета (идентификатор команды) и проверить, правильно ли отрабатывает условие Если ... ИначеЕсли в вашем коде.

Подведем итог: использование нескольких команд в одной внешней печатной форме — это эффективный способ организации кода. Это позволяет:

  1. Избежать дублирования кода в разных файлах .epf.
  2. Группировать схожие печатные формы в одном пункте меню.
  3. Гибко управлять параметрами формирования документов через единую точку входа в процедуре Печать.

Используйте идентификаторы команд как основной рычаг управления логикой, и ваша работа с внешними печатными формами станет значительно профессиональнее и удобнее.

← На главную