Почему внешняя печатная форма не появляется в кнопке «Печать» документа на управляемых формах?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Подключение внешних печатных форм в конфигурациях на управляемых формах базируется на механизмах Библиотеки стандартных подсистем (БСП). Нередко разработчики сталкиваются с ситуацией: внешняя обработка успешно добавлена в справочник дополнительных отчетов и обработок, модуль содержит стандартную экспортную функцию СведенияОВнешнейОбработке(), однако в самом документе в меню кнопки Печать новая команда так и не появляется. Кроме того, в карточке справочника может не сохраняться назначение объекта. Проанализируем причины такого поведения и разберем по шагам способы устранения неполадки.

1. Корректное формирование структуры сведений об обработке

Выясним причину, почему список команд или назначение могут работать некорректно. Для того чтобы подсистема БСП распознала внешнюю обработку как печатную форму и связала ее с конкретным документом, функция СведенияОВнешнейОбработке() в модуле объекта должна содержать строго определенные поля и структуры. Рассмотрим пример типового заполнения экспортной функции для внешней печатной формы:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("Наименование", "Внешняя печатная форма накладной");
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма к документу");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

    // Указываем объекты метаданных, для которых предназначена печатная форма
    Назначение = Новый Массив;
    Назначение.Добавить("Документ.РеализацияТоваровУслуг");
    ПараметрыРегистрации.Вставить("Назначение", Назначение);

    // Формируем таблицу команд
    Команды = ПолучитьТаблицуКоманд();

    НоваяКоманда = Команды.Добавить();
    НоваяКоманда.Представление = "Накладная (внешняя)";
    НоваяКоманда.Идентификатор = "ПечатьНакладной";
    НоваяКоманда.Использование = "ВызовСерверногоМетода";
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    НоваяКоманда.Модификатор = "ПечатьMXL";

    ПараметрыРегистрации.Вставить("Команды", Команды);

    Возврат ПараметрыРегистрации;

КонецФункции

Функция ПолучитьТаблицуКоманд()

    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));

    Возврат Команды;

КонецФункции

Обратим внимание на важные детали в данном коде:

  1. Параметр Вид должен иметь строковое значение "ПечатнаяФорма", а не "ДополнительнаяОбработка".
  2. Массив Назначение должен содержать полные имена объектов метаданных в строковом виде (например, "Документ.ПоступлениеТоваровУслуг"). Если этот массив не заполнен или имена указаны некорректно, в форме элемента справочника поле состава назначения останется пустым и не будет сохраняться.
  3. Для команды со способом использования "ВызовСерверногоМетода" в модуле объекта обязательно должна быть объявлена экспортная процедура печати с сигнатурой Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт.

2. Наличие процедур подсистемы печати в форме и модуле документа

Если параметры регистрации сформированы верно, перейдем к проверке самой конфигурации. Команда не появится в выпадающем меню кнопки Печать автоматически, если форма документа не подключена к стандартным механизмам подсистемы Печать БСП.

Проанализируем модуль управляемой формы документа. В обработчике события ПриСозданииНаСервере обязательно должен присутствовать код интеграции с общим модулем управления печатью:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // СтандартныеПодсистемы.Печать
    УправлениеПечатью.ПриСозданииНаСервере(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.Печать

КонецПроцедуры

В нетиповых конфигурациях или устаревших версиях БСП данный вызов может отсутствовать. Если модулей УправлениеПечатью или СтандартныеПодсистемы в конфигурации нет вовсе, подсистема динамического формирования команд печати не функционирует, и внешняя печатная форма штатным способом в меню документа не отобразится.

3. Проверка определяемых типов конфигурации

Разберем ситуацию, когда подсистема печати присутствует, но для конкретного документа команды не генерируются. В БСП состав объектов, поддерживающих внешние обработки и печать, строго ограничен определяемыми типами в дереве метаданных конфигурации.

Откроем конфигуратор и проверим следующие объекты метаданных:

  1. Определяемый тип ОбъектСДополнительнымиКомандами — целевой документ обязательно должен входить в состав типов этого объекта.
  2. Определяемый тип ВладелецДополнительныхОбработок — в зависимости от версии подсистемы БСП данный тип определяет объекты, для которых разрешено хранение и применение внешних обработок.

Если нужного документа нет в составе указанных определяемых типов, конфигурация на уровне проверок метаданных не позволит привязать внешнюю обработку к документу и заблокирует сохранение назначения в пользовательском режиме.

4. Предупреждение о безопасности и безопасный режим

Рассмотрим вопрос работы с безопасным режимом. Строка ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); сообщает системе лишь о том, что обработке для работы требуются расширенные привилегии (например, доступ к файловой системе, COM-объектам или внешним соединениям). Однако платформа не снимает ограничения безопасности автоматически.

При записи элемента в справочнике Дополнительные отчеты и обработки система выдает диалоговое предупреждение администратору. Разрешение на выполнение в небезопасном режиме подтверждается вручную при регистрации обработки в информационной базе (по соответствующей гиперссылке или кнопке подтверждения прав в карточке обработки). Если подтверждение не выполнено, загрузка или выполнение команд могут блокироваться политиками безопасности.

5. Альтернативные варианты подключения при отсутствии БСП

Если конфигурация сильно кастомизирована или подсистема дополнительных обработок в ней отсутствует, рассмотрим обходные пути вывода печатной формы:

  1. Использование расширения конфигурации: создадим расширение, заимствуем форму документа и добавим команду печати через расширение (используя аннотацию &После("ПриСозданииНаСервере") или добавив команду непосредственно в элементы формы без снятия основной конфигурации с поддержки).
  2. Программное подключение внешней обработки: при необходимости открытия внешней обработки из интерфейса можно использовать метод менеджера внешних обработок:
    
    // Пример программного подключения файла внешней обработки на сервере
    ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);
    ВнешнийОбъект = ВнешниеОбработки.Создать(ИмяОбработки);
    ВнешнийОбъект.СсылкаНаОбъект = СсылкаНаДокумент;
    ТабличныйДокумент = ВнешнийОбъект.СформироватьПечатнуюФорму();
    

После внесения любых изменений в регистрационные данные обработки в справочнике Дополнительные отчеты и обработки обязательно перезапустим текущий сеанс «1С:Предприятия», чтобы обновить кэшированные структуры команд интерфейса.

← На главную