Как передать параметры во внешнюю печатную форму (ВПФ) на управляемых формах?

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

Часто перед разработчиками 1С встает задача: создать несколько вариантов печатной формы, которые отличаются лишь незначительными деталями. Например, один вариант документа должен выводить информацию об упаковках, а другой — нет. Или один вариант для печати с НДС, другой — без НДС. Создавать и поддерживать две, три или более почти идентичных внешних печатных формы (ВПФ) — неэффективно и усложняет дальнейшее сопровождение. Для решения этой задачи подойдет автоподстановка печати и подписи в печатные формы.

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

Решение 1: Несколько команд в одной ВПФ (рекомендуемый способ)

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

Каждая команда будет видна пользователю в меню «Печать» и при вызове будет передавать в процедуру печати свой уникальный идентификатор. В коде мы анализируем этот идентификатор и в зависимости от него формируем нужный вариант отчета — для этого подойдет отладка кода 1С в режиме Предприятие.

Разберем по шагам:

  1. Определение команд в модуле ВПФ.

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

    Для этого мы формируем и возвращаем структуру, в которой по ключу "Команды" находится массив с описанием каждой команды.

    Посмотрим на пример. Допустим, нам нужно сделать два варианта печатной формы «Торг-12»: один с выводом упаковок, другой — без.

    
    Функция СведенияОВнешнейОбработке() Экспорт
    
        ПараметрыРегистрации = Новый Структура;
        ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
        ПараметрыРегистрации.Вставить("Назначение", Новый Массив);
        ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
        ПараметрыРегистрации.Вставить("Наименование", "Универсальная ТОРГ-12 (УФ)"); 
        ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
        ПараметрыРегистрации.Вставить("Версия", "1.1");
        
        // Создаем таблицу команд
        ТаблицаКоманд = Новый ТаблицаЗначений;
        ТаблицаКоманд.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); // Как команда будет видна пользователю
        ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); // Уникальное имя для программной обработки
        ТаблицаКоманд.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); // Способ вызова команды
        ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
        ТаблицаКоманд.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    
        // Команда 1: Печать с упаковками
        НоваяКоманда = ТаблицаКоманд.Добавить();
        НоваяКоманда.Представление = "ТОРГ-12 (с упаковками)";
        НоваяКоманда.Идентификатор = "Торг12_С_Упаковками";
        НоваяКоманда.Использование = "ВызовСерверногоМетода";
        НоваяКоманда.ПоказыватьОповещение = Истина;
    
        // Команда 2: Печать без упаковок
        НоваяКоманда = ТаблицаКоманд.Добавить();
        НоваяКоманда.Представление = "ТОРГ-12 (без упаковок)";
        НоваяКоманда.Идентификатор = "Торг12_Без_Упаковок";
        НоваяКоманда.Использование = "ВызовСерверногоМетода";
        НоваяКоманда.ПоказыватьОповещение = Истина;
        
        ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
        
        Возврат ПараметрыРегистрации;
    
    КонецФункции
    

    Теперь после регистрации такой ВПФ в меню «Печать» документа «Реализация товаров и услуг» появятся два новых пункта.

  2. Обработка идентификатора команды в процедуре печати.

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

    
    Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм,
            "ТОРГ12",
            "ТОРГ-12",
            СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыВывода.ИдентификаторКоманды)
        );
    
    КонецПроцедуры
    

    Обратите внимание, мы передаем ПараметрыВывода.ИдентификаторКоманды в нашу основную функцию формирования табличного документа.

  3. Реализация условной логики.

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

    
    Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ИдентификаторКоманды)
    
        // ... общая часть получения данных ...
        
        // Получаем макет. Если вы используете формат DOCX, изучите
        // заполнение Word-макетов при помощи БСП за 3 шага.
        Макет = ПолучитьМакет("МакетТорг12");
        
        // ... общая часть вывода шапки и подвала ...
        
        // А вот и наша условная логика
        Если ИдентификаторКоманды = "Торг12_С_Упаковками" Тогда
            // Здесь код, который выводит в макет информацию об упаковках
            // Например, запрашиваем и выводим связанные данные
            ВыводитьУпаковки = Истина;
        Иначе // ИдентификаторКоманды = "Торг12_Без_Упаковок"
            // Этот вариант не предполагает вывод упаковок
            ВыводитьУпаковки = Ложь;
        КонецЕсли;
    
        // ... цикл по товарам документа, где используется флаг "ВыводитьУпаковки" ...
        
        Возврат ТабличныйДокумент;
    
    КонецФункции
    

    Преимущества этого подхода очевидны: один файл ВПФ, единый код, нет лишних диалоговых окон для пользователя, всё интуитивно понятно и легко поддерживается.

Решение 2: ВПФ с формой настроек

Этот метод подходит для случаев, когда требуется более сложная и гибкая настройка перед печатью, и вариантов не два-три, а гораздо больше. В отличие от штатных возможностей, таких как редактирование печатных форм в программах 1С пользователем, здесь мы создаем полноценный программный интерфейс. Например, пользователь должен сам выбрать колонки для вывода, установить фильтры или указать способ группировки.

Принцип работы следующий:

  1. Внутри ВПФ создается обычная управляемая форма с необходимыми элементами управления (флажки, поля ввода, переключатели).
  2. В процедуре обработки команды печати (например, Печать()) мы не формируем табличный документ сразу, а открываем эту форму в модальном режиме. В параметры открытия формы передаем массив объектов, которые нужно напечатать.
  3. Пользователь настраивает параметры на форме и нажимает кнопку «Сформировать».
  4. Обработчик этой кнопки на форме запускает основную логику формирования печатной формы, используя данные из документов и настройки, указанные пользователем на форме.

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

Пример вызова формы из команды печати:


&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт

    // Создаем структуру с параметрами для передачи в форму
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ОбъектыДляПечати", ОбъектыНазначения);
    
    // Открываем модально нашу форму настроек
    ОткрытьФорму("ВнешняяОбработка.МояУниверсальнаяВПФ.Форма.ФормаНастроек", ПараметрыФормы);

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

Чтобы сделать этот способ удобнее, можно реализовать сохранение последних настроек пользователя (например, с помощью механизма ХранилищеОбщихНастроек). При следующем открытии формы настройки будут уже заполнены, и пользователю не придется вводить их заново.

Решение 3: Использование ВПФ-"запускатора"

Этот подход можно считать обходным путем или «костылем», но иногда он бывает полезен. Его суть в разделении логики на основную («тяжелую») ВПФ и несколько простых ВПФ-«пустышек».

Хотя этот метод позволяет хранить основной код в одном месте, он создает лишние сущности (несколько файлов .epf, несколько записей в справочнике ВПФ), что усложняет администрирование. Этот способ стоит рассматривать, только если по каким-то причинам нельзя модифицировать основную ВПФ или применить метод с несколькими командами.

Подведем итог: для решения задачи параметризации ВПФ в управляемых формах 1С предоставляет мощный и удобный механизм — создание нескольких команд в одной ВПФ. Именно этот способ рекомендуется использовать в большинстве случаев как наиболее правильный и поддерживаемый.

← На главную