Как программно получить макет печатной формы из другого справочника или документа в 1С?

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

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

Использование менеджера объекта для получения макета

Самый прямой и эффективный способ получить макет, принадлежащий конкретному объекту метаданных (справочнику, документу, обработке), — это использование метода ПолучитьМакет() менеджера этого объекта. Важно понимать, что менеджеры объектов доступны из любой точки кода конфигурации (в соответствующем контексте), что позволяет нам «дотянуться» до макета любого справочника из любого документа.

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


// Получаем макет из справочника "Контрагенты"
Макет = Справочники.Контрагенты.ПолучитьМакет("СогласиеНаОбработкуДанных");

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

Аналогично мы можем обратиться к макетам документов. Проанализируем синтаксис:

Документы.ИмяДокумента.ПолучитьМакет("ИмяМакета")

Этот метод возвращает объект того типа, который задан для макета в конфигураторе (чаще всего это ТабличныйДокумент, но может быть и ДвоичныеДанные или ActiveDocument).

Важность контекста выполнения: Сервер против Клиента

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

Рассмотрим правильную структуру вызова печати из формы документа:


&НаКлиенте
Процедура ПечатьСогласия(Команда)
    // Вызываем серверную функцию для формирования печатной формы
    ТабДок = СформироватьПечатнуюФормуНаСервере();
    ТабДок.Показать("Печать согласия");
КонецПроцедуры

&НаСервереБезКонтекста
Функция СформироватьПечатнуюФормуНаСервере()
    // Обращаемся к менеджеру справочника за макетом
    Макет = Справочники.Контрагенты.ПолучитьМакет("СогласиеНаОбработкуДанных");
    
    ТабДок = Новый ТабличныйДокумент;
    // Здесь происходит заполнение параметров макета
    // ...
    Возврат ТабДок;
КонецФункции

Различие между менеджером объекта и метаданными

В ходе обсуждения на форуме возник вопрос: можно ли получить макет через объект Метаданные? Выясним причину, почему это не совсем удобно. Коллекция Метаданные.Справочники.Контрагенты.Макеты содержит описание структуры макетов (их имена, синонимы), но не сами данные макета, готовые к печати. Для получения «живого» объекта макета, с которым можно работать программно, следует использовать именно метод ПолучитьМакет() менеджера объекта.

Альтернативный подход: Общие макеты

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

Для обращения к общему макету используется метод:

ПолучитьОбщийМакет("ИмяОбщегоМакета")

Это делает код более чистым и понятным, так как программисту не нужно вспоминать, к какому именно справочнику «привязана» общая форма.

Современные стандарты: Библиотека стандартных подсистем (БСП)

В современных конфигурациях (таких как УТ 11, БП 3.0, ERP) прямое обращение к макетам используется всё реже. Разберем, почему используется подсистема «Печать»:

  1. Гибкость: Пользователь может отредактировать макет в режиме «1С:Предприятие» без изменения конфигурации. Программа автоматически проверит наличие «Пользовательского макета» и использует его вместо программного.
  2. Унификация: Все печатные формы регистрируются в одном месте, что упрощает управление правами доступа и внешними печатными формами.

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

Резюме

Выясним основные правила работы с макетами:

Таким образом, задача получения макета из другого справочника решается одной строкой кода, но требует понимания контекста выполнения (Сервер/Клиент) и архитектуры вашей конфигурации.

← На главную