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