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