Разработка и Конфигурация · 11 мин
Как получить макет внешней печатной формы в 1С
Как получить макет внешней печатной формы в 1С: ПолучитьМакет, код для epf и встроенных форм, типичные ошибки и проверка результата.
Макет внешней печатной формы в 1С — это табличный документ (или офисный документ Word/Excel), который хранится внутри файла обработки .epf и используется при выводе печатной формы на экран или принтер. Получить его можно программно через метод ПолучитьМакет(), причём синтаксис зависит от того, где выполняется код: внутри самой внешней обработки или в основной конфигурации.
Ошибки при обращении к макету — одна из самых частых причин сообщения «Макет не найден» при формировании печатной формы. Причина обычно проста: неверное имя макета, попытка вызвать ПолучитьМакет() из общего модуля без контекста обработки или отсутствие макета в составе обработки после её редактирования.
Ниже разобраны рабочие способы получения макета: внутри внешней обработки, из модуля конфигурации, для подключаемых форм по БСП, а также проверка результата и типовые ошибки.
Где хранится макет внешней печатной формы
Внешняя печатная форма — это файл с расширением .epf (внешняя обработка), внутри которого, помимо кода, содержатся макеты. Увидеть их можно, открыв обработку в конфигураторе: Файл → Открыть, выбрать файл .epf, затем в дереве объекта раскрыть ветку «Макеты».
Макет может быть одного из типов: табличный документ (самый распространённый), макет оформления компоновки данных, двоичные данные (например, шаблон Word в формате .docx для офисных печатных форм), ActiveDocument и другие. Тип макета определяет, что вернёт ПолучитьМакет(): объект «ТабличныйДокумент», «ДвоичныеДанные» и т.д.
Важно понимать: макет живёт внутри файла обработки, а не в информационной базе. Поэтому после обновления файла .epf макет нужно переподключать или обновлять в справочнике «Дополнительные отчеты и обработки», иначе будет использоваться старая версия.
Получение макета внутри модуля внешней обработки
Если код формирования печатной формы находится в модуле объекта самой внешней обработки (стандартная ситуация для внешних печатных форм), макет получается одной строкой:
Функция ПолучитьТабличныйДокумент(СсылкаНаДокумент) Экспорт
Макет = ЭтотОбъект.ПолучитьМакет("МакетСчета");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;
ТабДок.Вывести(ОбластьШапка);
Возврат ТабДок;
КонецФункции
Здесь ЭтотОбъект — это сама внешняя обработка, а ПолучитьМакет("МакетСчета") обращается к макету по его имени в дереве метаданных обработки. Имя чувствительно к точности написания: «МакетСчета» и «Макет_Счета» — разные макеты.
Если макет — двоичные данные (шаблон Word), метод вернёт двоичные данные, которые нужно сохранить во временный файл и открыть через COM-объект Word либо через механизм офисных печатных форм БСП.
Макет = ЭтотОбъект.ПолучитьМакет("МакетСчета");Получение макета из модуля конфигурации
Когда код выполняется в общем модуле или модуле менеджера документа, прямого доступа к макету внешней обработки нет — сначала нужно получить объект обработки. Для обработки, хранящейся в файле, используется метод ВнешниеОбработки.Создать():
ОбработкаОбъект = ВнешниеОбработки.Создать("C:\ПечатныеФормы\Счет.epf", Ложь);
Макет = ОбработкаОбъект.ПолучитьМакет("МакетСчета");
Второй параметр (Ложь) отключает безопасный режим. В безопасном режиме обращение к макету может быть ограничено в зависимости от настроек, поэтому для печатных форм, которым нужен доступ к данным, режим указывают явно. Учитывайте: отключение безопасного режима требует права «Интерактивное открытие внешних обработок» и должно применяться только к проверенным файлам.
Если обработка подключена через справочник «Дополнительные отчеты и обработки» (БСП), путь к файлу заранее неизвестен — обработка хранится в базе. В этом случае объект создаётся через метод БСП ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаЭлементСправочника), после чего макет получается тем же ПолучитьМакет().
Макет в внешней печатной форме по механизму БСП
В конфигурациях на Библиотеке стандартных подсистем (УТ, ERP, БП, ЗУП) внешняя печатная форма обязана экспортировать функцию СведенияОВнешнейОбработке() и процедуру Печать(...). Макет при этом получается внутри процедуры печати стандартным способом — через ЭтотОбъект.ПолучитьМакет(), потому что процедура выполняется в контексте объекта обработки.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетНаОплату") Тогда
Макет = ЭтотОбъект.ПолучитьМакет("МакетСчета");
ТабДок = Новый ТабличныйДокумент;
// ... заполнение областей ...
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм, "СчетНаОплату", "Счет на оплату", ТабДок);
КонецЕсли;
КонецПроцедуры
Ключевой момент: идентификатор макета в КоллекцияПечатныхФорм (например, «СчетНаОплату») должен совпадать с идентификатором, заявленным в СведенияОВнешнейОбработке(). Имя же самого макета в дереве обработки может быть любым — оно используется только в строке ПолучитьМакет().
Пошаговая проверка и отладка
Если печатная форма не формируется или выходит пустой, проверяйте цепочку от макета до результата последовательно. Ниже — порядок действий, который закрывает большинство причин.
- 1Откройте файл .epf в конфигураторе и убедитесь, что макет с нужным именем существует в ветке «Макеты»
- 2Проверьте, что имя в ПолучитьМакет() символ в символ совпадает с именем макета в дереве
- 3Убедитесь, что код вызывается в контексте объекта обработки (ЭтотОбъект), а не из общего модуля без создания объекта
- 4Поставьте точку останова на строке ПолучитьМакет() и проверьте в отладчике, что вернулся объект нужного типа
- 5Проверьте, что области макета (Шапка, Строка, Подвал) существуют и заполняются параметры
- 6Сформируйте печатную форму из интерфейса и убедитесь, что табличный документ добавлен в коллекцию печатных форм
Полезный приём при отладке — вывести тип возвращаемого значения:
Макет = ЭтотОбъект.ПолучитьМакет("МакетСчета");
Сообщить(ТипЗнч(Макет)); // должно быть «ТабличныйДокумент»
Если вместо макета возникает исключение «Макет не найден», проблема почти всегда в имени или в том, что файл .epf был пересохранён без макета (например, после выгрузки/загрузки через файлы конфигуратора).
Как проверить результат
ТабличныйДокумент (или ДвоичныеДанные для docx)
Исключение «Макет не найден» или Неопределено
ПолучитьОбласть("Шапка") возвращает область без ошибки
Ошибка «Область не найдена»
Форма выводится с заполненными параметрами
Пустой документ или форма без данных
Типичные ошибки при получении макета
Отдельная группа проблем связана с правами: у пользователя может не быть права на интерактивное открытие внешних обработок или на выполнение в небезопасном режиме. В этом случае печатная форма молча не формируется либо выдаёт ошибку доступа — проверяйте роли пользователя и журнал регистрации.
Альтернативы: когда макет лучше хранить иначе
Хранение макета внутри .epf — стандартный, но не единственный вариант. Если макет должен редактироваться пользователями без конфигуратора, его можно хранить в базе: в справочнике «Пользовательские макеты печати» (БСП) или в присоединённом файле. Тогда внешняя обработка получает макет не методом ПолучитьМакет(), а чтением данных из базы.
Сравнение вариантов
Стандартный путь: простая разработка и перенос файла. Минус — редактировать макет может только разработчик в конфигураторе
Пользователь правит макет прямо в режиме предприятия. Подходит, если форму часто корректируют под требования контрагентов, но требует поддержки механизма в обработке
Удобен для сложных договоров с форматированием. Ограничение — требуется механизм офисной печати и установленный Office либо серверная обработка
Выбор зависит от того, кто будет поддерживать макет после внедрения. Если изменения редкие и их делает разработчик — оставляйте макет в обработке. Если бухгалтерия регулярно меняет формулировки и реквизиты — выносите макет в пользовательские.
Что важно запомнить
Макет внешней печатной формы получается методом ПолучитьМакет("ИмяМакета") в контексте объекта обработки; из конфигурации объект сначала создают через ВнешниеОбработки.Создать() или функцию БСП. Имя макета, идентификатор печатной формы и безопасный режим — три точки, где возникают почти все ошибки.
Частые вопросы
Как узнать, какие макеты есть во внешней обработке?
Откройте файл .epf в конфигураторе через «Файл → Открыть» и раскройте ветку «Макеты» в дереве объекта. Там видны имена и типы всех макетов. Программно список макетов получить из режима предприятия нельзя — только через метаданные в конфигураторе.
Почему возникает ошибка «Макет не найден», хотя макет есть?
Чаще всего имя в ПолучитьМакет() отличается от имени в дереве метаданных (лишний пробел, другой регистр не критичен, но разный набор символов — да). Вторая причина — в базе подключена старая версия файла .epf, где этого макета ещё не было: перезагрузите обработку в справочнике дополнительных обработок.
Можно ли получить макет внешней обработки на сервере?
Да, если файл доступен с сервера 1С и вызов выполняется в серверном контексте: ВнешниеОбработки.Создать() с путём на сервере, затем ПолучитьМакет(). Для обработок из справочника БСП используйте ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки() — он работает на сервере.
Чем отличается ПолучитьМакет() от ПолучитьОбщийМакет()?
ПолучитьМакет() обращается к макету конкретного объекта (обработки, документа, справочника), а ПолучитьОбщийМакет() — к общим макетам конфигурации. Во внешней обработке общих макетов нет, поэтому используется только первый вариант.
Как получить макет в формате Word из внешней печатной формы?
Добавьте в обработку макет типа «Двоичные данные» и загрузите в него файл .docx. ЭтотОбъект.ПолучитьМакет() вернёт двоичные данные, которые сохраняются во временный файл методом Записать() и далее обрабатываются механизмом офисных печатных форм БСП или COM-объектом Word.
Нужно ли отключать безопасный режим для получения макета?
Само по себе получение макета обычно работает и в безопасном режиме, но печатной форме почти всегда нужен доступ к данным документов и запросам, поэтому при создании объекта через ВнешниеОбработки.Создать() безопасный режим указывают явно. Делайте это только для доверенных обработок.