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