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