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