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