В процессе разработки печатных форм в платформе 1С:Предприятие 7.7 часто возникает необходимость переиспользовать макет (таблицу), созданный внутри другого документа. Например, когда печатная форма нового документа полностью или частично дублирует печатную форму существующего объекта конфигурации.
Посмотрим, как работает метод ИсходнаяТаблица() в штатном режиме, почему нельзя напрямую обратиться к макету другого документа и какие существуют способы решения этой задачи — от стандартных архитектурных подходов до использования внешних библиотек.
Разберем, как платформа 1С 7.7 ищет макет таблицы при вызове метода ИсходнаяТаблица(ИмяТаблицы). Согласно документации, поиск выполняется строго по следующему алгоритму:
.mxl), платформа загружает макет из внешнего файла.Прямой доступ к внутренним макетам таблиц других документов конфигурации штатными средствами языка 1С 7.7 не предусмотрен. Рассмотрим три практических способа обойти это ограничение.
Самым безопасным, простым и архитектурно правильным решением является перенос макета из конкретного документа в раздел конфигурации Общие таблицы.
Проанализируем преимущества этого подхода:
Таб = СоздатьОбъект("Таблица");
// Поиск сначала пройдет в форме документа, затем найдет макет в Общих таблицах
Таб.ИсходнаяТаблица("МояОбщаяПечатнаяФорма");
Таб.ВывестиСекцию("Шапка");
Таб.Показать();
Если изменять дерево конфигурации или добавлять общую таблицу нежелательно (например, чтобы не усложнять поддержку типовой конфигурации), можно хранить макет во внешнем файле печатной формы формата .mxl.
Разберем алгоритм работы с внешним макетом:
ИсходнаяТаблица() вместо имени таблицы передаем полный путь к файлу .mxl.
// Формируем путь к файлу макета
ПутьКМакету = КаталогИБ() + "ExtForms\PrnForms\МойМакет.mxl";
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица(ПутьКМакету);
Таб.ВывестиСекцию("Шапка");
Таб.Показать();
При необходимости файл макета можно программно создавать или выгружать во временную директорию КаталогПользователя() непосредственно перед печатью и удалять после формирования документа.
Если в вашем проекте уже используется популярный внешний компонент FormEx, вы можете задействовать его расширенные возможности. FormEx модифицирует метод ИсходнаяТаблица(), добавляя в него второй параметр — путь к форме объекта-источника.
Синтаксис вызова метода в FormEx выглядит следующим образом:
ИсходнаяТаблица(ИмяТаблицы, ПутьКФорме)
Для обращения к макету встроенного документа конфигурации путь указывается в специальном формате: "MD.Документ.<ИмяДокумента>.Форма".
Рассмотрим пример кода:
// Загружаем внешнюю библиотеку FormEx, если она не была загружена ранее
ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Таб = СоздатьОбъект("Таблица");
// Обращаемся к макету "Таблица1", находящемуся в форме документа "Документ1"
Таб.ИсходнаяТаблица("Таблица1", "MD.Документ.Документ1.Форма");
Таб.ВывестиСекцию("Шапка");
Таб.Показать();
Полезный совет: Чтобы программно получить точные внутренние пути к формам метаданных, в FormEx можно воспользоваться методом Сервис.СписокВсехФорм().
При использовании макета из другого документа или из общих таблиц необходимо учитывать фундаментальную особенность платформы 1С 7.7.
Все выражения, прописанные в ячейках таблицы со типом «Выражение», вычисляются в контексте того модуля, который вызывает метод ВывестиСекцию().
Проанализируем возможную проблему:
Если в исходном макете Документа1 ячейка содержит выражение ТекущийДокумент().Контрагент или вызов локальной функции ПечататьРеквизиты(), то при выводе этого макета из модуля Документа2 возникнет ошибка исполнения. Платформа не найдет указанные переменные или функции в контексте Документа2 и остановит выполнение программы.
Как избежать ошибок при переиспользовании макетов:
ПечКонтрагент, ПечСумма, ПечИтого).ВывестиСекцию().