При разработке в среде 1С программисты часто сталкиваются с необходимостью обращения к макетам. Если для объектов, встроенных в конфигурацию, путь к макету жестко определен (например, ОбщийМакет.ИмяМакета или Отчет.ИмяОтчета.Макет.ИмяМакета), то с внешними отчетами и обработками ситуация обстоит иначе. Внешний файл не является частью статического дерева метаданных конфигурации, а значит, прямого «вечного» пути к нему не существует.
В этой статье мы подробно разберем, как правильно обращаться к макетам внешних объектов, как сформировать строку пути для функций управления печатью и какие особенности накладывает использование Библиотеки стандартных подсистем (БСП).
Прежде всего, важно различать две задачи. Первая — получить сам объект макета (например, ТабличныйДокумент) для вывода на экран. Вторая — получить строковый путь к этому макету, который часто требуется для передачи в типовые процедуры БСП, такие как УправлениеПечатью.МакетПечатнойФормы().
Если макет нужен внутри модуля самого отчета, достаточно стандартного метода. Рассмотрим простейший пример:
Макет = ПолучитьМакет("ПФ_MXL_РасчетныйЛисток");
// Теперь с переменной Макет можно работать как с ТабличнымДокументом
Однако, если мы пытаемся использовать внешний отчет в сложных механизмах печати, система ожидает строковую ссылку. Попытка прописать ее «в лоб», например "ВнешнийОтчет.МойОтчет.Макет.МойМакет", скорее всего, приведет к ошибке, так как имя ВнешнийОтчет.МойОтчет не зарегистрировано в метаданных конфигурации постоянно.
Проанализируем ситуацию, когда отчет уже запущен. В этом случае у объекта есть доступ к собственным метаданным. Самый надежный способ сформировать путь, который поймет система в рамках текущего сеанса, — это использование свойства ПолноеИмя().
Выясним, как сконструировать правильную строку пути. Для этого в коде модуля внешнего отчета можно использовать следующую конструкцию:
ПутьКМакету = ЭтотОбъект.Метаданные().ПолноеИмя() + ".Макет.ИмяВашегоМакета";
// Результат будет выглядеть примерно так: "ВнешнийОтчет.ИмяФайла.Макет.ИмяВашегоМакета"
Важный момент: если вы используете БСП и ваш отчет зарегистрирован в справочнике «Дополнительные отчеты и обработки», система при запуске присваивает ему уникальное внутреннее имя. Метод ПолноеИмя() вернет именно актуальное на данный момент имя, что позволит избежать ошибок при поиске объекта в оперативной памяти.
Рассмотрим ситуацию, когда вы подключаете внешний отчет программно из кода другой обработки. В этом случае система возвращает имя, под которым отчет был зарегистрирован в сеансе. Посмотрим на пример кода:
ИмяВнешнегоОтчета = ВнешниеОтчеты.Подключить(ПутьКФайлуНаДиске, "УникальноеИмяОтчета", Ложь);
ПолныйПутьКМакету = "ВнешнийОтчет." + ИмяВнешнегоОтчета + ".Макет.ИмяМакета";
Такой подход позволяет передавать путь к макету в любые общие модули, которые умеют работать с объектами через менеджеры ВнешниеОтчеты или ВнешниеОбработки.
Проанализируем альтернативный и зачастую более стабильный вариант. Если ваша цель — передать макет с сервера на клиент или в общую функцию, которая не умеет работать с «путями» внешних отчетов, используйте временное хранилище. Это избавляет от необходимости вычислять строковые пути и гарантирует передачу данных макета в неизменном виде.
Выполним следующие шаги:
// В модуле отчета или обработки
МакетОбъект = ЭтотОбъект.ПолучитьМакет("ИмяМакета");
АдресХранилища = ПоместитьВоВременноеХранилище(МакетОбъект, УникальныйИдентификатор);
// Теперь АдресХранилища можно передать в параметры печати
Многие разработчики пытаются вставить внешний отчет в соответствие МакетыВариантовОтчетов, которое используется в типовых конфигурациях (например, ЗУП 3.1 или ERP). Рассмотрим пример, когда в коде встречается подобная структура:
МакетыВариантовОтчетов.Вставить("Отчет.РасчетныйЛисток.Вариант1", "ОбщийМакет.ПФ_MXL_РасчетныйЛисток");
Если вы хотите подставить сюда макет из внешнего отчета, простая строка не сработает. В таких случаях рекомендуется переопределять процедуру печати в модуле внешнего отчета так, чтобы она не искала макет по пути в конфигурации, а вызывала ЭтотОбъект.ПолучитьМакет().
Как показала практика обсуждений, наиболее правильным и универсальным решением для внешнего объекта остается связка метаданных и имени макета:
СтрокаПути = Строка(ЭтотОбъект.Метаданные().ПолноеИмя()) + ".Макет." + "ИмяВашегоМакета";
Подводя итог, отметим: статического пути для внешнего отчета в 1С не существует. Путь всегда формируется динамически в момент выполнения кода. Если вам нужно просто вывести форму — используйте ПолучитьМакет(). Если же вы интегрируетесь в сложные механизмы БСП, требующие строковый адрес, формируйте его через ЭтотОбъект.Метаданные().ПолноеИмя(). Это гарантирует, что система найдет макет именно в том экземпляре внешнего отчета, который запущен в данный момент, независимо от того, открыт он как файл или загружен из справочника дополнительных обработок.