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