Как в одной внешней печатной форме (ВПФ) создать несколько вариантов печати?

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

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

Решение 1: Добавление нескольких команд с уникальными идентификаторами

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

Шаг 1. Регистрация команд

Проанализируем функцию СведенияОВнешнейОбработке в модуле объекта вашей ВПФ. В ней формируется таблица команд, которая передается в БСП.

Предположим, у вас уже есть одна команда:


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

 	ПараметрыРегистрации = Новый Структура;
	МассивНазначений = Новый Массив;
	МассивНазначений.Добавить("Документ.ЗаказКлиента");

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

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

Чтобы добавить вторую команду, например, для печати с факсимиле, нужно добавить еще одну строку в ТаблицаКоманд. Критически важно, чтобы значения в колонках "Представление" и "Идентификатор" отличались.

Причина ошибки: если вы добавите вторую команду с таким же идентификатором ("СчетНаОплату"), система БСП посчитает их одной и той же командой и отобразит в меню только первую. Именно поэтому у вас может появляться только один пункт в меню "Печать".

Правильный код с двумя командами будет выглядеть так:


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

Теперь в меню "Печать" документа "Заказ клиента" появятся два пункта.

Шаг 2. Обработка команд в процедуре `Печать`

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

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

Пример реализации процедуры Печать:


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

	// Проверяем, нужно ли печатать обычный счет
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетНаОплату") Тогда
	
		// Здесь логика формирования табличного документа БЕЗ факсимиле
		// Например, вызов процедуры:
		СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, Ложь);
		
	КонецЕсли;

	// Проверяем, нужно ли печатать счет с факсимиле
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетНаОплату_Факсимиле") Тогда
	
		// Здесь логика формирования табличного документа С факсимиле
		// Например, вызов той же процедуры, но с другим параметром:
		СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, Истина);
		
	КонецЕсли;

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


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

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

Таким образом, одна и та же ВПФ может формировать разные представления документа в зависимости от выбранной пользователем команды.

Решение 2: Использование параметров печати (альтернативный подход)

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

Этот подход имеет свои преимущества:

  1. Не перегружает меню "Печать": Все опции собраны в одном месте.
  2. Гибкость: Легко добавлять новые параметры, не создавая новые команды.

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

Особенности для 1С:Бухгалтерия:

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

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

← На главную