Как получить макет таблицы из другого документа в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе разработки печатных форм в платформе 1С:Предприятие 7.7 часто возникает необходимость переиспользовать макет (таблицу), созданный внутри другого документа. Например, когда печатная форма нового документа полностью или частично дублирует печатную форму существующего объекта конфигурации.

Посмотрим, как работает метод ИсходнаяТаблица() в штатном режиме, почему нельзя напрямую обратиться к макету другого документа и какие существуют способы решения этой задачи — от стандартных архитектурных подходов до использования внешних библиотек.

Штатный порядок поиска макетов платформой 1С 7.7

Разберем, как платформа 1С 7.7 ищет макет таблицы при вызове метода ИсходнаяТаблица(ИмяТаблицы). Согласно документации, поиск выполняется строго по следующему алгоритму:

  1. Платформа ищет макет с указанным именем в текущей форме объекта, из которого вызывается код.
  2. Если макет в форме не найден, поиск выполняется в ветке Общие таблицы дерева конфигурации.
  3. Если вместо имени макета передан путь к файлу на диске (с расширением .mxl), платформа загружает макет из внешнего файла.

Прямой доступ к внутренним макетам таблиц других документов конфигурации штатными средствами языка 1С 7.7 не предусмотрен. Рассмотрим три практических способа обойти это ограничение.

Способ 1. Перенос макета в «Общие таблицы» (Рекомендуемый стандарт)

Самым безопасным, простым и архитектурно правильным решением является перенос макета из конкретного документа в раздел конфигурации Общие таблицы.

Проанализируем преимущества этого подхода:

  1. Универсальность: макет становится доступен абсолютно из любого модуля базы данных (документов, справочников, отчетов и обработок).
  2. Безопасность: штатный механизм платформы работает без применения сторонних компонентов и нестандартных хаков.
  3. Простота вызова: в коде модуля любого документа достаточно вызвать метод с именем общей таблицы:

Таб = СоздатьОбъект("Таблица");
// Поиск сначала пройдет в форме документа, затем найдет макет в Общих таблицах
Таб.ИсходнаяТаблица("МояОбщаяПечатнаяФорма");
Таб.ВывестиСекцию("Шапка");
Таб.Показать();

Способ 2. Использование внешнего файла макета (.mxl)

Если изменять дерево конфигурации или добавлять общую таблицу нежелательно (например, чтобы не усложнять поддержку типовой конфигурации), можно хранить макет во внешнем файле печатной формы формата .mxl.

Разберем алгоритм работы с внешним макетом:

  1. Сохраняем таблицу документа в отдельный файл на диске (например, в каталог ИБ или каталог пользователя).
  2. В методе ИсходнаяТаблица() вместо имени таблицы передаем полный путь к файлу .mxl.

// Формируем путь к файлу макета
ПутьКМакету = КаталогИБ() + "ExtForms\PrnForms\МойМакет.mxl";

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица(ПутьКМакету);
Таб.ВывестиСекцию("Шапка");
Таб.Показать();

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

Способ 3. Использование внешнего компонента FormEx

Если в вашем проекте уже используется популярный внешний компонент FormEx, вы можете задействовать его расширенные возможности. FormEx модифицирует метод ИсходнаяТаблица(), добавляя в него второй параметр — путь к форме объекта-источника.

Синтаксис вызова метода в FormEx выглядит следующим образом:

ИсходнаяТаблица(ИмяТаблицы, ПутьКФорме)

Для обращения к макету встроенного документа конфигурации путь указывается в специальном формате: "MD.Документ.<ИмяДокумента>.Форма".

Рассмотрим пример кода:


// Загружаем внешнюю библиотеку FormEx, если она не была загружена ранее
ЗагрузитьВнешнююКомпоненту("FormEx.dll");

Таб = СоздатьОбъект("Таблица");

// Обращаемся к макету "Таблица1", находящемуся в форме документа "Документ1"
Таб.ИсходнаяТаблица("Таблица1", "MD.Документ.Документ1.Форма");

Таб.ВывестиСекцию("Шапка");
Таб.Показать();

Полезный совет: Чтобы программно получить точные внутренние пути к формам метаданных, в FormEx можно воспользоваться методом Сервис.СписокВсехФорм().

Важная особенность: контекст вычисления ячеек

При использовании макета из другого документа или из общих таблиц необходимо учитывать фундаментальную особенность платформы 1С 7.7.

Все выражения, прописанные в ячейках таблицы со типом «Выражение», вычисляются в контексте того модуля, который вызывает метод ВывестиСекцию().

Проанализируем возможную проблему:

Если в исходном макете Документа1 ячейка содержит выражение ТекущийДокумент().Контрагент или вызов локальной функции ПечататьРеквизиты(), то при выводе этого макета из модуля Документа2 возникнет ошибка исполнения. Платформа не найдет указанные переменные или функции в контексте Документа2 и остановит выполнение программы.

Как избежать ошибок при переиспользовании макетов:

  1. Используйте в ячейках макета универсальные имена переменных (например, ПечКонтрагент, ПечСумма, ПечИтого).
  2. Объявляйте и заполняйте эти переменные в модуле того документа, из которого выводите печатную форму, непосредственно перед вызовом ВывестиСекцию().
  3. Если в макете выдерживается обращение к экспортным функциям, размещайте их в глобальном модуле конфигурации.
← На главную