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