К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить макет внешней печатной формы в 1С

Как получить макет внешней печатной формы в 1С: ПолучитьМакет, код для epf и встроенных форм, типичные ошибки и проверка результата.

Макет внешней печатной формы в 1С — это табличный документ (или офисный документ Word/Excel), который хранится внутри файла обработки .epf и используется при выводе печатной формы на экран или принтер. Получить его можно программно через метод ПолучитьМакет(), причём синтаксис зависит от того, где выполняется код: внутри самой внешней обработки или в основной конфигурации.

Ошибки при обращении к макету — одна из самых частых причин сообщения «Макет не найден» при формировании печатной формы. Причина обычно проста: неверное имя макета, попытка вызвать ПолучитьМакет() из общего модуля без контекста обработки или отсутствие макета в составе обработки после её редактирования.

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

Где хранится макет внешней печатной формы

Внешняя печатная форма — это файл с расширением .epf (внешняя обработка), внутри которого, помимо кода, содержатся макеты. Увидеть их можно, открыв обработку в конфигураторе: Файл → Открыть, выбрать файл .epf, затем в дереве объекта раскрыть ветку «Макеты».

Макет может быть одного из типов: табличный документ (самый распространённый), макет оформления компоновки данных, двоичные данные (например, шаблон Word в формате .docx для офисных печатных форм), ActiveDocument и другие. Тип макета определяет, что вернёт ПолучитьМакет(): объект «ТабличныйДокумент», «ДвоичныеДанные» и т.д.

Важно понимать: макет живёт внутри файла обработки, а не в информационной базе. Поэтому после обновления файла .epf макет нужно переподключать или обновлять в справочнике «Дополнительные отчеты и обработки», иначе будет использоваться старая версия.

Получение макета внутри модуля внешней обработки

Если код формирования печатной формы находится в модуле объекта самой внешней обработки (стандартная ситуация для внешних печатных форм), макет получается одной строкой:

Функция ПолучитьТабличныйДокумент(СсылкаНаДокумент) Экспорт

Макет = ЭтотОбъект.ПолучитьМакет("МакетСчета");

ТабДок = Новый ТабличныйДокумент;

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;

ТабДок.Вывести(ОбластьШапка);

Возврат ТабДок;

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

Здесь ЭтотОбъект — это сама внешняя обработка, а ПолучитьМакет("МакетСчета") обращается к макету по его имени в дереве метаданных обработки. Имя чувствительно к точности написания: «МакетСчета» и «Макет_Счета» — разные макеты.

Если макет — двоичные данные (шаблон Word), метод вернёт двоичные данные, которые нужно сохранить во временный файл и открыть через COM-объект Word либо через механизм офисных печатных форм БСП.

1c
Макет = ЭтотОбъект.ПолучитьМакет("МакетСчета");

Получение макета из модуля конфигурации

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

ОбработкаОбъект = ВнешниеОбработки.Создать("C:\ПечатныеФормы\Счет.epf", Ложь);

Макет = ОбработкаОбъект.ПолучитьМакет("МакетСчета");

Второй параметр (Ложь) отключает безопасный режим. В безопасном режиме обращение к макету может быть ограничено в зависимости от настроек, поэтому для печатных форм, которым нужен доступ к данным, режим указывают явно. Учитывайте: отключение безопасного режима требует права «Интерактивное открытие внешних обработок» и должно применяться только к проверенным файлам.

Если обработка подключена через справочник «Дополнительные отчеты и обработки» (БСП), путь к файлу заранее неизвестен — обработка хранится в базе. В этом случае объект создаётся через метод БСП ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаЭлементСправочника), после чего макет получается тем же ПолучитьМакет().

Макет в внешней печатной форме по механизму БСП

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

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

Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетНаОплату") Тогда

Макет = ЭтотОбъект.ПолучитьМакет("МакетСчета");

ТабДок = Новый ТабличныйДокумент;

// ... заполнение областей ...

УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(

КоллекцияПечатныхФорм, "СчетНаОплату", "Счет на оплату", ТабДок);

КонецЕсли;

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

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

Пошаговая проверка и отладка

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

Порядок действий
  1. 1
    Откройте файл .epf в конфигураторе и убедитесь, что макет с нужным именем существует в ветке «Макеты»
  2. 2
    Проверьте, что имя в ПолучитьМакет() символ в символ совпадает с именем макета в дереве
  3. 3
    Убедитесь, что код вызывается в контексте объекта обработки (ЭтотОбъект), а не из общего модуля без создания объекта
  4. 4
    Поставьте точку останова на строке ПолучитьМакет() и проверьте в отладчике, что вернулся объект нужного типа
  5. 5
    Проверьте, что области макета (Шапка, Строка, Подвал) существуют и заполняются параметры
  6. 6
    Сформируйте печатную форму из интерфейса и убедитесь, что табличный документ добавлен в коллекцию печатных форм

Полезный приём при отладке — вывести тип возвращаемого значения:

Макет = ЭтотОбъект.ПолучитьМакет("МакетСчета");

Сообщить(ТипЗнч(Макет)); // должно быть «ТабличныйДокумент»

Если вместо макета возникает исключение «Макет не найден», проблема почти всегда в имени или в том, что файл .epf был пересохранён без макета (например, после выгрузки/загрузки через файлы конфигуратора).

Контрольные точки

Как проверить результат

Тип возвращаемого значения
Норма

ТабличныйДокумент (или ДвоичныеДанные для docx)

Тревожный признак

Исключение «Макет не найден» или Неопределено

Имена областей
Норма

ПолучитьОбласть("Шапка") возвращает область без ошибки

Тревожный признак

Ошибка «Область не найдена»

Итоговая печать
Норма

Форма выводится с заполненными параметрами

Тревожный признак

Пустой документ или форма без данных

Типичные ошибки при получении макета

Типичные ошибки
01
Опечатка в имени макета — ПолучитьМакет() вызывает исключение «Макет не найден»; сверяйте имя копированием из дерева метаданных
02
Вызов ПолучитьМакет() из общего модуля — там нет контекста обработки, макет нужно получать через объект, созданный методом ВнешниеОбработки.Создать()
03
Обновление файла .epf без перезагрузки в справочник дополнительных обработок — база продолжает использовать старую версию с прежним макетом
04
Несовпадение идентификатора в СведенияОВнешнейОбработке и в КоллекцияПечатныхФорм — форма не появляется в списке печати или выводится пустой
05
Попытка вывести двоичный макет (docx) методами табличного документа — нужен отдельный механизм офисных печатных форм

Отдельная группа проблем связана с правами: у пользователя может не быть права на интерактивное открытие внешних обработок или на выполнение в небезопасном режиме. В этом случае печатная форма молча не формируется либо выдаёт ошибку доступа — проверяйте роли пользователя и журнал регистрации.

Альтернативы: когда макет лучше хранить иначе

Хранение макета внутри .epf — стандартный, но не единственный вариант. Если макет должен редактироваться пользователями без конфигуратора, его можно хранить в базе: в справочнике «Пользовательские макеты печати» (БСП) или в присоединённом файле. Тогда внешняя обработка получает макет не методом ПолучитьМакет(), а чтением данных из базы.

Сравнение вариантов

Макет внутри .epf

Стандартный путь: простая разработка и перенос файла. Минус — редактировать макет может только разработчик в конфигураторе

Пользовательский макет БСП

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

Шаблон Word (docx) в двоичных данных

Удобен для сложных договоров с форматированием. Ограничение — требуется механизм офисной печати и установленный Office либо серверная обработка

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

Итог

Что важно запомнить

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

Частые вопросы

Как узнать, какие макеты есть во внешней обработке?

Откройте файл .epf в конфигураторе через «Файл → Открыть» и раскройте ветку «Макеты» в дереве объекта. Там видны имена и типы всех макетов. Программно список макетов получить из режима предприятия нельзя — только через метаданные в конфигураторе.

Почему возникает ошибка «Макет не найден», хотя макет есть?

Чаще всего имя в ПолучитьМакет() отличается от имени в дереве метаданных (лишний пробел, другой регистр не критичен, но разный набор символов — да). Вторая причина — в базе подключена старая версия файла .epf, где этого макета ещё не было: перезагрузите обработку в справочнике дополнительных обработок.

Можно ли получить макет внешней обработки на сервере?

Да, если файл доступен с сервера 1С и вызов выполняется в серверном контексте: ВнешниеОбработки.Создать() с путём на сервере, затем ПолучитьМакет(). Для обработок из справочника БСП используйте ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки() — он работает на сервере.

Чем отличается ПолучитьМакет() от ПолучитьОбщийМакет()?

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

Как получить макет в формате Word из внешней печатной формы?

Добавьте в обработку макет типа «Двоичные данные» и загрузите в него файл .docx. ЭтотОбъект.ПолучитьМакет() вернёт двоичные данные, которые сохраняются во временный файл методом Записать() и далее обрабатываются механизмом офисных печатных форм БСП или COM-объектом Word.

Нужно ли отключать безопасный режим для получения макета?

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