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

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

Комплект может быть фиксированный (нельзя менять количество копий для каждого документа и отключить вывод конкретного документа). Чтобы комплект стал фиксированным надо в реквизитах команды указать:
КомандаПечати.ФиксированныйКомплект = Истина; // Если Ложь, то для каждой формы можно поставить галку, печатать или нет
КомандаПечати.ПереопределитьПользовательскиеНастройкиКоличества = Истина; // Если ложь, то для каждой формы можно индивидуально поставить количество
Если не указывать, то комплект будет настраиваемым.
После заполнения необходимых параметров служебными методами вызывается форма ОбщаяФорма.ПечатьДокументов(). При создании этой печатной формы вызывается метод УправлениеПечатью.СформироватьПечатныеФормы(), который непосредственно обращается к модулю менеджера документа и вызывает экспортный метод Печать():
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Входные параметры заполняются в общем модуле УправлениеПечатью.СформироватьПечатныеФормы():
Коллекция = ПодготовитьКоллекциюПечатныхФорм(Идентификатор); где Идентификатор может быть как массив имен макетов, либо строка с именем макета, либо строка с списком имен макетов через запятую.
Процедура Печать() не обязательно должна быть в модуле менеджера объекта. Может использоваться менеджер другого объекта и т.д. За это отвечает колонка МенеджерПечати таблицы значений КомандыПечати.
В процедуре Печать() идет формирование табличного документа по имени макета, который должен присутствовать в таблице значений КоллекцияПечатныхФорм. Для каждой печатнйо формы есть свой блок, который выглядит примерно так:
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "Счет");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = ПечатьСчетаЗаказа(МассивОбъектов, ОбъектыПечати, "Счет",
ВыводитьПлатежныеРеквизиты, ПараметрыВывода.КодЯзыка);
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Счет на оплату'");
ПечатнаяФорма.ПолныйПутьКМакету = "Документ._ДемоСчетНаОплатуПокупателю.ПФ_MXL_СчетЗаказ";
ПечатнаяФорма.ИмяФайлаПечатнойФормы = ИменаФайлов;
КонецЕсли;
В ПолныйПутьКМакету указывается полный путь к макету, если пользователь захочет его изменить в клиенте. ВАЖНО! Для создаваемых макетов имя должно содержать "ПФ_". Если имя макета не содержит этой строки, то печатная форма не будет доступна для изменения в пользовательских макетах.
Так же часто используется альтернативный вариант формирования печатной формы в процедуре Печать:
// Печать накладной на перемещение.
НужноПечататьМакет = УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "НакладнаяНаПеремещение");
Если НужноПечататьМакет Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"НакладнаяНаПеремещение",
НСтр("ru = 'Накладная на перемещение'"),
ПечатнаяФормаПеремещениеТоваров(МассивОбъектов, ОбъектыПечати),
,
"Документ._ДемоПеремещениеТоваров.ПФ_MXL_НакладнаяНаПеремещение");
КонецЕсли;
Формирование Табличного документа.
Функция ПечатьСчетаЗаказа() формирует табличный документ. Для созданного табличного документа желательно заполнить уникальным значением свойство КлючПараметровПечати. Именно по этому имени система будет записывать и считывать настройки печати, которые установит пользователь.
Чтобы, в случае изменения макета пользователем, подгружался измененный макет, то для получения макета вызываем строку типа:
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ._ДемоСчетНаОплатуПокупателю.ПФ_MXL_СчетЗаказ", КодЯзыка);
В этом случае сначала ищется макет в регистре ПользовательскиеМакетыПечати. Если находит, то возвращает его, если нет, то макет из конфигуратора.
В функции формирования табличного документа полезно использовать следующие моменты:
1. В запросе надо выбрать реквизит Ссылка.
2. В начале цикла перебора по ссылкам полезно вставить
Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Это нужно для того, чтобы при печати нескольких документов между ними выводился разделитель страниц
3. Запомнить начала строки перед выводом данных по документу:
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
Это надо для того, чтобы для каждого документа выделялась отдельная область "Документ..."
Последняя строка области документа задается в конце цикла:
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, Шапка.Ссылка);
|