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