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