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