Как исправить ошибку «Поле объекта не обнаружено (ПодменюПечать)» и настроить печать через расширение в 1С?

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

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

Причины возникновения ошибок

Проанализируем две основные проблемы, с которыми сталкивается разработчик при вызове процедур печати БСП:

  1. Ошибка «Поле объекта не обнаружено (ПодменюПечать)»: процедура УправлениеПечатью.ПриСозданииНаСервере в БСП версий до 2.4 вторым параметром ожидает ссылку на существующий элемент формы — группу командной панели, куда будут помещены сгенерированные кнопки команд печати. Если форма была заимствована в расширение без создания этой группы или имя элемента не совпадает, платформа генерирует исключение.
  2. Ошибка «Расширение модуля запрещено из-за того, что расширение подключено в безопасном режиме»: при включенном безопасном режиме расширения платформа накладывает жесткие ограничения на перехват серверных методов (аннотации &Перед, &После, &Вместо) для заимствованных объектов, блокируя выполнение процедур.

Шаг 1. Отключение безопасного режима расширения

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

  1. В конфигураторе откроем список расширений (меню Конфигурация — Расширения конфигурации).
  2. Найдем нужное расширение и снимем флаг Безопасный режим (а также флаг Защита от опасных действий при необходимости).
  3. Если расширение подключено в режиме «1С:Предприятие» через типовой справочник дополнительных отчетов и обработок, снимем соответствующий флаг в карточке расширения внутри пользовательского интерфейса.
  4. Обязательно перезапустим сеанс информационной базы, чтобы изменения прав и режимов вступили в силу на стороне сервера.

Шаг 2. Создание группы «ПодменюПечать» в структуре формы

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

Способ 1. Добавление элемента в редакторе формы

  1. Откроем заимствованную форму в расширении.
  2. В дереве элементов формы найдем командную панель (например, ФормаКоманднаяПанель или основную командную панель формы).
  3. Добавим новый элемент с типом Группа формы.
  4. В палитре свойств укажем:
    — Имя: ПодменюПечать (строго без пробелов);
    — Вид: Подменю (или Группа кнопок);
    — Заголовок: Печать.

Способ 2. Программное создание элемента на сервере

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


&НаСервере
&После("ПриСозданииНаСервере")
Процедура ПечОбработкаФормДокПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие элемента, если его нет — создаем программно
    Если Элементы.Найти("ПодменюПечать") = Неопределено Тогда
        Подменю = Элементы.Добавить("ПодменюПечать", Тип("ГруппаФормы"), Элементы.КоманднаяПанельФормы);
        Подменю.Вид = ВидГруппыФормы.Подменю;
        Подменю.Заголовок = "Печать";
    КонецЕсли;
    
    УправлениеПечатью.ПриСозданииНаСервере(ЭтотОбъект, Элементы.ПодменюПечать);
    
КонецПроцедуры

Шаг 3. Обработка команд печати на клиенте и сервере

Посмотрим на полный код подключения команд в модуле формы и модуле менеджера объекта обработки.

В модуле формы расширения объявляем клиентский обработчик вызова команды:


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

В модуле менеджера заимствованной обработки расширения определяем состав команд и саму процедуру формирования печатного документа:


// Добавление команд печати в общее подменю
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ПечатьНазначения";
    КомандаПечати.Представление = НСтр("ru = 'Печать назначения'");
    КомандаПечати.Обработчик = "УправлениеПечатьюКлиент.ВыполнитьКомандуПечати";
    КомандаПечати.Порядок = 10;
    
КонецПроцедуры

// Формирование печатной формы
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Формирование и вывод табличного документа в коллекцию
    
КонецПроцедуры

Шаг 4. Особенности для современных версий БСП (2.4 и выше)

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

  1. На сервере вызывается: ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
  2. На клиенте обработчик команды перенаправляет вызов в модуль:
    
    &НаКлиенте
    Процедура Подключаемый_ВыполнитьКоманду(Команда)
        ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);
    КонецПроцедуры
    

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

← На главную