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