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